该例子与第七章的第一个示例非常相似,除了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):

    

    

posted on 2013-08-07 21:40  infinityward  阅读(295)  评论(0)    收藏  举报