[UnityShader2]表面着色器基础

官方文档:http://docs.unity3d.com/Manual/SL-SurfaceShaders.html


0.

a.表面着色器跟顶点片段着色器相比,其优势在于可以比较方便地去书写跟灯光交互的shader(跟灯光交互的shader一般都是比较复杂的)。

b.你可以定义一个表面函数,根据需要将一些数据当作输入,然后填充输出结构体"SurfaceOutput"。


1.输入结构

Input 这个输入结构通常拥有着色器需要的所有纹理坐标(texture coordinates)。纹理坐标(Texturecoordinates)必须被命名为“uv”后接纹理(texture)名字。(或者uv2开始,使用第二纹理坐标集)。

可以在输入结构中根据自己的需要,可选附加这样的一些候选值:

[UnityShader2]表面着色器基础_第1张图片


2.输出结构

struct SurfaceOutput
{
    fixed3 Albedo;  // diffuse color
    fixed3 Normal;  // tangent space normal, if written
    fixed3 Emission;// 该像素的自发光颜色,使得即便没有光照也可以物体本身也可以发出光
    half Specular;  // specular power in 0..1 range
    fixed Gloss;    // specular intensity
    fixed Alpha;    // alpha for transparencies
};

3.编译指令(要放在SubShader中,而不是在Pass块中)

#pragma surface surfaceFunction lightModel[optionalparams]
a.#pragma surface:表明这是一个表面shader

b. surfaceFunction:表示指定名称的Cg函数中有表面着色器(surface shader)代码。这个函数的格式应该是这样:void surf (Input IN,inout SurfaceOutput o), 其中Input是我们自己定义的结构。Input结构中应该包含所需的纹理坐标(texture coordinates)和表面函数(surfaceFunction)所需要的额外的必需变量。

c.lightModel:使用的光照模式。内置的是Lambert (diffuse)和 BlinnPhong (specular)两种。

d.optionalparams:略,参考官方文档:http://docs.unity3d.com/Manual/SL-SurfaceShaders.html


4.自定义光照模型

a.unity内置光照模型: Lambert (diffuse lighting) andBlinnPhong (specular lighting),其代码在Lighting.cginc中。

b.光照模型声明:函数开头是Lighting,可以在shader中的任意地方声明。

[UnityShader2]表面着色器基础_第2张图片

c.解密光照贴图:略

你可能感兴趣的:(shader)