OpenGL не отбрасывает мои фрагменты, когда включено глубинное тестирование - PullRequest
2 голосов
/ 22 февраля 2020

Я пишу рендерер OpenGL с wxWidgets 3.1.3. Я могу видеть фрагменты, которые спрятаны за моей моделью, но обращены ко мне, даже когда они должны быть скрыты. Установка моего фрагментного шейдера для отображения глубины показывает, что глубины устанавливаются правильно, и у меня 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();

Вот мой рендер l oop:

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).

1 Ответ

2 голосов
/ 22 февраля 2020

Благодаря Rabbid76,

Мне нужно было указать буфер глубины в аргументах для wxGLCanvas. Вместо того, чтобы в вики-примере, где представлен массив целых чисел, мне нужно было использовать класс wxGLAttributes и передать его.

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

Теперь я знаю, где искать, это задокументировано в примере пирамиды. Предоставлено wxWidgets.

...