• 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,小参数可以模拟水面。    :)

  • 相关阅读:
    [CC-STREETTA]The Street
    [CF115E]Linear Kingdom Races
    [洛谷P3987]我永远喜欢珂朵莉~
    [POI2012]Squarks
    [TC6194]AllWoundUp
    [CF434D]Nanami's Power Plant
    [CF126D]Fibonacci Sums/[BJOI2012]最多的方案
    [HZOI 2016]我们爱数数
    [COGS2427][HZOI 2016]seq
    Ynoi2018 天降之物
  • 原文地址:https://www.cnblogs.com/infintyward/p/3236012.html
Copyright © 2020-2023  润新知