学习unity shader的基本语法,尝试实现运用以实现效果
Unity Shader 应用=>顶点=>片元=>输出阶段中的经常使用的语义:[1]
.
1、从应用阶段传递模型数据到顶点着色器时Unity经常使用的语义
POSITION 模型空间中模型顶点坐标位置,通常是float4类型
NORMAL 顶点法线,通常是float3类型
TANGENT 顶点切线,通常是float3类型
TEXCOORDn 顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标以此类推,通常是float2或float4
COLOR 顶点的颜色,通常是float4或fixed4
2、从顶点着色器到片元着色器Unity经常使用的语义
SV_POSITION 裁剪空间中顶点坐标,结构体中必须有一个用该语义修饰的变量,等同于DirectX9中的POSITION,但最好使用SV_POSITION
COLOR0 通常用于修饰第一组顶点颜色,但不是必须的
COLOR1 通常用于修饰第二在顶点颜色,但不是必须的
TEXCOORD0~TEXCOORD7 通常用于修饰纹理坐标,但不是必须的
(补充说明:这些语义除了SV_POSITION比较特殊以外,其他的语义基本上没有明确的要求,可以储存任意数据到这些语义修饰的变量中。另外,通常我们习惯于用TEXCOORD0来修饰自定义的变量。)
3、片元着色器输出时Unity支持的语义
SV_Target 等同于DirectX9中的COLOR,但我们最好用SV_Target。表示的是将输出数据
传递给render_target(渲染目标)
DEPTH 片段的深度
实践题目一:一个标准的正方体,将六个面的颜色分别设置为(0或1,0或1,0或1)六种颜色。
知识点:1.NORMAL 顶点法线。2.step(a,b)函数,若a<=b返回1,否则返回0
代码:
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)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.normal + fixed3(1,1,1) * step(v.normal.x,0) * step(v.normal.y, 0) * step(v.normal.z, 0);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed3 c = i.color;
return fixed4(c,1);
}
ENDCG
原理:对于正方体,六个面的法线分别为:(1,0,0),(-1,0,0),(0,1,0),(0,-1,0),(0,0,-1),(0,0,1),欲将其转化为(1,0,0),(0,1,1),(0,1,0),(1,0,1),(1,1,0),(0,0,1),就是若 x<0 | y<0 | z<0,-1转为0,0转为-1,否则不变。
.
[1] 引用自博客:链接