DirectX透明纹理-使植物看起来很好 我最近开始学习C++中的DirectX编程,我有一些其他语言的图形编程经验,不过我对DirectX场景很陌生。

DirectX透明纹理-使植物看起来很好 我最近开始学习C++中的DirectX编程,我有一些其他语言的图形编程经验,不过我对DirectX场景很陌生。,c++,graphics,directx,alpha-transparency,C++,Graphics,Directx,Alpha Transparency,无论如何,我想问一个关于透明纹理的问题。到目前为止,我一直在使用alpha测试,因为这已经达到了我的需要,但是我最近开始想知道“合适的”游戏引擎是如何为具有平滑透明度的植物和树木等对象渲染如此好看的半透明纹理的 每次我使用alpha测试时,texutres最终看起来都是块状的,非常糟糕。我希望能够有平滑,半透明的纹理,画出我所期望的 我的猜测是,如何按顺序执行渲染调用,从远离摄影机的对象开始,然后再靠近摄影机,但是,我真的看不出这对预先制作的模型是如何工作的,例如,如果有一个树模型,其中树叶和树

无论如何,我想问一个关于透明纹理的问题。到目前为止,我一直在使用alpha测试,因为这已经达到了我的需要,但是我最近开始想知道“合适的”游戏引擎是如何为具有平滑透明度的植物和树木等对象渲染如此好看的半透明纹理的

每次我使用alpha测试时,texutres最终看起来都是块状的,非常糟糕。我希望能够有平滑,半透明的纹理,画出我所期望的

我的猜测是,如何按顺序执行渲染调用,从远离摄影机的对象开始,然后再靠近摄影机,但是,我真的看不出这对预先制作的模型是如何工作的,例如,如果有一个树模型,其中树叶和树干共享一个模型,如何保证背面的树叶会绘制,树干会正确地画在叶子上,前面的叶子会正确地画在树干上

我在上面尝试过这种方法,并且还禁用了透明对象(如烟雾粒子)的z缓冲,它有点工作,但看起来很凌乱,效果因视角而异。所以这看起来并不理想

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

谢谢,
Michael。

有序透明最基本的实现方法是使用

如果一个对象需要在另一个对象的前面和后面绘制,或者一个对象有多个子组件是透明的,那么画家的算法就会崩溃。我们无法轻松地对网格的子组件进行相对排序

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

  • 渲染按材质状态或前后排序的所有不透明对象 避免透支
  • 渲染所有前后排序的透明对象
  • 游戏结合使用多种技术来避免这个问题

    将模型拆分为不重叠的透明部分。通常情况下,这是隐式的,因为游戏的透明对象通常使用与模型其余部分不同的材质。还可以拆分具有多个透明层的模型,使每个新模型的层不重叠。例如,可以将松树模型径向拆分为5个部分

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

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

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

    使用加法和减法混合而不是alpha混合,可以以顺序无关的方式实现许多效果

    如果您的平滑边缘仍然不可接受,有几个简单的选项。您可以在低于75%透明度的情况下抖动模型的任何部分。或者,您也可以通过使用alpha覆盖率让硬件在没有可见瑕疵的情况下为您完成这项工作。这会导致多采样硬件抖动过度采样中的边缘。它不会给你一个平滑的渐变,但是4-16级的alpha对于消除锯齿边缘来说是完全可以接受的,如果你已经打算使用MSAA的话,它是免费的

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

    将相机移入和移出透明对象总是有问题的

    渲染复杂的半透明对象几乎是不可能的。就像建筑物或鬼魂的x光照片。许多游戏只是将这种类型的对象渲染为加法。但是,使用现代硬件,各种更复杂的方案是可能的

    更复杂的方案

    深度剥离是一种渲染方法,其中使用不同的Z剪裁平面渲染多个过程,以从后到前合成场景,而不考虑顺序或包含alpha的对象。它比您预期的要便宜,因为许多对象只渲染到一个或两个切片。但它并不完美,许多游戏开发者觉得它太昂贵了

    还有许多其他种类的水果。使用现代GPU和compute,我们可以在一次传递到缓冲区的过程中进行渲染,其中每个像素都是一组可能的切片。然后,我们可以对堆栈进行排序,并在后期处理中混合这些切片,并且只有在像素上存在透明层时才会导致性能损失

    OIT仍然主要用于特殊情况,如2.5D游戏(如小星球)。但我相信它最终可能会成为game pro的核心工具