【问题标题】:Rendering 3D Models With Textures That Have Alpha In OpenGL在 OpenGL 中使用具有 Alpha 的纹理渲染 3D 模型
【发布时间】:2012-03-10 02:25:44
【问题描述】:

所以我试图找出在 OpenGL 中渲染 3D 模型的最佳方法,因为它的某些纹理具有 alpha 通道。

当我启用深度缓冲区并开始绘制 3D 模型中的所有三角形时,如果它绘制的三角形位于模型中另一个三角形的前面,则它根本不会渲染后面的三角形它。问题是前面的三角形有alpha透明度,应该可以看透后面的三角形,但是后面的三角形还是没有渲染出来。

禁用深度缓冲区可以消除这个问题,但会产生一个明显的问题,即如果三角形是不透明的,那么如果在之后渲染,它仍然会在其后面渲染三角形。

例如,我正在尝试渲染一棵松树,它基本上是一些相互堆叠的锥体,具有透明的底部。下图显示了启用深度缓冲区时出现的问题:

您可以看到仍然可以看到透明三角形的轮廓。

下一张图显示了禁用深度缓冲区时的样子。

在这里您可以看到树后面的一些三角形是如何在树的其余部分前面渲染的。

任何想法如何解决这个问题,并正确渲染松树?

附:我正在使用着色器来渲染所有内容。

【问题讨论】:

    标签: c++ opengl shader alpha-transparency depth-buffer


    【解决方案1】:

    如果您没有使用任何部分透明度(所有值都是 0 或 255),您可以 glEnable(GL_ALPHA_TEST) 这应该会对您有所帮助。问题是,如果您首先渲染顶部圆锥,它会将整个四边形放入 z 缓冲区(甚至是透明部分),因此下方的较低分支在绘制时会被 z 拒绝。如果像素未通过 alpha 测试(使用 glAlphaFunc 设置),启用 alpha 测试不会将像素写入 z 缓冲区。

    如果您想使用部分透明度,则需要按照您的情况从后到前或从下到上对渲染对象的顺序进行排序。

    您还需要启用 z-buffer。

    [edit] 哎呀,我意识到当您使用着色器时,我不相信这些功能会起作用。在着色器情况下,如果 alpha 值接近于零,您希望在片段着色器中使用丢弃函数。

    if(color.a < 0.01) {
       discard;
    } else {
       outcolor = color;
    }
    

    【讨论】:

    • ... 如果 alpha 在任何不支持 alpha 测试的环境(例如 ES 2.0 或 WebGL)中低于您所需的阈值,则在片段着色器中使用 discard
    • 当你有着色器(在桌面 OpenGL 中)时,它们确实可以工作。当您使用core OpenGL 3.1 or above 时,alpha 测试不起作用。
    • @Tim 所以我尝试使用丢弃,它似乎删除了片段着色器执行的任何颜色变化。但是,它似乎根本不影响深度缓冲区。使用丢弃时,我得到与启用深度缓冲区的图片相同的结果。
    • 在渲染树(顺便说一句,这是一个单一模型)之前,我也尝试了 glEnable(GL_ALPHA_TEST),但这似乎也不会影响结果。
    • 实际上,除了使用 GL_ALPHA_TEST 之外,我还设置了 glAlphaFunc(),方法是:glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER,0.9f); // Render Tree glDisable(GL_ALPHA_TEST); 这很有效!虽然,这不适用于半透明模型。有什么方法可以渲染半透明模型而不会出现深度缓冲区问题?
    【解决方案2】:

    你需要实现一个两遍算法。

    第一遍只渲染背面,而第二遍只渲染正面。

    通过这种方式,您不需要对三角形进行排序,但根据您的几何图形是否凸面,可能会出现一些伪影。

    【讨论】:

      【解决方案3】:

      我可能是错的,但这是因为当您在 3d 中渲染时,您不会使用 Directx 的默认设置渲染三角形的背面,当 Z 被移除时 - 它会按顺序绘制它们,而 Z 不会绘制三角形的背面了。 即使启用了 Z,也可以显示三角形的两侧,但是我认为它通常启用可能是有原因的.. 例如速度..

      Device->SetRenderState(D3DRS_CULLMODE, Value);
      

      值可以相等

      D3DCULL_NONE - Shows both sides of triangle
      D3DCULL_CW - Culls Front side of triangle
      D3DCULL_CCW - Default state
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-31
        • 2012-03-14
        • 1970-01-01
        • 2019-11-24
        • 2014-04-03
        • 2013-12-27
        • 2011-11-12
        • 1970-01-01
        相关资源
        最近更新 更多