OpenGL ES 2.0 Объекты исчезают при включенном тесте глубины

редактироватьЭто оказалось правильным, надеюсь, это все еще помогает другим с подобными проблемами.

Есть что-то, чего мне не хватает при настройке конвейера тестирования глубины в 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);
}

Все объекты имеют оттенок чистого зеленого цвета, темнее для ближе и ярче для дальнейшего, как и ожидалось. К сожалению, некоторые более (более яркие) объекты рисуются над более близкими (более темными) объектами.

Есть идеи, что мне не хватает? (Если ничего другого, я надеюсь, что это обобщает некоторые проблемы, которые были у других).

0

Решение

Похоже, я ничего не пропустил. У меня был мошеннический многоугольник (в другой шейдерной программе), который, когда была включена глубина, закрывал все. Выше приведена правильная настройка.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector