2014-02-07 28 views
2

我最近开始在C++中学习DirectX编程,在其他语言中我有一些图形编程的经验,但我是DirectX场景的新手。DirectX透明纹理 - 使植物看起来不错

无论如何,我想问一个关于透明纹理的问题。到目前为止,我一直使用alpha测试,因为这已经达到了我的需求,但是我最近开始怀疑“正确的”游戏引擎如何设法为像植物和树木这样具有平滑透明度的东西呈现如此美观的半透明纹理。

由于每次我使用alpha测试,texutres都已经结束了看起来块状和简单的坏。我希望能够获得平滑,半透明的纹理,并且可以按照我的预期绘制。

我的猜测是,如何实现这个功能将按顺序执行渲染调用,从远离相机并靠近的东西开始,但是,我无法真正了解它如何适用于预制模型,例如,如果您有一个树模型,树叶和树干共享一个模型,如何保证后叶会画,树干可以正确地在树叶上绘制,而前叶在树干上看起来是正确的。

我已经尝试过上述方法,并且也禁用z缓冲透明对象,如烟雾颗粒,它有点工作,但看起来很杂乱,效果根据视角而不同。所以这似乎并不理想。

因此,简而言之,“正确”游戏使用什么方法将平滑的alpha纹理(具有一系列alpha值)正确地绘制到叶子等事物的3D场景中。

谢谢, 迈克尔。

+0

禁用z缓冲时遇到的问题与结束颜色依赖于绘制顺序有关。一种方法是从最远到最近的所有透明对象进行排序,然后按照该顺序进行绘制。在这个页面上有几篇文章:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-10-transparency/它处理确切的问题。 – BWG

回答

0

有序透明度最基本的使用painters algorithm完成。

画家的算法在对象需要在另一个对象的前面和后面绘制,或者单个对象具有多个透明的子组件的情况下分解。我们不能轻易地将网格的子组件相对于彼此进行排序。

虽然它不能解决问题z-buffer允许我们优化渲染。大多数游戏使用这个稍微复杂的算法作为渲染的基础。

  1. 呈现所有按材料状态排序的不透明物体或从前到后 以避免透支。
  2. 渲染所有透明对象从前到后排序。

游戏结合使用各种技术来避免此问题。

将模型拆分为不重叠的透明部分。通常这是隐式完成的,因为游戏的透明对象通常会使用与模型其余部分不同的材质。您还可以使用多层透明度来分割模型,使每个新模型的图层不重叠。例如,您可以将松树模型径向分成5个部分。

这在固定功能管道中更为常见。现代游戏只是试图避免这个问题。

避免模型中的半透明部件。仅将透明度用于消除锯齿边缘,以及透明对象可将场景干净地分割为两个单独的对象组。 (例如Windows或水上飞机)。像这样分裂世界并将这些块前后渲染,可以在不引起其他透明物体明显切除的情况下绘制出抗锯齿边缘。即使它们重叠,只要您的alpha测试设置为高于〜30%,边缘本身往往看起来很好。

半透明物体通常呈现为粒子效果。草和烟是最常见的例子。效果或草地物体组的点列表按每个帧进行排序。这比排序任意子网格要简单得多。许多户外游戏都有复杂的草地和树叶实例系统。这些允许它们渲染单独的叶子和刀片,并且正确地对这些叶片进行排序,并避免以这种方式进行大部分渲染开销,但是它们严格限制对象的类型。

许多效果可以使用加法和减法混合而不是阿尔法混合以独立的顺序完成。

如果您的平滑边缘仍然不可接受,有几个简单的选项。您可以将模型的任何部分以低于75%的透明度抖动。或者,您可以通过使用coverage到alpha来让硬件为您提供没有可见工件的工具。这会导致多重采样硬件抖动透支样本中的边缘。它不会给你一个平滑的渐变,但如果你已经打算使用MSAA,4-16级别的alpha对于抗锯齿边缘是完全可以接受的,并且是免费的。

有很多警告和特殊情况。如果有水,则可能需要使用模板或深度测试渲染任何与水相交的半透明物体两次。

将相机移入和移出透明物体始终存在问题。

渲染复杂的半透明物体几乎是不可能的。就像建筑物或幽灵的X射线视图一样。许多游戏只是将这种类型的对象渲染为叠加。但使用现代硬件,各种更复杂的方案都是可能的。

更复杂的方案

的深度剥离的渲染,你从后到前渲染多遍不同的Z剪切平面复合场景,无论顺序还是什么对象包含字母的方法。它比你所期望的要便宜,因为许多对象只能渲染一个或两个片。但它并不完美,许多游戏开发者认为它太昂贵了。

Order Independent Transparency还有很多其他品种。使用现代化的GPU和计算器,我们可以一次渲染一个缓冲区,其中每个像素都是一堆可能的切片。然后,我们可以对堆栈进行排序并在后处理中混合这些切片,并且只有在像素上有透明层时才会导致性能损失。

OIT仍然大多只用于2.5D游戏(如小大星球)的特殊情况。但我相信它可能最终成为游戏编程的核心工具。