【问题标题】:OpenGL is not discarding my fragments when depth testing is enabled启用深度测试后,OpenGL 不会丢弃我的片段
【发布时间】:2020-06-06 08:40:23
【问题描述】:

我正在用 wxWidgets 3.1.3 编写一个 OpenGL 渲染器。我可以看到隐藏在我的模型后面的碎片,但即使它们应该被遮蔽,它们也朝向我。将我的片段着色器设置为显示深度表明深度设置正确,并且我有 znear=0.1 和 zfar=100。

这是我的 OpenGL 初始化代码:

this->m_glcontext = new wxGLContext(this);
this->SetCurrent(*this->m_glcontext);

std::remove(ENGINECANVAS_LOG_PATH);

glewExperimental = GL_TRUE;
glewInit();
glLoadIdentity();

glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);;

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);

glDebugMessageCallback(MessageCallback, 0);

this->Bind(wxEVT_PAINT, &EngineCanvas::Paint, this);
this->Render();

这是我的渲染循环:

glViewport(0, 0, (GLint)this->GetSize().x, (GLint)this->GetSize().y);

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

this->m_active_camera->GenPerspMat((float)canvas->GetSize().x, (float)canvas->GetSize().y);
this->m_active_camera->GenViewMat();

for (size_t i = 0; i < this->models.size(); i++)
{
    this->models.at(i)->GenPosMat();

    this->models.at(i)->shader_program->Select(); //selects shader program

    this->m_active_camera->SetUniforms(this->models.at(i)->shader_program);
    this->models.at(i)->SetUniforms();
        glBindVertexArray(this->models.at(i)->vao);

    for (size_t j = 0; j < this->models.at(i)->vertex_buffers_count.size(); j++)
    {
        glBindBuffer(GL_ARRAY_BUFFER, this->models.at(i)->vertex_buffers.at(j));
        glDrawArrays(this->models.at(i)->triangle_mode, 0, this->models.at(i)->vertex_buffers_count.at(j));
    }
}

glFlush();
this->SwapBuffers();

片段着色器:

#version 400 core
layout(location = 0) out vec4 frag_out;
in vec3 vpos;

void main()
{
    frag_out = vec4(vec3(gl_FragCoord.z).xyz, 1.0f);
}

我的片段在我的 NVIDIA 显卡上被丢弃,但在两台不同的笔记本电脑和我的集成显卡上进行测试会产生此错误。我的几何本身可以正确渲染。回调没有返回错误(回调正在工作)。所有卡都至少支持 OpenGL 4.0(在我的着色器和我的 GLCanvas 参数中指定)。

【问题讨论】:

  • 可能默认的帧缓冲区没有深度缓冲区(这取决于系统)。设置 OpenGL 小部件时是否明确强制创建深度缓冲区?见wxGLAttributes。另请参阅wxGLCanvas
  • @Rabbid76 非常感谢您的帮助。这对我来说是固定的。我以它们在 wiki 页面上显示的传统方式(整数数组)向 GLCanvas 提供我的论点,但这已经修复了它。如果您关心代表,我很乐意接受空白答案,但除此之外,我真诚地感谢您的帮助。

标签: c++ opengl wxwidgets


【解决方案1】:

感谢 Rabbid76,

我需要在 wxGLCanvas 的参数中指定深度缓冲区。我需要使用 wxGLAttributes 类并传递它,而不是在 wiki 示例中提供整数数组。

wxGLAttributes args;
args.PlatformDefaults().Depth(24).Stencil(8).RGBA().DoubleBuffer().EndList();

现在我知道去哪里找了,这在 wxWidgets 提供的金字塔示例中有记录。

【讨论】:

    猜你喜欢
    • 2019-12-25
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多