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