gpt4 book ai didi

c++ - DirectX透明纹理-使植物看起来不错

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:44 26 4
gpt4 key购买 nike

我最近开始学习C++中的DirectX编程,我有一些使用其他语言进行图形化编程的经验,但是我是DirectX Realm 的新手。

无论如何,我想问一个关于透明纹理的问题。到目前为止,我一直使用Alpha测试来满足我的需求,但是我最近开始怀疑“适当的”游戏引擎如何为具有平滑透明度的植物和树木等物体渲染如此好看的半透明纹理。

每次我使用alpha测试时,纹理最终看起来都是块状的,只是很糟糕。我希望能够具有平滑的,半透明的纹理,并且可以像我期望的那样绘制。

我的猜测是如何依次执行渲染调用,从远离相机的地方开始,然后移近一些,但是,我真的看不到它对于预制模型的工作原理,例如您有一个树模型,其中叶子和树干共用一个模型,如何保证后叶子可以画,树干可以在叶子上正确绘制,并且前叶子在树干上看起来正确。

我在上面尝试过该方法,并且还对诸如烟尘粒子之类的透明对象禁用了z缓冲,这种方法虽然有效,但是看起来很杂乱,效果根据视角而有所不同。因此,这似乎并不理想。

简而言之,“适当”的游戏使用什么方法将正确的平滑Alpha纹理(具有一系列Alpha值)正确绘制到3D场景中,例如叶子。

谢谢,
迈克尔

最佳答案

有序透明性基本上是使用painters algorithm完成的。

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

尽管它不能解决问题,但z-buffer允许我们优化渲染。大多数游戏使用这种稍微复杂一些的算法作为其渲染的基础。

  • 渲染按 Material 状态或从前到后排序的所有不透明对象
    避免 overdraw 。
  • 渲染从前到后排序的所有透明对象。

  • 游戏可以结合使用多种技术来避免此问题。

    将模型拆分为非重叠的透明部分。通常,这是隐式完成的,因为游戏的透明对象将经常使用与模型其余部分不同的 Material 。您还可以以透明的方式拆分模型,以使每个新模型的层都不重叠。例如,您可以将一棵松树模型径向地分成5个部分。

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

    避免在模型中使用半透明零件。仅将透明性用于抗锯齿边缘,并且透明对象可以将世界清晰地分为两个单独的对象组。 (例如Windows或水上飞机)。像这样分割世界并从前到后渲染这些块,可以绘制抗锯齿的边缘,而不会在其他透明对象上造成明显的切口。只要您将alpha测试设置为高于〜30%,即使边缘重叠,边缘本身也会看起来很好。

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

    使用加法和减法混合而不是alpha混合,可以按顺序独立的方式完成许多效果。

    如果您的平滑边缘仍然 Not Acceptable ,则有几个简单的选择。您可以抖动模型中透明度低于75%的任何部分。或者,您也可以使用Coverage-to-Alpha,让硬件为您做到这一点,而不会出现明显的伪影。这使多重采样硬件抖动了 overdraw 样本中的边缘。它不会给您带来平滑的渐变,但是4-16的Alpha级别对于抗锯齿边缘是完全可以接受的,如果您已经打算使用MSAA,则可以免费使用。

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

    将相机移入或移出透明物体始终是有问题的。

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

    更复杂的方案

    深度剥离是一种渲染方法,您可以使用不同的Z形剪切平面渲染多遍,以从头到尾合成场景,而不考虑顺序或包含alpha的对象。它比您期望的便宜,因为许多对象只能渲染一个或两个 slice 。但这并不完美,许多游戏开发人员都觉得它太昂贵了。

    Order Independent Transparency还有许多其他变体。使用现代的GPU和计算,我们可以单次渲染到缓冲区,其中每个像素都是可能的 slice 的堆栈。然后,我们可以对堆栈进行排序,并在后期处理中混合这些 slice ,并且仅当像素上有透明层时才导致性能下降。

    OIT仍然主要仅用于特殊情况下,例如2.5D游戏(例如Little Big Planet)。但我相信它最终可能成为游戏编程的核心工具。

    关于c++ - DirectX透明纹理-使植物看起来不错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21639631/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com