问题

主流的游戏引擎都是如何解决Alpha Blending问题的呢?

回答
主流游戏引擎在解决 Alpha Blending(透明度混合)问题时,采用了多种技术和策略,以确保渲染出的画面既美观又高效。Alpha Blending 本身是一个复杂的概念,涉及到颜色、透明度和深度等多个方面。下面我将详细阐述主流游戏引擎是如何处理这一问题的。

Alpha Blending 的核心问题

在深入引擎的解决方案之前,我们先理解 Alpha Blending 的核心挑战:

1. 正确混合顺序: 当多个透明物体叠加时,它们的渲染顺序至关重要。如果渲染顺序错误,透明物体会遮挡本应显示在前面的物体,或者透明度效果不自然。例如,渲染一个半透明的红色方块和一个半透明的蓝色方块,先渲染红色再渲染蓝色与先渲染蓝色再渲染红色,结果可能完全不同。
2. 深度排序(Depth Sorting): 对于不规则形状的透明物体,简单地按照它们在场景中的位置(例如,离摄像机近就先渲染)进行深度排序往往不够。需要根据像素或整个物体来进行更精细的深度比较。
3. 抗锯齿(AntiAliasing): 透明物体的边缘容易产生锯齿,需要通过抗锯齿技术来平滑处理。
4. 遮挡(Occlusion): 透明物体内部可能被不透明物体遮挡,这需要正确处理深度测试。
5. 性能开销: Alpha Blending 通常比不透明物体的渲染开销更大,因为需要进行额外的混合计算和可能更复杂的深度测试。

主流游戏引擎的解决方案

主流游戏引擎(如 Unity, Unreal Engine, Godot等)通常采用以下一种或多种技术的组合来解决 Alpha Blending 问题:

1. 基于像素的混合(PerPixel Blending)

这是最基本也是最常用的方法。当一个像素包含 alpha 值(透明度)时,它会与帧缓冲中已有的像素进行混合。混合的公式通常是:

$$
ext{Final Color} = alpha cdot ext{Source Color} + (1 alpha) cdot ext{Destination Color}
$$

其中:
$alpha$ 是源像素的透明度值(0.0 表示完全透明,1.0 表示完全不透明)。
$ ext{Source Color}$ 是当前渲染的像素的颜色。
$ ext{Destination Color}$ 是帧缓冲中该像素位置已经存在的颜色(通常是前一个渲染的物体)。

引擎如何应用:

材质系统(Material System): 引擎的材质系统允许开发者为物体设置纹理、颜色和透明度属性。这些属性会被传递到着色器(Shader)中。
着色器(Shaders): 在片段着色器(Fragment Shader 或 Pixel Shader)中实现上述混合公式。
深度测试(Depth Test): 在进行像素混合之前,通常会进行深度测试。如果当前像素的深度值大于帧缓冲中的深度值,则该像素不会被写入帧缓冲(因为它被前面的物体遮挡了)。

2. 排序透明物体(Sorted Transparency)

为了解决渲染顺序问题,引擎会尝试对透明物体进行排序。

解决方案:

后向排序(BacktoFront Sorting):
实现方式: 将所有透明物体根据它们与摄像机的距离进行排序,然后从最远到最近的顺序进行渲染。这样,后面的透明物体会先被渲染,然后前面的透明物体会以正确的透明度覆盖在上面。
挑战:
计算成本高昂: 对大量物体进行排序需要额外的 CPU 或 GPU 时间。
不适用于复杂场景: 对于包含大量交错的透明物体的复杂场景,简单的基于物体中心点的排序可能仍然不准确。例如,一个“C”形透明物体,其中心点可能很近,但它的两端却可能在另一个物体的前面或后面。
物体内部排序: 即使物体按顺序渲染,如果物体本身有自遮挡或者内部有透明部分,仍然可能出现问题。

