1、简单顶点/片元着色器
Shader "Unity Shaders Study/Day One/Simple Shader"
{
Properties
{
//声明一个Color类型的属性
_Color ("Color Tint", Color) = (1.0, 1.0, 1.0, 1.0)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//在CG代码中,我们需要定义一个与属性名称和类型都匹配的变量
fixed4 _Color;
//使用一个结构体来定义顶点着色器的输入
struct a2v
{
//POSITION 用模型空间的顶点坐标填充vertex变量
float4 vertex : POSITION;
//NORMAL 用模型空间的法线方向填充normal变量
float3 normal : NORMAL;
//TEXCOORD0 用模型的第一套纹理坐标填充texcood变量
float4 texcood : TEXCOORD0;
};
//使用一个结构体来定义顶点着色器的输出
struct v2f
{
//SV_POSITION pos里包含了顶点在裁剪空间中的位置信息
float4 pos : SV_POSITION;
//COLOR0 存储颜色信息
fixed3 color : COLOR0;
};
//顶点着色器 输出结构中必须包含一个变量 SV_POSITION
//SV_POSITION 顶点着色器的输出是裁剪空间中的顶点坐标
v2f vert(a2v v)
{
//声明输出结构
v2f o;
//把顶点坐标从模型空间转换到裁剪空间
o.pos = UnityObjectToClipPos(v.vertex);
//v.normal包含了顶点的法线方向,其分量范围在[-1.0,1.0]
//下面的代码把分量范围映射到了[0.0,1.0]
//存储到o.color中传递给片元着色器
o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
return o;
}
//片元着色器
//SV_Target 把输出颜色存储到一个渲染目标中
fixed4 frag(v2f i) : SV_Target
{
fixed3 c = i.color;
//使用_Color属性来控制输出颜色
c *= _Color.rgb;
//将插值后的颜色显示到屏幕上
return fixed4(c, 1.0);
}
ENDCG
}
}
}
2、假彩色图像可视化模型数据
Shader "Unity Shaders Study/Day One/FalseColor"
{
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.0);
//可视化切线方向
o.color = fixed4(v.tangent.xyz * 0.5 + fixed3(0.5, 0.5, 0.5), 1.0);
//可视化副切线方向
fixed3 binormal = cross(v.normal,v.tangent.xyz) * v.tangent.w;
o.color = fixed4(binormal * 0.5 + fixed3(0.5, 0.5, 0.5), 1.0);
//可视化第一组纹理坐标
o.color = fixed4(v.texcoord.xy, 0.0, 1.0);
//可视化第二组纹理坐标
o.color = fixed4(v.texcoord1.xy, 0.0, 1.0);
//可视化第一组纹理坐标的小数部分
o.color = frac(v.texcoord);
if(any(saturate(v.texcoord) - v.texcoord))
{
o.color.b = 0.5;
}
o.color.a = 1.0;
//可视化顶点颜色
o.color = v.color;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return i.color;
}
ENDCG
}
}
}