UnityShader编程入门教程

UnityShader编程入门教程

Shader编程是游戏图形学中的重要一环,要实现酷炫的游戏视觉效果,掌握Shader是必不可少的。本文以Unity为例,带你入门Shader编程的基本知识和方法,通过一些示例帮助你快速上手,在游戏中添加更多定制化的图形效果。

什么是Shader

Shader是运行在GPU上的小程序,用于计算顶点/像素的最终颜色和位置。普通的3D模型本身只包含形状信息,而使用Shader可以赋予它复杂的光照、贴图和其他效果。UnityShader使用HLSL语言编写,并通过Properties参数控制Shader的功能。

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渲染管线的理解。多看示例,动手实践是掌握的最好方式。