• Chapter 7-It’s Getting Hot in Here之Heat Haze


          1. 我们要使用Depth Imposter功能,所以茶壶绘制阶段要使用W-buffer(是否还记得之前的DOF中物体绘制使用的W-buffer?)。

          2. 然后一个要说的公式就是:    

    1 float4 ps_main( float2 Tex : TEXCOORD0 ) : COLOR0
    2 {   
    3    float2 Offset = tex3D(Texture1,float3(8*Tex.x,8*Tex.y,0));
    4    Offset = (2 * Offset - 1) * OffsetScale;
    5    return( tex2D(Texture0, Tex + Offset));
    6 }

          Offset = (2 * Offset - 1) * OffsetScale;

          将采样来的Offset(范围是-1~1)map到(0-1)并且乘以一个缩放(也可以叫控制因子,控制Offset的缩放范围)。

          3.  第三个就是每个Pass绘制时候都做了什么事。

           我们可以看到有两个名字分别叫CopyToRTTemp和HeatImposter的Pass,我们只讲解这两个Pass,

           这个示例这中使用了两个RT(可渲染纹理),第一个RT,名叫RenderTarget,用来绘制背景球体及茶壶,绘制完后,在CopyToRTTemp Pass中将它拷贝到第二个RT中(名叫RTTemp)。

           然后在HeatImposter Pass中添加两个纹理,一个是RTTemp,一个是3D噪声纹理(distortion map),我们从distortion map中采样得到的Offset,将该Offset变换到合适的范围,然后再对RTTemp进行采样,并将得到的采样值输出到第一个RT,即RenderTarget(注意输出的时候会对比W-buffer,即Imposter的功能)。

          纹理扭曲及远端的HeatImposter是在一个Pass中实现的,即HeatImposter中(我没写程序以前总以为是在俩个Pass中完成的:(....   )

          至于后来的一个实例,让扭曲动起来,只需要在采样distortion map是时加上第三维坐标,书中使用的Render Monkey中的内建变量fTime0_1。  

          float2 Offset = tex3D(Texture1,float3(8*Tex.x,8*Tex.y,fTime0_1));

          Tex.x及Tex.y之前的常量8可以控制采样时采样点距该坐标点的位置,这个参数越大,画面扭曲越厉害(时间上就是把Texture tile到一个表面的次数);稍微大的参数可以模拟Heat Haze,小参数可以模拟水面。    :)

  • 相关阅读:
    关键字: simpledateformat24小时 格式串
    浅谈DB2在线分析处理函数
    Java中的final关键字
    TestNG注解使用技巧
    java之静态方法,静态变量
    CssSelector之selenium元素定位
    收藏,常用正则表达式
    正则表达式小结
    [转]java中文乱码的解决
    多叉树结构:JSON数据解析(一)
  • 原文地址:https://www.cnblogs.com/infintyward/p/3236012.html
Copyright © 2020-2023  润新知