屏幕坐标效果不受物体在空间位置的影响,
只受到物体本身和视口的影响,有时候可以做一些特殊效果
比如2D游戏平铺纹理,调试屏幕位置,屏幕特效等等
下面是根据官方例子修改的
http://docs.unity3d.com/Manual/SL-ShaderSemantics.html
Shader "Unlit/Show UVs"
{ Properties
{
[NoScaleOffset]_MainTex("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
struct v2f {
float2 uv : TEXCOORD0;
//out float4 outpos2 : SV_POSITION;
//float4 pos : SV_POSITION;
};
sampler2D _MainTex;
struct ccc {
float4 vertex : POSITION; // vertex position input
float2 uv : TEXCOORD0;// first texture coordinate input
};
v2f vert(ccc c,
out float4 outpos : SV_POSITION // clip space position output
)
{
v2f o;
//o.outpos2 = mul(UNITY_MATRIX_MVP, vertex);
outpos = mul(UNITY_MATRIX_MVP, c.vertex);
o.uv = c.uv;
return o;
}
然后是测试代码
可以通过改动红色代码看到效果
Shader "Unlit/Show UVs"
{ Properties
{
[NoScaleOffset]_MainTex("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
struct v2f {
float2 uv : TEXCOORD0;
//out float4 outpos2 : SV_POSITION;
//float4 pos : SV_POSITION;
};
sampler2D _MainTex;
struct ccc {
float4 vertex : POSITION; // vertex position input
float2 uv : TEXCOORD0;// first texture coordinate input
};
v2f vert(ccc c,
out float4 outpos : SV_POSITION // clip space position output
)
{
v2f o;
outpos = mul(UNITY_MATRIX_MVP, c.vertex);
o.uv = c.uv;
return o;
}
//screenPos.xy就是讲像素点0.5具象化
//每个格子相当于一个像素 这是其他博主的理解 我再次理解下就是说半像素问题0.5像素是半透明的
//整个不再边缘的像素才是原本设置的颜色
//像素坐标的类型是不同的,所以为了方便使用 UNITY_VPOS_TYPE 类型
fixed4 frag(v2f i,
UNITY_VPOS_TYPE screenPos : VPOS
) : SV_Target
{
//clip(checker);//停止渲染负值部分,0和正的会被渲染
fixed4 c = fixed4(screenPos.x-2, screenPos.y -2,0,0);
return c;
}
ENDCG
}
}
}
可以看到如上面设置的时候,在边缘可以看到半透明的红色和绿色的像素线,这个就是
screenPos.x 和 screenPos.y的具像化
其他地方是黄色因为其他地方的值超过了1也就是说绿色和红色都是1,所以加起来是黄色
如果你使用
fixed4 c = fixed4(screenPos.x-1 , screenPos.y-1,0,0);
会看到下面效果(注意这是放大了的结果)
发现有红色和绿色偏移了
但是通过取色,发现颜色并不准确,因为最边缘一个像素会被窗口边界上色(大概)
如果偏移2个像素就会发现中间的一行是正常的颜色
另外说下默认状态可能ps取色有色彩,需要改一下取色器的采样设置