着色器的一般结构:
Shader "MyShader/MyShaderName" { Properties { // ... properties here ... } SubShader { // ... subshader for graphics hardware A ... Pass { // ... pass commands ... } // ... more passes if needed ... } SubShader { // ... subshader for graphics hardware B ... } // ... Optional fallback ... FallBack "VertexLit" }
Shader
Shader命令包含了字符串组成的着色器的名称,这个名字可以用“/”字符细分模拟一个文件夹结构,着色器的名称应该是唯一的
Subshader
一个Shader可以存在一个或多个SubShader,主要是用来为不同的GPU实现着色器功能,所有的SubShader应该使用不同的技术对每个体系结构,实现与现在相似的功能.ShaderLab翻译的代码着色器自动到其他架构,但在某些情况下着色器的功能在移动架构不理想或丢失一些输入。
pass
每个SubShader由若干个pass组成。每个Pass代表了顶点的执行和片段代码的着色器的材质渲染同一个对象。为了性能你可以通过尽可能少数量的pass。
CGPROGRAM.............ENDCG
这个指令定义了再ShaderLab中使用的着色器语言。Unity可以使用CG和GLSL的着色器语言,CG语言是被推荐的,被实施了不同的体系结构的几个优化步骤。
Simple Shader
定点和片段着色器的不同是在渲染管道的开发过程。顶点着色器可以定义为着色器程序修改场景的几何形状,使3d投影,相关片段着色器渲染窗口,定义每个像素的颜色。片段和顶点着色器可以提供更多的功能在新的显卡,如移动顶点位置为每个像素或存储更多的数据。
Shader "Custom/SolidColor" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag float4 vert(float4 v:POSITION) : SV_POSITION { return mul (UNITY_MATRIX_MVP, v); } fixed4 frag() : SV_Target { return fixed4(1.0,0.0,0.0,1.0); } ENDCG } } }
Pragma vertex vert
顶点着色器是一个着色器程序修改场景的几何形状,它执行在场景中的每个点,输出坐标投影,颜色,纹理和其他数据传递到片段着色器。指令 #pragma vertex [function name]用来定义顶点方法的名称。
Pragma fragment frag
片段着色器是一个着色器程序更改图像的属性在渲染窗口。它执行在每个像素,输出信息的像素的颜色。指令 #pragma fragment [function name]用来定义片段方法的名称。
float4 vert(float4 v:POSITION) : SV_POSITION
这句定义了顶点的方法,变量v包含了顶点的值,这个方法被场景渲染中的每个顶点调用。返回的值为顶点在屏幕中的位置的float4变量。使用四个浮点值用来在SV_POSITION中存储在一个2D窗口中的坐标位置。因为预计的几何投影是在齐次坐标,使用两个值的像素屏幕(x,y),一个值为深度(z),和一个其次坐标的值(z)。你可以将齐次坐标转换成3D坐标。但是你将会失去
在未来
获得的3D位置顶点的能力。同样你可以删除(z)值,但是你将会失去
的能力。齐次坐标用于几乎所有的GPU。删除变量的顶点着色器输出着色器不代表任何的代码优化。反而会使代码变得不通用,并且变得更加难以理解。最终渲染时执行
深度测试
return mul(UNITY_MATRIX_MVP,v);
这是顶点方法的核心功能,将3D坐标投影到2D窗口,这个过程包括了乘以3D位置矩阵Model-View-Projection (模型到视窗的投影矩阵)。
fixed4 frag() : COLOR
这一句定义了frag方法,这是使用的片段着色器作为其主要功能。这个片段方法没有输入的参数。和输出被定义为一个颜色值定义在一个fixed4变量包含RGBA(红,绿,蓝,α)的颜色。可以使用颜色作为可视化的一个浮点数变量,甚至传递信息在顶点着色器与片段着色器之间。然而COLOR变量是固定值0和1之间,所以希望改变COLOR变量中的值
return fixed4(1.0,0.0,0.0,1.0)
片段着色器的核心功能,为每个像素处理的片段着色器定义了红色。