zoukankan      html  css  js  c++  java
  • 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,小参数可以模拟水面。    :)

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/infintyward/p/3236012.html
Copyright © 2011-2022 走看看