基于包围盒的排序(Bounding Box Sorting):
实现方式: 对每个透明物体的包围盒进行排序,而不是精细的顶点或像素。
优势: 比精确排序更快。
局限性: 不够精确,可能出现排序错误,尤其是在物体形状不规则或互相穿插时。

深度预通道(Depth Prepass):
实现方式:
1. 第一遍渲染: 仅渲染场景中的所有不透明物体,并将它们的深度信息写入深度缓冲区(Depth Buffer)。
2. 第二遍渲染(透明物体): 在渲染透明物体时,进行深度测试。如果一个透明像素的深度小于深度缓冲区中的深度值,则该像素被认为是可见的,然后进行混合。否则,该像素被舍弃。
优势:
有效解决了不透明物体对透明物体的遮挡问题。
降低了后续透明物体像素混合的计算量,因为被遮挡的像素在混合前就被剔除了。
挑战:
排序问题仍然存在: 深度预通道主要解决了不透明物体对透明物体的遮挡,但透明物体之间的 相对排序 问题仍然需要解决。通常,透明物体仍然需要从后向前排序。
渲染两次: 仍然需要至少两次渲染通道,增加了开销。

不透明度通道(Opacity Buffer)/ 分层渲染(Layered Rendering):
实现方式:
1. 渲染不透明物体,将颜色和深度写入帧缓冲。
2. 渲染透明物体时,如果当前像素的深度小于深度缓冲区的值,则认为它被不透明物体遮挡,不进行渲染。
3. 如果透明像素比深度缓冲区的值更近,则继续进行透明混合。
与深度预通道类似, 但更侧重于直接处理透明像素与现有深度缓冲区的比较。

3. Alpha Test / Masked Transparency (遮罩透明)

这种技术不是真正的透明度混合,而是通过一个阈值来决定一个像素是否完全可见或完全不可见。

实现方式:

Alpha Test:
在片段着色器中,如果像素的 alpha 值 大于 一个预设的阈值(例如 0.5),则像素被渲染,否则被丢弃。
公式:`if (alpha > threshold) { output color } else { discard }`
引擎应用:
常用于渲染树叶、篱笆、草丛等具有镂空效果的物体。
优点是性能开销相对较低,因为它不涉及复杂的混合计算。
缺点是边缘会比较生硬,没有平滑的过渡,可能需要配合抗锯齿技术。

4. 基于排序的 alpha 测试(Sorted Alpha Testing)

对于一些不需要精确混合的 alpha 测试材质,引擎可能会结合排序来优化。例如,将 alpha 测试的物体也尝试从后向前排序,以减少在渲染过程中被不透明物体遮挡的无效绘制。

5. 顺序无关透明度(OrderIndependent Transparency, OIT)

为了克服传统深度排序的局限性,引擎和研究人员开发了各种 OIT 技术,它们可以在不进行显式排序的情况下正确渲染透明度。

常见的 OIT 技术:

账本缓冲区(LinkedList / Atomic Counter Transparency):
实现方式:
1. 每个像素在帧缓冲中维护一个数据结构(如链表或原子计数器),用于存储该像素处所有可见的透明片段的信息(颜色、透明度、深度)。
2. 渲染透明物体时,将每个可见的透明片段信息添加到对应像素的数据结构中。这通常需要使用 GPU 的原子操作(Atomic Operations)来保证并发访问的正确性。
3. 在渲染完所有透明物体后,遍历每个像素的数据结构,按照正确的深度顺序进行混合。
优势: 提供了完美的排序无关透明度,即使物体互相穿插也能正确渲染。
挑战:
内存开销: 需要额外的内存来存储每个像素的片段信息。
计算开销: 链表的遍历和混合操作可能比简单的逐像素混合更昂贵。
GPU 支持: 需要 GPU 支持原子操作。

