Unity Shader编程剖析
Shader是Unity中非常重要的视觉效果工具,它可以控制对象表面的呈现方式,实现复杂的渲染效果。本文将详细剖析Unity Shader的编程方式,帮助大家掌握Shader开发。
一个最基本的Surface Shader包含 Vertex和Fragment两个子Shader。Vertex Shader控制顶点位置;Fragment Shader计算每个像素的颜色。中间由图形渲染管线连接。基本结构如下:
Shader "Custom/Basic" {
Properties {
_Color ("Color Tint", Color) = (1, 1, 1, 1)
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert (appdata v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target {
fixed4 col = _Color;
return col;
}
ENDCG
}
}
}
Properties定义了Shader暴露给用户修改的参数,如颜色、纹理等。在Properties块中声明,通过_VARNAME形式访问。可以控制Inspector面板显示。
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1, 1, 1, 1)
}
Shader中通过结构体在各Shader函数之间传递数据。appdata传递顶点相关数据,v2f传递到像素Shader。可以添加各种需要的变量到结构体。
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
在Fragment Shader中可以采样Texture,获取纹素颜色。采样方式有正常、偏移、扭曲等。可以混合多个纹理。
fixed4 frag (v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
Surface Shader有固定的函数结构,包括void surf()和输入结构SurfaceOutput。surf()填充输出结构,Unity会自动连接光照模型。
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
}
Unity默认使用Blinn-Phong模型计算光照。可以修改漫反射、高光、环境光等参数控制光照效果。
o.Albedo = diffColor;
o.Specular = specColor;
o.Gloss = gloss;
以上就是Unity Shader的一些基本用法。Shader开发需要对图形渲染管线有深入理解。多学习参考其他Shader源码,可以帮助我们制作出各种复杂酷炫的Shader特效。