标签:
Unity有三种形式的Shader:
(1)Surface Shaders:对光照管线的高层抽象,受光照和影子效果影响的shader,使用Cg/HLSL语言编写;不进行light相关操作的shader别使用Surface Shader,因为它会进行一堆光照计算;Surface Shader会自动转换为Vertex and Fragment Shaders。
(2)Vertex and Fragment Shaders:最灵活的方式,不处理light相关操作的shader推荐使用该方式,使用Cg/HLSL语言编写。
(3)Fixed Function Shaders:使用ShaderLab编写,用来给不支持可编程shader的旧设备写渲染。
无论选择哪种Shader,都需要使用ShaderLab框架来对Shader代码进行组织。
Surface Shader:
(1)必须放在SubShdader块,不能放在Pass内部;
(2)#pragma sufrace surfaceFunction lightModel [optionalparams]
(3)格式
CG规定了声明为表面着色器的方法(就是我们这里的surf)的参数类型和名字,因此我们没有权利决定surf的输入输出参数的类型,只能按照规定写。这个规定就是第一个参数是一个Input结构,第二个参数是一个inout的SurfaceOutput结构。
struct SurfaceOutput {
half3 Albedo; //像素的颜色
half3 Normal; //像素的法向值
half3 Emission; //像素的发散颜色
half Specular; //像素的镜面高光
half Gloss; //像素的发光强度
half Alpha; //像素的透明度
};
sampler2D就是GLSL中的2D贴图的类型,相应的,还有sampler1D,sampler3d,samplerCube等等格式。而具体地想知道像素与坐标的对应关系,以及获取这些数据,我们总不能一次一次去自己计算内存地址或者偏移,因此可以通过sampler2D来对贴图进 行操作。
在CG程序中,我们有这样的约定,在一个贴图变量(在我们例子中是_MainTex)之前加上uv两个字母,就代表提取它的uv值(其实就是两个代表贴图上点的二维坐标 )。
标签:
原文地址:http://www.cnblogs.com/sifenkesi/p/4546374.html