开始Unity Shader学习之旅
一个简单的顶点/片元着色器
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
//使用一个结构体来定义顶点着色器的输入
struct a2v{
float4 vertex:POSITION; //模型空间的顶点坐标
float3 normal:NORMAL; //模型空间的法线方向
float4 texcoord:TEXCOORD0; //模型的第一套纹理坐标
};
struct v2f{
float4 pos:SV_POSITION; //裁剪空间的顶点坐标
fixed3 color:COLOR0; //颜色信息
};
v2f vert(a2v v):SV_POSITION
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.color=_Color;
return o;
}
fixed4 frag(v2f i):SV_Target
{
return fixed4(i.color,1.0);
}
ENDCG
![](https://i-blog.csdnimg.cn/blog_migrate/0298ec9e08491f76479cd209cc906be8.png)
- 编译指令
#pragma vertex vert
和#pragma fragment frag
指定了哪个函数包含顶点着色器的代码和哪个函数包含片元着色器的代码 _Color
是在Properties语义块中声明的属性,在CG代码中需再次声明才能使用POSITION
,NORMAL
,TEXCOORD0
,SV_POSITION
,COLOR0
,SV_Target
是CG/HLSL中的语义,指定了用哪些输入值填充到输入参数中以及输出的参数代表什么- 结构体
a2v
包含了顶点着色器需要的模型数据,是从应用阶段传递到顶点着色器的数据 - 结构体
v2f
是从顶点着色器传递到片元着色器的数据 UnityObjectToClipPos(v.vertex)
相当于mul(UNITY_MATRIX_MVP,v)
,把顶点坐标从模型空间转换到裁剪空间
![](https://i-blog.csdnimg.cn/blog_migrate/9881513c0e827aa3ca9bd37b0737ed64.png)
Unity提供的内置文件和变量
- 内置的包含文件
![](https://i-blog.csdnimg.cn/blog_migrate/3d37a15ba5118004dc8028eda64c9f49.png)
- 常用的结构体
![](https://i-blog.csdnimg.cn/blog_migrate/93af2e7cc408121158711004d2d78f2a.png)
- 常用的函数
![](https://i-blog.csdnimg.cn/blog_migrate/266a6030bb78e3d79d656113f97c3904.png)
Unity提供的CG/HLSL语义
- 语义名称相同,出现位置不同,含义也不同
- 系统数值语义:以SV开头,在渲染流水线中有特殊的含义,如SV_POSITION用于顶点着色器的输出,表示裁剪空间中的顶点坐标
- 下面是从应用阶段传递模型数据给顶点着色器时常用的语义,虽然没有使用SV开头,但具有特殊含义
![](https://i-blog.csdnimg.cn/blog_migrate/8303058b58f84146bf80a67d206f970e.png)
- 下面是从顶点着色器阶段到片元着色器阶段的常用语义,除了SV_POSITION有特殊含义外,其他语义对变量的含义没有明确要求,可以存储任意值到这些语义描述变量中
![](https://i-blog.csdnimg.cn/blog_migrate/9b818b62677dd672a5050691804dd053.png)
- 片元着色器输出时的常用语义
![](https://i-blog.csdnimg.cn/blog_migrate/b60d3a5f1b6b6ce66e8f1d4bd05c646d.png)
Shader整洁之道
- CG/HLSL中3种精度的数值类型
![](https://i-blog.csdnimg.cn/blog_migrate/bb57c5fa2cfd2bdd734906d78b23574c.png)
- Shader中运算需要的临时寄存器数目或指令数目超过当前可支持的数目时,可以通过指定更高等级的Shader Target来使用更多的临时寄存器和运算指令
![](https://i-blog.csdnimg.cn/blog_migrate/df18682c3bcddbd2d6eb51dbdda48ed1.png)
本节代码: https://github.com/kb824999404/Unity_Shader/tree/master/First/Chapter5
个人博客传送门: 十七小栈