今天开始正式整合学习的shader内容。
Simple Shader
主要介绍了大概的shader格式。
Shader "Unity Sgaders Book/Chapter 5/Simple Shader" //shader名
{
Properties
{
//声明color类型的属性
_Color("Color Tint", Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert //顶点着色器函数
#pragma fragment frag //片元着色器函数
fixed4 _Color; //定义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){
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
{
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c,1.0);
}
ENDCG
}
}
}
其主要意义在于通过模型法线获取不同参数,从而在材质面板中(材质面板默认显示球体,球体上每一个顶点的法线都不一样)显示一个颜色拾取器。效果如下图所示:
False Color
假彩色图像(false-color image)用于可视化一些数据,以方便对shader进行调试。即将想要的数据映射到[0-1]区间,作为颜色输出到屏幕上,然后通过屏幕上显示的像素颜色来判断这个值是否正确。通常用于debug。shader代码如下:
Shader "Unity Sgaders Book/Chapter 5/False Color"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 pos:SV_POSITION;
fixed4 color : COLOR0;
};
v2f vert(appdata_full v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//可视化法线方向
o.color = fixed4(v.normal * 0.5 + fixed3(0.5,0.5,0.5),1);
//可视化切线方向
//o.color = fixed4(v.tangent * 0.5 + fixed3(0.5,0.5,0.5),1);