鸟语天空
绑定通道(BindChannels)
post by:追风剑情 2014-6-6 21:22

   绑定通道(BindChannels)命令可以指定顶点数据如何映射到显卡中。使用顶点程序时,绑定通道将没有效果,绑定受顶点程序输入控制。

   默认情况下,Unity会自动计算并绑定,但在某些情况下,要使用自定义绑定。例如,在第一个纹理处理阶段映射主UV,然后在第二个纹理处理阶段使用次要UV,或者告诉硬件需要考虑顶点颜色。绑定通道常用语法如下:

BindChannels { Bind "数据源", 目标硬件 }

常用的数据源和目标硬件如表所示。

绑定通道参数

数据源 说明 目标硬件 说明
Vertex 顶点位置 Vertex 顶点的位置
Normal 顶点法线 Normal 顶点的法线
Tangent 顶点切线 Tangent
顶点的切线
Texcoord 主要的UV坐标 Texcoord0,Texcoord1,...
各个纹理处理阶段的纹理坐标
Texcoord1 次要的UV坐标 Texcoord1
所有纹理处理阶段的纹理坐标
Color 每个顶点颜色 Color
每个顶点颜色

  Unity在源和目标的映射上加了一些限制。源和目标的顶点、法线、切线和颜色必须匹配。从网格中获取的纹理坐标(Texcoord和Texcoord1)可以映射到纹理坐标的目标(所有纹理处理阶段可以使用Texcoord,或者在一个特定阶段使用TexcoordN)

说明

   需要考虑顶点颜色的着色器或使用两个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
            }
        }
    }
}
}


效果

1111.png2222.png

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容