gpt4 book ai didi

opengl - 在 GL_LINES 中使用深度缓冲区

转载 作者:行者123 更新时间:2023-12-03 20:44:05 24 4
gpt4 key购买 nike

我想绘制一个删除隐藏边缘的对象的边缘。我想应用的想法是首先将对象的面渲染到深度缓冲区,然后在第二遍中绘制边缘并启用深度测试。

由于并非所有三角形边都应该可见,因此这些边是单独存储的(简单示例:在立方体中,对角边不应该可见,尽管它们在那里是因为四边形被渲染为两个三角形)。因此,这些面是使用 GL_TRIANGLES 绘制的。 ,使用 GL_LINES 绘制边缘带有单独的顶点缓冲区。

问题是隐藏的边缘在此设置中部分显示,可见边缘部分隐藏。我怎样才能达到正确的结果?

  • 没有深度测试:

    Without depth testing
  • 深度测试:

    With depth testing
  • 渲染到深度缓冲区的面:

    Faces only

  • 我使用带有附加颜色和深度缓冲区的帧缓冲区来绘制我的对象。
    // Color buffer setup.
    glBindTexture(GL_TEXTURE_2D, objectEdges);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 360, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);

    // Depth buffer setup.
    glBindRenderbuffer(GL_RENDERBUFFER, objectFaces);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 640, 360);

    // Framebuffer setup.
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
    GL_TEXTURE_2D, objectEdges, 0);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
    GL_RENDERBUFFER, objectFaces);
    assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
    assert(glGetError() == GL_NO_ERROR);

    此设置可以正常工作。我绘制我的对象如下:
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    glDepthMask(GL_TRUE);
    glBindVertexArrayOES(vertexArray_faces);
    glDrawArrays(GL_TRIANGLES, 0, vertexCount_faces);
    glBindVertexArrayOES(0);

    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    glDepthMask(GL_FALSE);
    glBindVertexArrayOES(vertexArray_edges);
    glDrawArrays(GL_LINES, 0, vertexCount_edges);
    glBindVertexArrayOES(0);

    glDisable(GL_DEPTH_TEST);

    使用的着色器只是一个标准的模型- View -投影顶点着色器,以及一个为所有片段输出白色的片段着色器。
    GLKMatrix4 projectionMatrix = 
    GLKMatrix4MakePerspective(
    GLKMathDegreesToRadians(65.0f), 640.0 / 360.0f, 0.01f, 10.0f);
    GLKMatrix4 modelViewMatrix =
    GLKMatrix4MakeLookAt(0.2f, 0.4f, 0.2f, 0.2f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    最佳答案

    您遇到的问题是,线的深度值计算方式与填充图元的计算方式略有不同。您尝试做的事情正是所谓的“多边形冲突”存在的原因之一。整个事情在附录中的官方编程指南中有描述:"Hidden-Line Removal"

    关于opengl - 在 GL_LINES 中使用深度缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8255034/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com