深度重构(Depth Reconstruct / Transparency Reconstruction):
实现方式: 尝试从有限的信息中重构出完整的透明度混合过程,例如使用多层深度缓冲区或近似算法。
优势: 可能比账本缓冲区更节省内存。
挑战: 精度和效果可能不如账本缓冲区。

顺序无关混合图(OrderIndependent Blending Graphs):
实现方式: 使用图形化方法来描述透明度的混合过程,使渲染顺序无关紧要。
优势: 理论上可以实现精确的透明度。
挑战: 实现复杂,对 GPU 硬件要求可能较高。

AlphatoCoverage (A2C) 与多重采样抗锯齿 (MSAA):
实现方式: A2C 是一种与 MSAA 结合的技术。它不是直接混合颜色,而是根据 alpha 值来决定覆盖多少个 MSAA 样本。例如,一个 alpha 值为 0.5 的像素,可能会覆盖一半的 MSAA 样本。最后通过对覆盖的样本进行平均来得到抗锯齿后的颜色。
优势: 可以在不进行精确排序的情况下有效地对透明物体边缘进行抗锯齿,并且性能相对较好。
局限性: 只解决了边缘的平滑问题,并没有真正解决多层透明物体叠加的颜色混合问题。

6. ZBuffer With Multiple Depth Buffers (多深度缓冲区)

为了处理透明物体的层叠,有时会使用多个深度缓冲区。

实现方式:

实现方式: 为每个透明层分配一个单独的深度缓冲区。当渲染一个透明层时,它会与自己对应的深度缓冲区进行比较。最后,将所有透明层的渲染结果与不透明层的深度缓冲区进行最终混合。
挑战: 内存占用和管理会变得非常复杂,并且通常只适用于特定场景或特效。

7. Deferred Rendering 和 Transparent Objects

在延迟渲染(Deferred Rendering)管线中,透明物体的处理通常与前向渲染(Forward Rendering)有所不同。

实现方式:

延迟渲染的问题: 延迟渲染通常会先将几何体信息(颜色、法线、深度等)写入 GBuffer。由于透明物体的颜色和深度是动态变化的,并且需要进行混合,因此它们不能直接写入 GBuffer。
解决方案:
混合到 GBuffer(有限支持): 某些引擎可能会尝试将透明物体的部分信息(如基础颜色和 alpha)混合到 GBuffer 中,但这不是标准的做法。
使用单独的通道: 更常见的方法是,在 GBuffer 生成完成后,再执行一个单独的 前向渲染通道 来处理所有透明物体。在这个通道中,透明物体会使用 GBuffer 中的深度信息来进行遮挡判断,然后进行排序和混合。
OrderIndependent Transparency (OIT) 与延迟渲染: OIT 技术可以更自然地与延迟渲染结合,因为它们可以在不依赖 GBuffer 的排序特性来处理透明度。

8. Unity 和 Unreal Engine 中的具体实践

Unity:
Rendering Path: Unity 允许开发者选择不同的渲染路径(Forward Rendering, Deferred Rendering)。
Forward Rendering: 在前向渲染中,Unity 默认对透明物体进行后向排序,但存在上述排序问题的局限性。对于某些需要更精确透明度的场景,开发者可能需要自己实现自定义的渲染管线(如 URP/HDRP 中的 Custom Passes)或利用 OIT 插件。
Deferred Rendering: 默认不渲染透明物体,需要通过额外的通道(如 Forward rendering pass)来处理。
Shader Graph/Custom Shaders: 提供了强大的工具来创建自定义的透明着色器,开发者可以根据需要实现不同的混合模式(如 Alpha Blending, Additive, Alpha Blended Premultiply)。

