先看看本教程的架构吧,我该用MS VISIO画图了,
多重纹理的概念和简介:
多重纹理旨在混合两个甚至多个不同的纹理来创建一个最终的纹理效果,混合多个纹理得出的效果图取决于你具体的混合公式,就好像做菜一样,材料一样,但烹饪的手法不一样,做出来的样式和味道自然不一样.下面放例子:
给出第一张纹理:
给出第二张纹理:
给出第一段PixelShader:
<pre name="code" class="cpp">Texture2D ShaderTexture[2]; //纹理资源数组
SamplerState SampleType:register(s0); //采样方式
float4 PS(VertexOut outa) : SV_Target
{
float4 BasePixel;
float4 ColorPixel;
float4 color;
BasePixel = ShaderTexture[0].Sample(SampleType, outa.Tex);
ColorPixel= ShaderTexture[1].Sample(SampleType, outa.Tex);
color = BasePixel*ColorPixel*1.0f;
color = saturate(color);
return color;
}
以这一段PixelShader运行得到的混合效果如下:
而当以第二段这样的PixelShader运行
Texture2D ShaderTexture[2]; //纹理资源数组
SamplerState SampleType:register(s0); //采样方式
float4 PS(VertexOut outa) : SV_Target
{
float4 BasePixel;
float4 ColorPixel;
float4 color;
BasePixel = ShaderTexture[0].Sample(SampleType, outa.Tex);
ColorPixel= ShaderTexture[1].Sample(SampleType, outa.Tex);
color = (BasePixel+ColorPixel)*1.0f;
color = saturate(color);
return color;
}
得到的效果图如下
由上可知混合公式不一样,造成的结果天差地别,但是混合公式有什么规律可循?或者说像素颜色的乘法和加法有什么区别呢?
假设第一个像素颜色为:BasePixel(r1,b1,g1,a1);
假设第二个像素颜色为:ColorPixel(r2,b2,g2,a2)
假设输出颜色为color
第一,当两个像素颜色进行离散乘法的时候
color=BasePixel*ColorPixel=(r1*r2,b1*b2,g1*g2,a1*a2);
实现的是 两种像素融合的效果,就像第一副图那样。
第二,当两个像素颜色进行加法的时候
color=BasePixel+ColorPixel=(r1+r2,b1+b2,g1+g2,a1+a2);
实现的是亮度加强的效果.就像第二幅图那样.
再来看看本文的第三段Pixelshader
Texture2D ShaderTexture[2]; //纹理资源数组
SamplerState SampleType:register(s0); //采样方式
float4 PS(VertexOut outa) : SV_Target
{
float4 BasePixel;
float4 ColorPixel;
float4 color;
BasePixel = ShaderTexture[0].Sample(SampleType, outa.Tex);
ColorPixel= ShaderTexture[1].Sample(SampleType, outa.Tex);
color = BasePixel*ColorPixel*2.0f;
color = saturate(color);
return color;
}
这段shader实现的纹理混合效果如下图:
第三幅图和第一副图效果很相似,但是亮度明显加强了,为什么这样呢?
我们把PixelShader的混合公式拿出来看看
color=BasePixel*ColorPixel*2.0f;
这条公式相当于:color=(BasePixel*ColorPixel+BasePixel*ColorPixel);
也就是先相乘在相加,
也就是第一步先实现像素融合的效果,后实现亮度相加的效果.
当然要注意的是若上面的因子小于1.0f,比如0.5f,
即color=BasePixel*ColorPixel*0.5f=BasePixel*ColorPixel-0.5*BasePixel*ColorPixel;
则实现的效果图是在第一副图的效果图减弱亮度的,也就是相减.
所以说要分清楚像素颜色相乘相加的区别.
多重纹理在D3D11设置得注意的地方
(1) 像本节我们同时加载了两个纹理资源放在ColorShader.fx文件中,
d3dDeviceContext->PSSetShaderResources(0, 2, texture);
注意这个函数的第一个参数为纹理数组texture中开始的位置,第二个参数为有几个纹理资源,第三个参数为纹理指针数组的头指针.
(2)在shader文件里的资源如果进行注册,
<pre name="code" class="cpp">//用register(b1)进行了注册,在常量缓存数组中位置为1
cbuffer CBPixelColor:register(b1)
{
float4 PixelColor;
};
//用register(b0)进行了注册,在常量缓存数组中位置为0
cbuffer CBMatrix:register(b0)
{
matrix World;
matrix View;
matrix Proj;
};
然而如果不进行注册,则同类型资源从上往下,下标从0开始
例如:
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">cbuffer CBMatrix:register //在常量缓存数组中下标默认为0</span>
{
matrix World;
matrix View;
matrix Proj;
};
cbuffer CBPixelColor:register //在常量缓存数组中下标默认为1
{
float4 PixelColor;
};