首页 > 代码库 > Unity3D中的Shader

Unity3D中的Shader

简单的说,Shader是为渲染管线中的特定处理阶段提供算法的一段代码。Shader是伴随着可编程渲染管线出现的,从而可以对渲染过程加以控制。

1. Unity提供了很多内建的Shader,这些可以从官网下载,打开looking for older version的链接就能看到Build-in shaders。选择合适的Shader很重要,以下是开销从低到高的排序:

(1)Unlit:仅使用纹理颜色,不受光照影响

(2)VertexLit:顶点光照

(3)Diffuse:漫反射

(4)Specular:在漫反射基础上增加高光计算

(5)Normal mapped:法线贴图,增加了一张法线贴图和几个着色器指令

(6)Normal Mapped Specular:带高光法线贴图

(7)Parallax Normal Mapped:视差法线贴图,增加了视差贴图的计算开销

(8)Parallax Normal Mapped Specular:带高光视差法线贴图

  对于现在流行的移动平台游戏,Unity提供了几种专门的着色器放在Shader->Mobile下,它们是专门优化过的。

2. 在Unity中,可以编写3种类型的Shader:

表面着色器(Surface Shaders):最常用的Shader,可以与灯光、阴影、投影器交互,以Cg/HLSL语言进行编写。

顶点和片段着色器(Vertex and Fragment Shaders):全屏图像效果,代码比较多,以Cg/HLSL编写。

固定功能管线着色器(Fixed Function Shaders):游戏要运行在不支持可编程管线的老旧机器上时,需要用ShaderLab语言来编写。

无论编写哪种Shader,实际的Shader代码都需要嵌入ShaderLab代码中,Unity通过ShaderLab代码来组织Shader结构。

下面是我新建的一个Shader的默认内容:

Shader "Custom/TestShader" {    Properties {        _MainTex ("Base (RGB)", 2D) = "white" {}    }    SubShader {        Tags { "RenderType"="Opaque" }        LOD 200                CGPROGRAM        #pragma surface surf Lambert        sampler2D _MainTex;        struct Input {            float2 uv_MainTex;        };        void surf (Input IN, inout SurfaceOutput o) {            half4 c = tex2D (_MainTex, IN.uv_MainTex);            o.Albedo = c.rgb;            o.Alpha = c.a;        }        ENDCG    }     FallBack "Diffuse"}

Properties:用来定义着色器中使用的贴图资源或者数值参数等,这里定义了一个Base (RGB)的2D图片。

SubShader:一个着色器包含的一个或多个子着色器。Unity从上到下遍历子着色器,找到第一个能被设备支持的着色器。

FallBack:备用着色器,一个对硬件要求最低的Shader名字。