У меня сейчас происходит нечто довольно странное с моим кодом. Я запускаю это на 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 в любом случае не влияет на готовое изображение. Я не могу понять это.
По умолчанию тестирование глубины отключено. Вы должны включить его с помощью glEnable (GL_DEPTH_TEST). Причина, по которой он работает, когда вы включаете отбраковку, состоит в том, что треугольники, обращенные назад, не прорисованы, и поскольку куб является выпуклым многогранником, ни один четырехугольный фронт не будет перекрывать другой фронтальный четырехугольник. Однако, если вы попытаетесь отобразить второй куб, вы также увидите проблемы с глубиной, если только вы не включите тестирование глубины.
Я наконец получил это на работу. Проблема была с кодом установки 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 все равно не поддерживается. Возможно, это поможет кому-то там попытаться выяснить, почему предоставленное включение вызывает этот забавный результат, который я назвал своей проблемой.