绑定通道(BindChannels)命令可以指定顶点数据如何映射到显卡中。使用顶点程序时,绑定通道将没有效果,绑定受顶点程序输入控制。
默认情况下,Unity会自动计算并绑定,但在某些情况下,要使用自定义绑定。例如,在第一个纹理处理阶段映射主UV,然后在第二个纹理处理阶段使用次要UV,或者告诉硬件需要考虑顶点颜色。绑定通道常用语法如下:
BindChannels { Bind "数据源", 目标硬件 }
常用的数据源和目标硬件如表所示。
绑定通道参数
数据源 | 说明 | 目标硬件 | 说明 |
Vertex | 顶点位置 | Vertex | 顶点的位置 |
Normal | 顶点法线 | Normal | 顶点的法线 |
Tangent | 顶点切线 |
Tangent |
顶点的切线 |
Texcoord | 主要的UV坐标 |
Texcoord0,Texcoord1,... |
各个纹理处理阶段的纹理坐标 |
Texcoord1 | 次要的UV坐标 |
Texcoord1 |
所有纹理处理阶段的纹理坐标 |
Color | 每个顶点颜色 |
Color |
每个顶点颜色 |
说明
需要考虑顶点颜色的着色器或使用两个UV组的着色器这两种典型的情况可以使用绑定通道。
下面的代码片段说明了绑定通道的使用:
BindChannels { Bind "Vertex", vertex Bind "texcoord", texcoord0 //在纹理处理第1阶段映射第1个UV Bind "texcoord1", texcoord1 //在纹理处理第2阶段映射第2个UV } BindChannels { Bind "Vertex", vertex Bind "texcoord", texcoord //将第1个UV映射到所有纹理处理阶段 Bind "Color”, color }
示例一
Shader "Custom/BindChannelsTest" { Properties { _MainTex ("Main Texture", 2D) = "white" {} _SecondTex ("Second Texture", 2D) = "white" {} } Category { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } BindChannels { Bind "Color", color Bind "Vertex", vertex Bind "Normal", normal //TexCoord对应第一个纹理(_MainTex) //texcoord1对应第二个SetTexture[]{} Bind "TexCoord", texcoord0 //Texcoord1对应第二个纹理(_SecondTex) //texcoord0对应第一个SetTexture[]{} Bind "Texcoord1", texcoord1 //所有SetTexture都使用_MainTex的uv坐标 //Bind "TexCoord", texcoord //在这个shader中和上面的设置等效 //个人理解,不一定正确: //这里的Channel指的就是SetTexture[]{} //Bind 第几组纹理, 第几组纹理坐标 //比如,想让SetTexture [_MainTex]使用_SecondTex的uv坐标: //Bind "TexCoord", texcoord1 } SubShader { Pass { SetTexture [_MainTex] { combine texture * primary } } } } }
效果