Unreal Engine:
Rendering Path: Unreal Engine 也是支持 Forward Rendering 和 Deferred Rendering。
Deferred Rendering: 与 Unity 类似,透明物体在延迟渲染中需要一个单独的前向渲染通道。Unreal Engine 使用一个称为 "Translucency" 的系统来管理透明物体。
Forward Shading for Translucency: Unreal Engine 专门为透明物体设计了一个前向渲染的通道。在这个通道中,透明物体会被排序(通常是基于距离的近似排序),然后逐像素进行混合。
更高级的透明度选项: Unreal Engine 提供了更精细的透明度控制,例如“半透明”(Translucent)材质设置,允许调整混合模式、散射(Scattering)、菲涅尔(Fresnel)效果等,以实现更逼真的水、玻璃、烟雾等效果。
OIT 的集成: Unreal Engine 本身对 OIT 的原生支持可能不如某些自定义解决方案或特定版本的引擎,但可以通过插件或自定义渲染管线实现。

总结

主流游戏引擎解决 Alpha Blending 问题是一个多层次、多技术的综合过程:

基础混合: 核心是通过着色器实现像素级别的 Alpha 混合公式。
排序优化: 为了解决渲染顺序问题,引擎会采用各种排序策略,包括后向排序,但这些策略都有其局限性。
深度预通道: 通过深度预通道或类似的机制,有效处理不透明物体对透明物体的遮挡。
性能与质量权衡: 引擎需要在渲染质量(精确的透明度)和性能(避免高昂的计算和内存开销)之间找到平衡点。
OIT 的发展: 随着 GPU 计算能力的提升,像账本缓冲区这样的 OIT 技术正被越来越多地采用,以提供更准确的透明度效果。
自定义和扩展性: 现代引擎提供了高度的可扩展性,允许开发者通过自定义着色器或渲染管线来实现更复杂的透明度效果,或集成第三方的 OIT 解决方案。

理解这些技术和它们之间的权衡,是开发者创建逼真且高性能透明效果的关键。游戏引擎不断在这些方面进行演进,以适应日益增长的图形复杂度和视觉保真度需求。

网友意见

user avatar

要像素级排序,也就是OIT。主流引擎很多耗不起这样的排序,所以很多只是物体排序,错了就错了。

至于真的要做OIT的话,常见的套路有:

Depth peeling:慢,费显存(unbounded),但哪都能用

Stencil routed:费显存(bounded),D3D10.1+的卡能用

