顶点片段着色器
顶点片段着色器运行于具有可编程渲染管线的硬件上,包括顶点程序(Vertex Programs)和片段程序(Fragment Programs)。当使用顶点程序或片段程序渲染时,图形硬件的固定功能管线将会关闭,顶点程序会替换固定管线中标准的3D变换、光照、纹理坐标生成等功能,片段程序会替换掉SetTexture命令中的纹理混合模式。
编写顶点片段着色器的形式如下:
Pass{
//通道设置
CGPROGRAM
//本段CG代码的编译指令
#pragma vertex vert
#pragma fragment frag
//CG代码
ENDCG
//其他通道设置
}
编译命令说明:
- 编译命令(Compilation Directive),可用的编译命令如下表:
命令 | 说明 | |
---|---|---|
#pragma vertex name | 将函数name的代码编译成顶点程序 | |
#pragma fragment name | 将函数name的代码编译成片段程序 | |
#pragma geometry name | 将函数name的代码编译成DX10的几何着色器(Geometry Shader) | |
#pragma hull name | 将函数name的代码编译成DX11的hull着色器 | |
#pragma domain name | 将函数name的代码编译成DX11的domain着色器 | |
#pragma fragmentoption option | 添加选项到编译的OpenGL片段程序。对于顶点程序或编译目标不是OpenGL的程序无效 | |
#pragma targe name | 设置着色器的编译目标 | |
#pragma only_renders space separated names | 仅编译到指定的渲染平台 | |
#pragma exclude_renderers space separated names | 不编译到指定的渲染平台 | |
#pragma glsl | 为桌面系统的OpenGL进行编译时,将Cg/HLSL代码转换成GLSL代码 | |
#pragma glsl_no_auto_normalization | 编译到移动平台GLSL时,关闭在顶点着色器中对法线向量和切线向量自动进行规范化 |
-
编译目标(Shader targets):编译目标可以设置为#pragma target 2.0、#pragma target 3.0、#pragma target 4.0、#pragma target 5.0;
-
渲染平台(Rendering Platforms),Unity支持多种图形API包括:
- d3d9
- d3d11
- opengl
- gles
- gles3
- metal
- d3d11_9x
- xbox360
- ps3
- ps4
- psp2
顶点片段着色器代码:
Shader "Tutorial/Display Normals"{
SubShader{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f{
//顶点数据结构体
float4 pos:SV_POSITION;
float3 color:COLOR0;
};
v2f vert(appdata_base v)
{
//顶点程序代码,计算位置和颜色
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.color=v.normal*0.5+0.5;
returen o;
}
half4 frag(v2f i):COLOR
{
//片段程序代码,直接返回输入的颜色,并把透明度设置为1
return half4(i.color,l);
}
ENDCG
}
Fallback "VertexLit"
}