学了一段时间unity(2018.1),自己做了几个小demo后,考虑着学一下shader,没有任何CG/HLSL的基础,所以真可谓是UnityShader学习从入门到放弃。。。。
于是本着踩到一个坑记录一个坑的原则,准备整理点东西。
刚开始学shader的头几个知识点中我们肯定会学到一个简单的顶点片元着色器的写法:
Shader "Custom/1" {
SubShader {
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f{
float4 pos:SV_POSITION;
fixed3 color:COLOR0;
};
v2f vert(a2v v):SV_POSITION{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=v.normal*0.5+fixed3(0.5,0.5,0.5);
return o;
}
fixed4 frag(v2f i):SV_Target{
return fixed4(i.color,1.0);
}
ENDCG
}
}
}
然后在我们保存返回unity后,就会倒霉的看到报错了
Shader error in 'Custom/1': invalid output semantic 'SV_POSITION': Legal indices are in [0,0] at line 23 (on d3d11)
研究了一下SV_POSITION发现,猜测这玩意一旦被作为vertex shader的输出语义,那么这个最终的顶点位置就被固定了(不能tensellate,不能再被后续改变它的空间位置?),直接进入光栅化处理。我们在上面的输出结构体v2f里好像已经把这个语义用作顶点输出了,整体再去向这个语义输出可能就有问题了?于是尝试着用CG的输入输出关键字处理这个顶点着色器和片元着色器通信的问题,代码改成:
void vert(in a2v v,out v2f o){
o.pos=UnityObjectToClipPos(v.vertex);
o.color=v.normal*0.5+fixed3(0.5,0.5,0.5);
}
于是,问题解决了。当然我也不知道具体是不是这个原因啦~~
要是有大佬知道具体的原因,还麻烦留言指正下,万分感谢