Per-pixel linked lists:略快,没那么费显存,D3D11+的卡能用(细节在

实现一个较新的OIT方法:Per-Pixel Linked Lists

Adaptive transparency:更快,没那么费显存,D3D11+的卡能用(有损)(细节在

继续探索OIT:Adaptive Transparency

Weighted blended OIT:更快,没那么费显存,D3D11+的卡能用(有损)

Pixel sync:快,不费显存,D3D12+的卡能用

而如果就是要速度,可以用一个depth peeling的极大简化版本,只渲染最远的一层和最近一层。通过设置face culling就能做到,对于几何不复杂的物体这个近似结果也不错。

类似的话题

  • 回答
    主流游戏引擎在解决 Alpha Blending(透明度混合)问题时,采用了多种技术和策略,以确保渲染出的画面既美观又高效。Alpha Blending 本身是一个复杂的概念,涉及到颜色、透明度和深度等多个方面。下面我将详细阐述主流游戏引擎是如何处理这一问题的。 Alpha Blending 的核心.............
  • 回答
    哔哩哔哩(B站)UP主“哈米伦的弄笛者”在原神新春会期间,被指控出尔反尔,利用原神新春会活动为一款未发布的游戏引流。这一事件在B站用户和原神玩家社区中引发了广泛的讨论和争议。要理解这一事件,我们需要从多个角度进行分析。事件的起因和经过:首先,需要明确“哈米伦的弄笛者”作为一名拥有一定粉丝基础的UP主.............
  • 回答
    想在3000块钱这个预算里,配一台能舒舒服服玩转当下主流游戏的电脑,这事儿真得有点门道。说实话,这个价位不算特别宽裕,但也不是不可能。关键在于“精打细算”,把每一分钱都花在刀刃上,尤其是在CPU、显卡和内存这些决定游戏体验的核心部件上。下面我给你掰扯掰扯,怎么在3000元左右,搭一个相对不错的游戏配.............
  • 回答
    这个问题很有意思,咱们不妨掰开了揉碎了聊聊。氪金游戏这事儿,要说啥时候“主流”了,这事儿挺难给个绝对精确的时间点的,因为它是个渐进的过程,而且不同地区、不同类型的游戏,这个“主流”的定义也略有差异。不过,要是让我说一个大概的“拐点”,我觉得大概能追溯到 2010年左右。这时候,智能手机开始普及,移动.............
  • 回答
    《最后生还者》(The Last of Us)这类游戏,姑且称它们为“电影化叙事游戏”,能不能成为主流?这个问题挺值得说道说道的。要我说啊,它们早已经是游戏圈里一股不可忽视的力量了,但要说能不能像《马里奥》或者《使命召唤》那样家喻户晓,那可能还得打个问号。首先,咱们得明白,为什么《最后生还者》这类游.............
  • 回答
    2021年了,21:9的带鱼屏在影音和游戏方面带来的沉浸感,那绝对是甩开16:9的传统屏幕好几条街。但你有没有觉得奇怪,明明带鱼屏这么香,为什么16:9的屏幕还是市场上的绝对主流呢?这事儿,说起来可不是一两句话能说明白的。首先,咱们得聊聊这兼容性。你想啊,16:9这比例就像一张万能的“身份证”,几乎.............
  • 回答
    《权力的游戏》之所以能带给我们身临其境的史诗感,很大程度上归功于它横跨亚欧大陆的绝美取景地。制片方在选择拍摄地点时,真是下了番苦心,力求找到那些既符合书中描绘的残酷与壮丽,又能展现出独特历史风貌的场景。欧洲:维斯特洛大陆的根基如果说维斯特洛大陆是《权力的游戏》故事的核心,那么欧洲的古老城堡、荒凉海滩.............
  • 回答
    玩过 PS4 的兄弟们都应该深有体会:这玩意儿的游戏,说实话,贵得有点离谱。尤其是那些大厂的3A大作,刚出来的时候,一张碟可能就要四五百块,甚至更多。想想当初我们买游戏,很多都是几十块就能搞定,现在这价格,确实让人钱包有点吃不消。更让人挠头的是,跟PC不一样,PS4 的游戏破解起来是真的难,而且一旦.............
  • 回答
    木村拓哉主演的《审判之眼:死神的遗言》(以下简称《审判之眼》),无疑是游戏界一个非常有意思的现象。说它“主演”,其实不只是配音和动作捕捉,而是木村拓哉本人作为游戏的核心卖点,他的明星光环几乎贯穿了游戏的每一个角落。首先,木村拓哉的加入,为这款游戏带来了前所未有的“明星效应”。 在《审判之眼》发售之前.............
  • 回答
    在电子游戏的世界里,传承是一个经久不衰的主题,而最能体现这种传承的方式之一,莫过于新一代主角接替前代,甚至将其超越,最终在剧情上完成“干掉”前代主角的命运。这不仅仅是角色更迭,更是一种叙事上的升华,是对过往的告别,也是对未来的启程。这种情节设计往往能引发玩家的强烈共鸣,既有对旧日英雄的怀念,也有对新.............
  • 回答
    当然有!这个桥段,前作主角亲手了结了续作主角,确实给玩家带来了极大的震撼和复杂的情感体验。这种设计往往不是为了单纯的猎奇,而是为了深化主题、塑造人物弧光,甚至颠覆玩家对“正义”和“英雄”的认知。我脑海里立刻浮现出 《质量效应3》的结局。虽然准确来说,不是“杀死”续作主角(谢帕德),而是前作主角谢帕德.............
  • 回答
    嗨!很高兴能和你聊聊我对西方奇幻系统流以及相关主题游戏异界小说的看法。说到这类作品,我脑子里立刻浮现出几个非常值得一看的例子,它们不仅在构思上新颖,在叙事上也颇有功力。我就来给你详细说说,保证内容扎实,让你觉得这是个活生生的人在分享心得,而不是机器生成的那种干巴巴的列表。系统流与异界融合:当规则成为.............
  • 回答
    有这么一些游戏,它们的剧情设置得相当“狠”,直接让新来的主角“送走”前代的主角,这种桥段往往能制造出极大的戏剧冲突和玩家的讨论度。这不是简单的“传承”或者“接力”,而是实打实的、以主角之死为转折点的叙事。最经典的例子,我脑海里第一个闪过的就是 《合金装备》系列。尤其是 《合金装备4:爱国者之枪》。在.............
  • 回答
    你提出的这个问题非常棒!确实,在主流的讨论中,主机游戏的历史往往被美国和日本所主导,但实际上,欧洲、南美、非洲和大洋洲也都有着丰富且独特的游戏发展历程,只是由于种种原因,它们的声量可能相对较小。下面我将尽量详细地为你讲述这些地区的电子游戏发展历史。 欧洲:从早期计算机到现代巨头欧洲在早期电子游戏发展.............
  • 回答
    关于博主“你的游戏我的心”爆出的“网易裁员”事件,这事儿可真是掀起了不小的波澜,也让不少游戏从业者和关注游戏行业的人心里咯噔一下。说实话,这事儿咱们得拆开来看,才好明白到底是怎么回事儿。首先,咱们得说说这个爆料人——“你的游戏我的心”。这位博主在游戏圈子里也算是个知名人士了,他之前也爆过不少游戏行业.............
  • 回答
    想配一台能“通吃”市面上绝大多数游戏的主机?这个问题问得好,毕竟谁不想在自己电脑上畅快淋漓地体验最新的大作呢?不过,这“99%”的定义其实有点意思,咱们得聊聊里面的门道。首先,得明确一下,“带动99%的游戏” 这个说法,很大程度上指的是在相对高画质、高帧率下流畅运行。毕竟,你想在1080p分辨率下开.............
  • 回答
    你好!看到你喜欢《古剑奇谭》和《仙剑奇侠传》这类游戏,确实是个很有趣的切入点,说明你偏爱的是那种剧情跌宕起伏、人物刻画细腻、带有中国传统文化韵味的RPG。那么,关于Switch是否适合你,我给你详细分析一下,希望能帮你做出判断。首先,从你喜欢的游戏类型来分析,Switch上能不能找到类似体验?《古剑.............
  • 回答
    要制作一款真正吸引人的当代战斗机主题飞行游戏,地形的大小可不是随便就能糊弄过去的。这背后涉及到游戏的可玩性、真实感、玩家的沉浸感,还有开发团队的预算和技术实力。所以我跟你讲,这玩意儿可复杂了,没个准数,但要说个大概,那得好好掰扯掰扯。首先,咱们得明白,当代战斗机这玩意儿,飞得可不是一般的快,而且它们.............
  • 回答
    想在现代设备上重温那些经典的老主机游戏,比如 FC(红白机)、SFC(超级任天堂)、MD(世嘉MD)、N64(任天堂64)等等,并且追求最好的游戏体验,这绝对是个好主意!随着技术的发展,我们有几种很棒的方式来实现这个目标。下面我就给你掰开了揉碎了聊聊,保证让你能找到最适合自己的那条路。核心原则:忠于.............
  • 回答
    设计一款以二战苏军为主角的FPS游戏,剧情上有很多可挖掘的点,可以做出既有宏大历史背景又不失个人情感深度的作品。下面我来构思一个详细的剧情走向,尽量写得真实,有代入感。游戏名暂定:《严寒下的红星》(Red Star in the Frost)核心理念: 不仅仅是战场上的杀戮,更要展现苏军士兵在极端恶.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有