渲染选定网格面的正射投影时,OpenGL 深度测试不起作用

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

我正在尝试在 OpenGL 中渲染选定网格面的正交投影。网格有一个洞,我只想显示从观察者的角度可见的面。然而,仍然存在隐藏表面渲染的问题。我启用了深度测试来处理这个问题,但似乎没有任何效果。尽管我将代码配置为跳过隐藏的面,但它们在最终渲染中仍然可见。我该如何解决这个问题?

我的代码的一部分:

// Setting up the depth test and culling
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_GREATER);  // Using GL_GREATER for depth testing
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

// Clearing color and depth buffer
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Clear color and depth buffers

// Drawing selected faces
glBegin(GL_TRIANGLES);
for (const auto& face : m.cm.face) {
    if (!face.IsD() && face.IsS()) {  // Only process selected faces
        for (int i = 0; i < 3; ++i) {
            const auto& vert = *face.V(i);
            const vcg::TexCoord2<float>& texCoord = face.WT(i);
            glTexCoord2f(texCoord.U(), texCoord.V());
            glVertex3f(vert.P().X(), vert.P().Y(), vert.P().Z());
        }
    }
}
glEnd();

我设置了

glOrtho(minX, maxX, minY, maxY, minZ - 1.0f, maxZ + 1.0f);

这是网格: enter image description here

洞如: enter image description here

这是我的结果img:

enter image description here

我不希望“I-观察者”在网格正面看不到纹理的部分。

我已使用 glEnable(GL_DEPTH_TEST) 启用深度测试并设置 glDepthFunc(GL_GREATER)。我还使用 glEnable(GL_CULL_FACE) 和 glCullFace(GL_BACK) 启用了背面剔除,但此设置似乎并没有消除渲染输出中的隐藏面。假设网格有一个洞,如何确保仅正确渲染可见面而不显示隐藏面?

我尝试将原来的

glOrtho(minX, maxX, minY, maxY, minZ - 1.0f, maxZ + 1.0f);
更改为
glOrtho(minX, maxX, minY, maxY, minZ - 1.0f, maxZ - 1.5f);
效果如图: enter image description here 但这不是我想要的效果。我想绘制在正交视图中可以看到的纹理。这样做会去掉不该去掉的部分,而且看起来还是有点刺耳(图中红框部分)。

c++ opengl rendering mesh depth-testing
1个回答
0
投票

我想我解决了问题。启用深度测试后,FBO(帧缓冲区对象)中不再有额外的深度缓冲区。如果没有深度缓冲区,深度测试就无法在 FBO 中正常工作。这意味着深度测试设置GL_GREATER(大于测试)不会生效,因为没有地方存储和比较深度值。

只需添加以下代码:

    glGenTextures(1, &depthTexture);
    glBindTexture(GL_TEXTURE_2D, depthTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, desiredWidth, 
    desiredHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
© www.soinside.com 2019 - 2024. All rights reserved.