该例子与第七章的第一个示例非常相似,除了RenderTarget格式从D3DMFT_A8R8G8B8变成了D3DFMT_A16B16G16R16F,然后在绘制背景及物体的两个Pass中添加了曝光控制,其他都一样。
代码需要注意的地方,注意观察会发现绘制背景时的代码:
1 sampler Texture0;
2 float Exposure_level;
3
4 float4 ps_main(float3 Tex : TEXCOORD0) : COLOR0
5 {
6 float4 color = texCUBE(Texture0,Tex);
7 color = color * ((1.0+(color.a*64.0))* Exposure_level);
8 return color;
9 }
及绘制茶壶时候的代码:
sampler Texture0;
float Exposure_level;
float4 ps_main(float2 Tex : TEXCOORD0) : COLOR0
{
float4 color = float4(tex2D(Texture0,Tex).xyz,0);
color = color * ((1.0+(color.a*64.0))* Exposure_level);
return color;
}
区别在于绘制茶壶时将茶壶颜色的W分量设置为了0,如果设置为1,曝光控制过程中就会出现茶壶整个区域出现都是白色,除非Exposure_level这个值非常小,茶壶才会显示正常的颜色,但是背景确实黑压压一片什么都看不到。
背景之所以不把α通道设置为0,是因为它的α是从纹理中读取的,并且本身就是比较小的值(白色为α较大,黑色为α较小),这个我们可以从纹理的α通道中看出来,除了RBG通道中有太阳的区域α值较大,其他区域几乎都是黑色(α值较小);然后我们再看茶壶纹理,α通道显示为白色,即α值全部为1,如下图:
这样我们就必须手动调节茶壶纹理的α通道颜色,而不能简单的将其读取到color中,简单的读取会导致它曝光调节的亮度几乎是背景颜色的2倍,这就是为什么在绘制茶壶的pass中,语句的最后一个变量要设置为0 ”float4 color = float4(tex2D(Texture0,Tex).xyz,0);“
绘制茶壶的Pass对比图如下(color.a设置为0与不设置为0):