1.从上例子中可以看出,在顶点着色器中,使用POSITION语义得到模型的定点位置,则当使用更多的模型数据时,该怎么办,见如下例子
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/test5.2.2" {
SubShader {
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v{ //声明结构体a2v,使用模型的位置信息,法线以及纹理贴图
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
a2v:应用程序到vertex shader
float4 vert (a2v v) : SV_POSITION{ 实例化一个v(a2v),v中包含a2v所有的成员,用.调用,例如v.vertex
return UnityObjectToClipPos(v.vertex);
}
fixed4 frag() : SV_Target{ 前后的fixed4需要保持一致
return fixed4(0.0,1.0,1.0,1.0);
}
ENDCG
}
}
}
出现问题:
1.变量是float4,而不是float 4,牢记,牢记
2.struct{};结构体后带;
3.括号顺序
Shader“name”
{
SubShader
{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
................
ENDCG
}
}
}
2.应用:顶点着色器与片元着色器的通信
Shader "Custom/test5.2.3" {
SubShader {
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v{ //应用到vertex shader
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f{ //vertex shader 到 fragment shader
float4 pos:SV_POSITION;
float3 col:COLOR0;
};
v2f vert (a2v v) { //vert函数定义成v2f型,输入是a2v的实例化v
v2f o; //实例化v2f ---->o
o.pos=UnityObjectToClipPos(v.vertex);
o.col=v.normal* 0.5 +fixed3(0.5, 0.5, 0.5 );
return o; //输入是a2v类的,输出是v2f类的
}
fixed4 frag( v2f i) : SV_Target{ //输入是v2f类的i,输出类型是fixed4的语义是SV_Target:颜色存储到渲染目标
return fixed4(i.col,1.0);
}
ENDCG
}
}
}
效果如图:
现存问题:
1.对于法线知识掌握不够,对于o.color的计算没太看懂,可能在学习法线之后会有了解
2.SV_Target:告诉渲染器,把用户输出的颜色存储到一个渲染目标中,不是很懂