Испорчен буфер глубины OpenGL?

У меня сейчас происходит нечто довольно странное с моим кодом. Я запускаю это на BlackBerry Playbook, и это OpenGL ES 1.1

РЕДАКТИРОВАТЬ 4: я удалил все, что я опубликовал, чтобы упростить мой вопрос.

Я взял код и упростил его до рисования двух перекрывающихся треугольников. Вот массив, содержащий координаты, а также массив, содержащий цвета:

GLfloat vertices[] =
{
// front
175.0f, 200.0f, -24.0f,
225.0f, 200.0f, -24.0f,
225.0f, 250.0f, -24.0f,

// back
200.0f, 200.0f, -25.0f,
250.0f, 200.0f, -25.0f,
250.0f, 250.0f, -25.0f
};static const GLfloat colors[] =
{
/* front  */  1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f, //Red
/* back  */  0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f //Green
};

Обратите внимание, что мои координаты от 0 до 1024 в направлении x и от 0 до 600 в направлении y, а также от 0 до -10000 в направлении z.

Вот мой установочный код, который отражает это:

    glClearDepthf(1.0f);
glClearColor(1.0f,1.0f,1.0f,1.0f);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glShadeModel(GL_SMOOTH);

glViewport(0, 0, surface_width, surface_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrthof(0, surface_width, 0, surface_height, 0, 10000);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

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

Наконец, вот мой код рендеринга:

void render()
{
//Typical render pass
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 0, colors);

glDrawArrays(GL_TRIANGLES, 0 , 6);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

//Use utility code to update the screen
bbutil_swap();
}

Проблема в том, что независимо от того, что я делаю, зеленый треугольник всегда накладывается поверх красного. Изменение значений z в любом случае не влияет на готовое изображение. Я не могу понять это.

0

Решение

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

5

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

Я наконец получил это на работу. Проблема была с кодом установки EGL, который я использовал, который был предоставлен. В bbutil.c (в моем случае .cpp) есть некоторый код:

if(!eglChooseConfig(egl_disp, attrib_list, &egl_conf, 1, &num_configs)) {
bbutil_terminate();
return EXIT_FAILURE;
}

(это не весь код в файле, а его важный бит)

Это в основном странно, если данный список атрибутов не поддерживается. Вверх по файлу attrib_list устанавливается следующим образом:

EGLint attrib_list[]= { EGL_RED_SIZE,        8,
EGL_GREEN_SIZE,      8,
EGL_BLUE_SIZE,       8,
EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, 0,
EGL_NONE};

Не указан буфер глубины. Теперь, если вы посмотрите в спецификации EGL, там написано, что глубина по умолчанию отсутствует. Бинго, это проблема. Поэтому я просто изменил его, чтобы он выглядел так:

EGLint attrib_list[]= { EGL_RED_SIZE,        8,
EGL_GREEN_SIZE,      8,
EGL_BLUE_SIZE,       8,
EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, 0,
EGL_DEPTH_SIZE, 24,
EGL_NONE};

Обратите внимание на EGL_DEPTH_SIZE и 24. Это устанавливает буфер глубины на 24 бита. В PlayBook 32 выдает ошибку сегментации, хотя обычно 32 все равно не поддерживается. Возможно, это поможет кому-то там попытаться выяснить, почему предоставленное включение вызывает этот забавный результат, который я назвал своей проблемой.

3