Unity Shader编程剖析

Unity Shader编程剖析

Unity Shader编程剖析

Shader是Unity中非常重要的视觉效果工具,它可以控制对象表面的呈现方式,实现复杂的渲染效果。本文将详细剖析Unity Shader的编程方式,帮助大家掌握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参数

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;
}

五、urface Shader结构

Surface Shader有固定的函数结构,包括void surf()和输入结构SurfaceOutput。surf()填充输出结构,Unity会自动连接光照模型。

void surf (Input IN, inout SurfaceOutput o) {
  o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb; 
}

六、tenham光照模型

Unity默认使用Blinn-Phong模型计算光照。可以修改漫反射、高光、环境光等参数控制光照效果。

o.Albedo = diffColor;
o.Specular = specColor;
o.Gloss = gloss;

以上就是Unity Shader的一些基本用法。Shader开发需要对图形渲染管线有深入理解。多学习参考其他Shader源码,可以帮助我们制作出各种复杂酷炫的Shader特效。