我将格式设置为:
QGLFormat format = QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer);
setFormat(format);
构造函数中的。
然后在 initializeGL 中设置depthTesting。
void VoxelEditor::initializeGL()
{
glClearDepth(2000.0); // Enables Clearing Of The Depth Buffer
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LESS); // The Type Of Depth Test To Do
glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
}
在paintGL中我清除深度缓冲区。
void VoxelEditor::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw();
}
我记得它曾经使用较少的顶点,所以可能是我使用了太多的深度缓冲区来处理(?)。 我有32 * 32 * 32体素,大部分时间都是一半,所以98304四边形。
深度测试仍然不起作用,并按执行顺序显示四边形。
答案 0 :(得分:1)
因此我可能会使用太多的深度缓冲来处理(?)。
深度缓冲区忽略了顶点。所有它看到的都是传入的碎片,无论多少都无关紧要。
void VoxelEditor::initializeGL() { glClearDepth(2000.0); // Enables Clearing Of The Depth Buffer
此行无法清除。它设置深度缓冲区被清除的值。该值必须在0 ... 1范围内。清除深度在标准化设备坐标中,即在模型视图之后,已应用投影和均匀分割。默认值为1.
glEnable(GL_DEPTH_TEST); // Enables Depth Testing glDepthFunc(GL_LESS); // The Type Of Depth Test To Do glShadeModel(GL_SMOOTH) // Enables Smooth Color Shading glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
不,那不是什么意思。透视只是一个线性变换,总是起作用。这意味着,纹理坐标可以以不同的方式进行插值以提高质量。
}
我总是建议将这些调用放在绘图函数中,因为它们不会初始化任何内容。他们设定了绘画状态。 OpenGL是一个状态机,一个重要的状态机规则是,要么你要跟踪它们的状态或,你必须在它们使用它时将它们置于已知状态。
答案 1 :(得分:1)
我通过在draw()中设置setDepthTest来修复此问题。
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);