先看看本次教程的构架吧,
构架其实与前两个教程差不多,就是前两个教程的纹理资源为两个,这次变为三个.
一,AlphaMap(混合贴图)的简介.
AlphaMap(混合贴图)用于实现贴图的混合效果,其实AlphaMap跟黑白色的光照贴图差不多,
如图:
假设还有另外两张纹理图,
一张为:
另外一张为:
最终的混合的结果是:
那么结果是如何实现的呢?其实很简单,下面慢慢道来.
白色像素为(1.0f,1.0f,1.0f) //这里忽略第四个参数alpha
黑色像素为 (0.0f,0.0f,0.0f)
//这里忽略第四个参数alpha
假设第一张纹理图(AlphaMap)像素颜色为AlphaColor(ra,ba,ga),第二张纹理图的像素 颜色为PixelColor2=(r1,b1,g1),
第三张纹理图的像素 颜色为PixelColor2=(r2,b2,g2),
假设输出最终混合颜色为color(r,g,b)
建立起公式:
color=PixelColor1*
AlphaColor+PixelColor2*(1.0f-AlphaColor);
先前说过,AlphaMap上的像素颜色要不就是白色(1.0f,1.0f,1.0f),要不就是黑色(0.0f,0.0f,0.0f)
两种情况:
第一种情况,当提取的像素为黑色时,即
AlphaColor(ra,ba,ga)=(0.0f,0.0f,0.0f)
此时color=(r1*0.0f,b1*0.0f,g1*0.0f)+(r2,b2,g2)*(1.0f,1.0f,1.0f)=(r2,b2,g2);
第二种情况,当提取的像素为黑色时,即AlphaColor(ra,ba,ga)=(1.0f,1.0f,1.0f)
color=(r1,b1,g1)*(1.0f,1.0f,1.0f)+(r2*0.0f,b2*0.0f,g2*0.0f)=
(r1,b1,g1);
这样AlphaMap就完美的把另外两张纹理图合并为一张一部分像素来自第二张纹理图,一部分像素来自第三张纹理图的图.
贴出我的Shader代码
Texture2D ShaderTexture[3]; //纹理资源数组
SamplerState SampleType:register(s0); //采样方式
//VertexShader
cbuffer CBMatrix:register(b0)
{
matrix World;
matrix View;
matrix Proj;
};
struct VertexIn
{
float3 Pos:POSITION;
float2 Tex:TEXCOORD0; //多重纹理可以用其它数字
};
struct VertexOut
{
float4 Pos:SV_POSITION;
float2 Tex:TEXCOORD0;
};
VertexOut VS(VertexIn ina)
{
VertexOut outa;
outa.Pos = mul(float4(ina.Pos,1.0f), World);
outa.Pos = mul(outa.Pos, View);
outa.Pos = mul(outa.Pos, Proj);
outa.Tex= ina.Tex;
return outa;
}
float4 PS(VertexOut outa) : SV_Target
{
float4 BasePixel;
float4 ColorPixel;
float4 AlphaPixel;
float4 color;
BasePixel = ShaderTexture[0].Sample(SampleType, outa.Tex);
ColorPixel= ShaderTexture[1].Sample(SampleType, outa.Tex);
AlphaPixel= ShaderTexture[2].Sample(SampleType, outa.Tex);
// color = BasePixel*AlphaPixel + ColorPixel*(float4(1.0f,1.0f,1.0f,1.0f) - AlphaPixel);
color = BasePixel*AlphaPixel + ColorPixel*(1.0f - AlphaPixel);
color = saturate(color);
return color;
}
我的源代码链接如下: