今天在看Unity Shader入门精要这本书,照着书上打代码练习的时候出现了invalid output semantic 'SV_POSITION’这个报错。本文为这个报错的解决方法。
Shader "shaderStudy/SimpleShader"
{
Properties
{
//声明一个Color类型的属性
_Color ("Color Tint", Color) = (1.0, 1.0, 1.0, 1.0)
}
SubShader
{
Pass
{
CGPROGRAM
//告诉unity哪个函数包含了顶点着色器代码,哪个包含了偏远着色器的代码
#pragma vertex vert
#pragma fragment frag
//在Cg代码中,我们需要定义一个与属性名称和类型都匹配的变量
fixed4 _Color;
//a:application应用,2:to,v:vertex shader顶点着色器
struct a2v
{
//POSITION语义告诉unity,用模型空间的顶点坐标填充vertex变量
float4 vertex : POSITION;
//NORMAL语句告诉unity,用模型空间下的法线方向填充normal变量
float3 normal : NORMAL;
//TEXCOORD0语义告诉unity,用模型的第一套纹理坐标填充texcoord变量
float4 texcoord : TEXCOORD0;
};
struct v2f
{
//SV_POSITION语义告诉unity,pos里面包含了顶点在裁剪空间中的位置信息
float4 pos : SV_POSITION;
//COLOR0语义可以用于储存颜色信息
fixed3 color : COLOR0;
};
v2f vert(a2v v) : SV_POSITION
{
//声明输出结构
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//v.normal包含了顶点的法线方向,其分量范围在[-1.0, 1.0]
//下面的代码吧分量范围映射到了[0.0, 1.0]
//储存到o.color中传递给片元着色器
o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
return o;
}
fixed4 frag(v2f i) : SV_Target{
fixed3 c = i.color;
//使用——Color属性来控制输出颜色
c *= _Color.rgb;
//将插值后的i.color显示到屏幕上
return fixed4(c, 1.0);
}
ENDCG
}
}
}
这是出错代码
当时检查了很多遍,代码和书上的都一样,第一次感受到了大家说的学Shader从入门到放弃。
后来在看了CSDN上的几篇帖子后了解到了问题所在。书中的Unity5.3.6版本中,这是没有错的,但在后续的5.4的版本里,顶点着色器输出的时候不需要再单独对整个顶点的输出位置进行指定了。
其实就是直接把“:SV_POSITION”删了就行。
修改后的代码:
v2f vert(a2v v)
{
//声明输出结构
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//v.normal包含了顶点的法线方向,其分量范围在[-1.0, 1.0]
//下面的代码吧分量范围映射到了[0.0, 1.0]
//储存到o.color中传递给片元着色器
o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
return o;
}
在Unity中也正常了。