3.2多纹理效果的像素着色器
下面是像素着色器的代码,该代码存储于ps.txt中,该像素着色器根据输入的两套纹理坐标对对应的纹理贴图进行采样,根据一定比例Scalar混合后输出像素颜色。
//全局变量
//存储颜色混合的比例值s,其中
//Scalar.x = s
//Scalar.y = 1-s
vector Scalar;
//纹理
texture Tex0;
texture Tex1;
//纹理采样器
sampler Samp0 =
sampler_state
{
Texture = <Tex0>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
sampler Samp1 =
sampler_state
{
Texture = <Tex1>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
//输入两套纹理坐标
struct PS_INPUT
{
float2 uvCoords0 : TEXCOORD0;
float2 uvCoords1 : TEXCOORD1;
};
//输出像素颜色
struct PS_OUTPUT
{
float4 Color : COLOR0;
};
//入口函数
PS_OUTPUT PS_Main(PS_INPUT input)
{
PS_OUTPUT output = (PS_OUTPUT)0;
//分别对两个纹理进行采样按照比例混合后输出颜色值
output.Color = tex2D(Samp0, input.uvCoords0)*Scalar.x + tex2D(Samp1, input.uvCoords1)*Scalar.y;
return output;
}
整个程序很容易理解,程序中涉及到着色器的纹理和采样,是我们第一次接触的内容,下面给于说明。
和vector、matrix一样,采样器sample和纹理texture也是HLSL语言的一种类型,HLSL着色器使用采样器对指定纹理进行采样,得到采样后的颜色值以供处理。
它们的用法如下:
//声明一个纹理变量
texture g_texture;
//定义采样器
sampler g_samp =
sampler_state
{
//关联到纹理
Texture = <g_texture>;
//设置采样器状态
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
//调用HLSL内置函数tex2D取得颜色值,参数一为采样器,参数二为纹理坐标
vector Color = tex2D(g_samp, uvCoords);
更多HLSL采样器和纹理的内容请参见DirectX文档。
以上是本例用到的像素着色器,在接下来的应用程序中,我们将给三个着色器全局变量赋值:
² Scalar
存储颜色混合的比例值s,其中Scalar.x = s, Scalar.y = 1-s;
² Samp0
第一层纹理采样器;
² Samp1
第二层纹理采样器;
像素着色器的输入结构中我们设定了一个顶点对应两套纹理坐标,读者可以留意一下应用程序中对应的顶点格式的定义。