редактироватьЭто оказалось правильным, надеюсь, это все еще помогает другим с подобными проблемами.
Есть что-то, чего мне не хватает при настройке конвейера тестирования глубины в OpenGL ES 2.0 (с использованием EGL)?
Я нашел много вопросов по этому поводу, но все они были решены путем правильной настройки буфера глубины при инициализации контекста:
EGLint egl_attributes[] = {
...
EGL_DEPTH_SIZE, 16,
...
EGL_NONE };
if (!eglChooseConfig(
m_eglDisplay, egl_attributes, &m_eglConfig, 1, &numConfigs)) {
cerr << "Failed to set EGL configuration" << endl;
return EGL_FALSE;
}
или путем правильного включения и очистки буфера глубины и выполнения этого после инициализации контекста:
// Set the viewport
glViewport(0, 0, m_display->width(), m_display->height());
// Enable culling and depth testing
glEnable(GL_CULL_FACE);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
// Clear the color and depth buffers
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepthf(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Draw elements
m_Program->drawAll();
Комментируя glEnable(GL_DEPTH_TEST)
У меня есть сцена, но без окклюзии теста глубины я бы хотел иметь.
В шейдере выводим z
составляющая gl_Position
визуально работает как положено (z
значения находятся в диапазоне [0, 1]):
// Vertex Shader
uniform mat4 u_matrix;
attribute vec4 a_position;
varying float v_depth;
void main() {
vec4 v_position = u_matrix * a_position;
v_depth = v_position.z / v_position.w;
gl_Position = v_position;
}
// Fragment shader
varying float v_depth;
void main() {
gl_FragColor = vec4((v_depth < 0.0) ? 1.0 : 0.0,
v_depth,
(v_depth > 1.0) ? 1.0 : 0.0,
1.0);
}
Все объекты имеют оттенок чистого зеленого цвета, темнее для ближе и ярче для дальнейшего, как и ожидалось. К сожалению, некоторые более (более яркие) объекты рисуются над более близкими (более темными) объектами.
Есть идеи, что мне не хватает? (Если ничего другого, я надеюсь, что это обобщает некоторые проблемы, которые были у других).
Похоже, я ничего не пропустил. У меня был мошеннический многоугольник (в другой шейдерной программе), который, когда была включена глубина, закрывал все. Выше приведена правильная настройка.
Других решений пока нет …