绑定通道(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
}
}
}
}
}
效果