Shader编程是游戏图形学中的重要一环,要实现酷炫的游戏视觉效果,掌握Shader是必不可少的。本文以Unity为例,带你入门Shader编程的基本知识和方法,通过一些示例帮助你快速上手,在游戏中添加更多定制化的图形效果。
Shader是运行在GPU上的小程序,用于计算顶点/像素的最终颜色和位置。普通的3D模型本身只包含形状信息,而使用Shader可以赋予它复杂的光照、贴图和其他效果。UnityShader使用HLSL语言编写,并通过Properties参数控制Shader的功能。
一个基本的Surface Shader包含Vertex和Fragment两个主函数,输入参数有模型的顶点坐标、法线、纹理坐标等。Vertex主要处理顶点相关数据;Fragment则计算每个像素的颜色。一个简单的Shader例子:
Shader "Custom/Basic" { Properties { _Color ("Tint", Color) = (1, 1, 1, 1) } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag fixed4 _Color; struct vertexInput { float4 vertex : POSITION; }; struct vertexOutput { float4 pos : SV_POSITION; }; vertexOutput vert(vertexInput v){ vertexOutput o; o.pos = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag(vertexOutput i) : SV_Target{ return _Color; } ENDCG } } }
Properties定义参数;_Color用于整体变色。vert函数处理顶点坐标;frag返回_Color作为像素颜色。
Half:16位浮点数,顶点坐标使用
Fixed:32位浮点数,颜色/纹理使用
Float:32位浮点数,较高精度
Int:整数类型
texture2D采样纹理图片,传入uv坐标,返回颜色:
fixed4 texCol; texCol = tex2D(_MainTex, i.uv);<_MainTex指样本的纹理属性。可以进行各向异性过滤,平铺/夹持 Repeat及Mirror模式。
fixed4类型可进行矢量计算:
fixed4 col; col.rgb = tex2D(...).rgb * _Tint.rgb; col.a = texAlpha * _Tint.a;
混合两图层:
col = lerp(_Tex1,_Tex2,_MixFactor);
使用surf 指令启用PBR光照:
void surf (Input IN, inout SurfaceOutput o) { o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb * _Color.rgb; }
内置各向异性光照、环境光遮蔽等效果。
clip指令配合alpha mask遮罩纹理,实现透明效果:
fixed4 mask = tex2D(_Mask, IN.uv_Mask); clip(mask.a - 0.5);
这是Shader编程的一些基础知识,通过练习各种光照、纹理模型,你可以创造出独特的游戏图形效果。Shader开发需要计算机图形学基础,和对GPU渲染管线的理解。多看示例,动手实践是掌握的最好方式。