【译】《GPU GEMS 3》----Next-Generation SpeedTree Rendering 翻译[3]

     最近在研究树木的渲染,看了一些相关的技术说明,几乎都是老外写的,再次为中国游戏产业的前景感到担忧。看了几天的英文,索性也把其中的重要部分翻译了出来,在这里与大家共享,先贴出《GPU GEMS 3》第4章的翻译,第一次写翻译,不免有错漏的地方,欢迎大家指出。如需转载,请先与本人联系。name:LeYond ,qq:413952706

4.3 阴影

    有了轮廓的效果提升,我们还要继续为提高阴影的质量而前进。因为对每个游戏引擎来说,一般情况下阴影技术都会有所不同,out-of-the-box SpeedTree的阴影是在程序未运行时便预计算好的,并且是固定不变的,所以SpeedTree能够工作在许多不同的引擎上。但这种方法有这些缺点:

·         当树木的模型随风运动时,阴影的动画只能运用纹理坐标的变化,如:拉伸,旋转等。

·         预计算阴影不能像动态一样的真实,特别是阴影投射到树干上时。

·         树叶没有自身阴影

4.3.1 树叶的自阴影

我们的第二个目标是让树叶面板上的树叶看起来有独立的阴影。(SpeedTree同时使用树叶面板和3D树叶模型;本节详细介绍树叶面板的自阴影。)树叶的自阴影并不简单,因为树叶公面板很单一,它用2D来表现复杂的3d物体。这些面板总是面朝摄像机,因此,他们总是平行于观察平面。图4-9显示了一棵使用面板的树。在这种方法上,我们使用阴影贴图(参阅King 2004关于阴影贴图技术的介绍.)让阴影有真实的表现,我们必须改变阴影贴图的生成过程和阴影贴图的投影方式。

4-9 阴影贴图在树叶面板上的垂直投影

【译】《GPU GEMS 3》----Next-Generation SpeedTree Rendering 翻译[3]_第1张图片

 ·    我们树叶的阴影贴图的生成大部分根据如下的标准进行渲染。树叶面板旋转至面朝观察者的位置。当渲染至贴图纹理时,他们旋转至面向光源使其能生成好的阴影投影。但是,如图4-10中的例子,它们绕自己的中心旋转时会有问题出现。在图中,浅颜色的树叶面板被旋转向观察者;绿色的树叶面板在相同位置,但现在旋转至面朝光源。在图4-10a中,绿色的树叶面板只会被蓝色树叶面板的下半部分所投影。为了解决这个问题,我们像图4-10b一样简单地旋转。我们故意地适当进行进行(向上)平移,这个量是树叶面板高度的一半。

【译】《GPU GEMS 3》----Next-Generation SpeedTree Rendering 翻译[3]_第2张图片

 

  ·     树叶面板的几何平面在生成阴影贴图时有更重要的问题。像一个树叶面板平面应用了阴影贴图会导致在投影时出现细长的条纹(如图4-12)。只有在光源在眼睛附近才会运行良好。

 

 ·     在阴影实现阶段,为了让阴影生成更真实且没有条纹,我们通过改变它的方向改变阴影的位置。(请注意,我们不会改变几何体和光栅位置----树叶面板仍然是一个2d矩形。我们只通过计算来改变位置。)偏移系数被存储在一张纹理,面片中的每片树叶都被统一地交叉。图4-11显示了最终的纹理。通过这个新的树叶位置,我们将它投射到灯光空间并对阴影贴图进行采样。因为独立地修改了面板中的每片树叶,所以它必须在像素着色器中运行。所用的函数已经在清单4-1中详细地给出。

【译】《GPU GEMS 3》----Next-Generation SpeedTree Rendering 翻译[3]_第3张图片

清单4-1 运行阴影贴图偏移像素着色器代码

 

float PSShadowMapFetch(Input In)
{
  // Let In.VP and In.VV be float3;
// In.VPIn.VV转换为float3格式
  // In.VP - interpolated Vertex Position output by VS
  // In.VP – 从顶点着色器传入的已变换的顶点坐标
  // In.VV - View Vector output by VS
  // In.VV – 从顶点着色器传入的观察向量
  // OCT - Offset Coefficient Texture
  // OCT – 偏移系数纹理
  // SMPP - Shadow Map Pixel Position
  // SMPP – 阴影贴图像素坐标
  // SMMatrix - transform to Shadow Map space
  // SMMatrix – 转换到阴影贴图空间
  float3 SMPP = In.VP + In.VV * tex2D(OCT, In.TexCoord).x;
  float3 SMCoord = mul(SMMatrix, float4(SMPP, 1));
  float SM = tex2D(SMTexture, SMCoord);
  return SM;
}

 

4-12显示了两种偏移的形式。(除了阴影效果外,为了突出阴影其他灯光和颜色已经被移除。)两种不真实的现象都可以再图4-12a中看到:由于2D的树叶面板垂直投影,会有纵向条纹的出现。当渲染阴影贴图时,在树叶面板上也会出现斜的条纹。在图4-12b,这些不真实的现象被去除了。结果非常细腻且自然。在我们的实时演示中,独立叶片的阴影会随风运动。

 

【译】《GPU GEMS 3》----Next-Generation SpeedTree Rendering 翻译[3]_第4张图片

你可能感兴趣的:(游戏,vector,input,float,引擎,output)