【问题标题】:Depth test with two transparent images causes strange artifacts使用两个透明图像进行深度测试会导致奇怪的伪影
【发布时间】:2018-04-18 08:54:37
【问题描述】:

我正在渲染一个由两个相同图像组成的灌木,如下图所示:

但是当我们绕过灌木丛时,两张图片中的一张的深度测试明显存在很大问题:

我尝试禁用深度测试,但情况更糟(背景灌木与前面的灌木重叠)。 我只是使用这段代码来渲染灌木丛(m_tex 和 m_vertex 是加载到文件中的灌木丛的坐标):

//Scene initialisation
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

//Then we render objects one per one
glBindTexture(GL_TEXTURE_2D, m_texture);
glBegin(GL_QUADS);
    glTexCoord2d(m_tex[0][0], m_tex[0][1]); glVertex3d(m_vertex[0][0] + coordinates[0], m_vertex[0][1] + coordinates[1], m_vertex[0][2] + coordinates[2]);
    glTexCoord2d(m_tex[1][0], m_tex[1][1]); glVertex3d(m_vertex[1][0] + coordinates[0], m_vertex[1][1] + coordinates[1], m_vertex[1][2] + coordinates[2]);
    glTexCoord2d(m_tex[2][0], m_tex[2][1]); glVertex3d(m_vertex[2][0] + coordinates[0], m_vertex[2][1] + coordinates[1], m_vertex[2][2] + coordinates[2]);
    glTexCoord2d(m_tex[3][0], m_tex[3][1]); glVertex3d(m_vertex[3][0] + coordinates[0], m_vertex[3][1] + coordinates[1], m_vertex[3][2] + coordinates[2]);
glEnd();

我怎样才能修复这个错误并对这两个图像进行相关的深度测试?

【问题讨论】:

    标签: c++ opengl alphablending depth-testing


    【解决方案1】:

    首先,即时模式(glBegin()、glEnd() 等)现在已被弃用,所以我建议避免使用它,特别是如果你现在正在学习 OpenGL(看看在文档here)。

    除此之外,您应该发布一个完整示例(看看here),因为有几件事会导致您描述的效果(您的场景是如何初始化的?,如何你加载纹理?,它们真的是 RGBA 吗?等等)。

    【讨论】:

    • 首先,灌木丛由两个相同的图像组成,具有相同的加载纹理,并且两个图像中的一个完美工作,所以我认为问题不来自那里。纹理是 RGBA 并且即使它们以相同的方式渲染,两者中只有一个不起作用的事实让我认为这是导致这种效果的深度测试。当我禁用它时,这个问题得到了解决,但出现了其他几个问题,所以这不是准确的解决方案......
    • 您应该阅读订单独立透明度 (here)。问题是,您应该确保图元相对于视点从远到近呈现。这就是为什么有时它有效,有时无效。解决这个问题的大多数现代技术都涉及着色器,这就是为什么我对即时模式的评论......
    • 但在我的情况下,这两个图像相交,所以在这种情况下,订单独立透明度是否有效?
    • 重点是,片段的渲染顺序很重要。对于广告牌,有一些老技巧,例如发布在 here 的那个。
    • 这就是存在深度剥离等技术的原因。但同样,在你的情况下,它只是经典的广告牌。 here 还有一个关于它的问题,我相信你会找到很多关于它的...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2020-10-18
    • 2014-03-05
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多