0

我有一个运行 OpenGL 3.3 并尝试进行实例渲染的 QtOpenglWidget,但我的 z 缓冲区不起作用

目前,我按照 cube3、cube2、cube1 的绘制顺序添加了 3 个测试立方体,并更改它显示它只是显示最后绘制的立方体。我也知道DEPTH_TEST已启用,因为弄乱glDepthFunc不会显示任何内容。

在此处输入图像描述

我的初始化:

glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

我的抽奖:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

顶点:

layout(location = 0) in highp vec3 position;
layout(location = 1) in highp mat4 modelToWorld;
uniform mat4 MVP;
out highp float DEPTH;

void main() {
    gl_Position = MVP * modelToWorld * vec4(position, 1.0);
    DEPTH = gl_Position.z / 20.0f;
}

碎片:

in highp float DEPTH;
out highp vec4 fColor;
void main() {
   fColor = vec4(DEPTH, DEPTH, DEPTH,1.0);
}

编辑 我发现这可能是一个 QtWidget 问题,被调用的第一件事main

QSurfaceFormat format;
format.setVersion(3, 3);
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
4

1 回答 1

2

经过数小时的调试和参考示例,我发现了问题!

就是这条线

void MyWidget::resizeGL(int width, int height) {
    ...
    m_projection.perspective(45.0f, width / float(height), 0.0f, 1000.0f);
    ...
}

它应该是

void MyWidget::resizeGL(int width, int height) {
    ...
    m_projection.perspective(45.0f, width / float(height), 0.1f, 1000.0f);
    ...
}

显然将我的投影与 nearPlane 设置为 0 会导致这种情况。我实际上不知道为什么会发生这种情况,所以如果您知道,请在评论中告诉我

注意:这是QMatrix4x4

于 2017-12-30T00:08:04.040 回答