两个重叠精灵的渲染不正确

问题描述 投票:0回答:1

这就是绘制多个精灵(纹理四边形)时的问题 前面的精灵,剪辑了后面的精灵,我将无法向用户显示它后面的内容。

我的预期输出是正确显示两个纹理,如下图左侧所示:(右侧不正确)

有什么建议如何解决这个问题吗?

这是我的代码:

绘图功能:


    shader_begin(self->shader);
    glEnable(GL_DEPTH_TEST);
    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDepthFunc(GL_LESS);
    glBlendEquation(GL_ADD);
    glDisable(GL_CULL_FACE);

    glBindTexture(GL_TEXTURE_2D, tex_id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glBindVertexArray(vao);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    shader_end();

顶点着色器:

  gl_Position = view_projection * world * vec4(point, 1);
c opengl graphics glsl
1个回答
0
投票

如果您使用混合,则必须禁用深度测试。片段在混合之前会被深度测试丢弃,在深度测试期间未丢弃的片段将被混合。所以这取决于对象的绘制顺序。如果使用混合,则必须停用深度测试并从后到前绘制按深度排序的对象。这也意味着必须将网格划分为其基元,并且必须对基元进行排序,甚至必须分割基元。
另请参阅透明度排序OpenGL 深度排序OpenGL:透明纹理问题

如果 alpha 值仅为 0 或 1,则另一种解决方案是根据片段的 alpha 值丢弃片段,而不是混合它们。禁用混合,但在

Fragment Shader
中使用 discard 片段。例如:

void main() {

    [...]

    if (color.a < 0.5)
        discard;

    gl_FragColor = color;
}
© www.soinside.com 2019 - 2024. All rights reserved.