У меня есть QtOpenglWidget с запущенным OpenGL 3.3, который пытается выполнить рендеринг экземпляра, но мой z-буфер не работает.
В настоящее время я добавляю 3 тестовых куба в порядке отрисовки куб3, куб2, затем куб1, и изменение его показывает, что он просто отображает последний нарисованный куб. Я также знаю, что 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);
}
EDIT Я обнаружил, что это может быть проблема QtWidget. Первое, что вызывается в main
, это
QSurfaceFormat format;
format.setVersion(3, 3);
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
glDepthFunc(GL_GREATER)
удалять все? - person FrickeFresh   schedule 29.12.2017GL_GREATER
не должна иметь никакого эффекта. Другая возможность заключается в том, что вы просто проецируете все на одну и ту же плоскость. Вы можете подумать, что исключили это, визуализировавgl_Position.z
, но на самом деле значение z, которое будет использовать тест глубины, получено изgl_Position.z / gl_Position.w
, и вы могли построить такую проекционную матрицу. - person derhass   schedule 29.12.2017gl_Position.z / gl_Position.w
является константой, я мог бы представить гипотетический случай, когда вы устанавливаетеglDepthRange
, который отображает все в одно значение, но это действительно очень гипотетически и будет более или менее намеренно нарушать тест глубины, поэтому я не думаю это тот случай. - person derhass   schedule 29.12.2017gl_Position.z / gl_Position.w
, так как все кубики белые независимо от того, я собираюсь снова попытаться обмануть свой MVP - person FrickeFresh   schedule 29.12.2017(0 0 a 0)
, а четвертая строка как(0 0 b 0)
, что полностью разделяет глубину, проецируя все наz_ndc=a/b
. Но вы также можете использовать другие средства для достижения того же эффекта, например, в матрицах модели или представления. - person derhass   schedule 29.12.2017