我正在尝试在 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);
这是我的结果img:
我不希望“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);
效果如图:
但这不是我想要的效果。我想绘制在正交视图中可以看到的纹理。这样做会去掉不该去掉的部分,而且看起来还是有点刺耳(图中红框部分)。
我想我解决了问题。启用深度测试后,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);