【问题标题】:is there any conflict between GL_DEPTH_TEST and alpha blending in openGL?GL_DEPTH_TEST 和 openGL 中的 alpha 混合之间是否存在冲突?
【发布时间】:2011-08-16 01:41:56
【问题描述】:

我正在绘制一些“2D”图片。 假设背景中的图片 A 先绘制,前景中的图片 B 比 A 晚绘制。 B中有一些透明区域。 所以当我启用 GL_DEPTH_TEST 时,B 应该覆盖 A 但那些透明区域。

我在这里得到的实际结果很奇怪,B确实覆盖了A,但是透明区域显示的是背景而不是应该是A。

我用 glFrustum 作为 GL_PROJECTION, glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), glDepthFunc(GL_LEQUAL) 是我遗漏了一些设置还是什么?

【问题讨论】:

    标签: opengl alphablending


    【解决方案1】:

    不应该有你讨论的那种冲突。深度缓冲区每个像素只能保存一个深度,因此透明度可能是个问题,因为说每个像素由来自单个深度的数据组成并不准确。

    最终效果是,如果您绘制部分透明的东西然后尝试在其后面绘制一些东西,深度缓冲区会说不绘制。所以虽然你应该能够看到背后的东西,但你不能。

    在您的情况下,如果您先绘制 B(在前景中)然后是 A(在背景中),那么您所看到的将是预期的行为。您的代码的某些方面是否可能给您一个意外的绘图顺序?

    【讨论】:

    • 嘿,Tommy,你是对的,是 B,然后是 A。谢谢指出。
    • 酷。在这种情况下,建议通常是这样的,只要它不会显着增加您的其他成本:从前到后绘制实体几何,然后从前到后绘制透明几何。由于将事物打包到 GPU 上并避免状态更改的好处,大多数实现往往对此非常不精确,但这是基本立场。
    • 保存GL对象的数据结构太复杂了,我宁愿不改...B的透明区域是完全透明的。为什么A还没有抽中?
    • 如果它完全透明,您应该查看GL_ALPHA_TESTglAlphaFunc。您可以指定任何未能满足特定 alpha 测试(例如“大于 1/256”)的片段在到达足以对深度缓冲区产生任何影响之前被丢弃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2011-12-14
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多