Установка буфера минимальной глубины ничего не изменила для меня (вероятно, потому что настройка платформы была уже 24, но проверка этих значений по умолчанию не лишена достоинств).Проблема в том, что отображаемый порядок ребер куба по-прежнему выглядит неправильно: ребро, которое должно быть ближе, закрашено пирамидой.
Поскольку вы ничего не делаете с видимостью ребер, возникает иллюзия, что куб должен вращаться в направлении, противоположном и перпендикулярном вращению пирамиды.
Проблема в том, что это неправильная пирамида.Позвольте мне доказать, что:
glBegin(GL_QUADS);//(GL_LINE_LOOP);
glVertex3f( 1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glEnd();
Полученное изображение:
Куб вращается в предполагаемом направленииэто не наизнанку.Это означает, что пирамида есть.Одна из причин этого заключается в том, что мы на самом деле видим задние лица, а не передние.
Если я преобразую ваш код для эмуляции прозрачной пирамиды, но сохраню настройки отбраковки по умолчанию:
void MainWindow::initializeGL()
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
/*...*/
glFrontFace(GL_CCW);
glBegin(GL_TRIANGLES);
glColor4f(1.0f, 0.0f, 0.0f, 0.3f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glColor4f(0.0f, 1.0f, 0.0f, 0.3f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 0.3f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glColor4f(1.0f, 1.0f, 0.0f, 0.3f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
// bottom
glColor4f(0.0f, 1.0f, 1.0f, 0.3f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glEnd();
glFrontFace(GL_CW);
glBegin(GL_TRIANGLES);
glColor4f(1.0f, 0.0f, 0.0f, 0.6f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glColor4f(0.0f, 1.0f, 0.0f, 0.6f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 0.6f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glColor4f(1.0f, 1.0f, 0.0f, 0.6f);
glVertex3f(1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, -1.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
// bottom
glColor4f(0.0f, 1.0f, 1.0f, 0.6f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glEnd();
Я получаю изображение
Я все еще вижу, как вращается пирамида, все ее края и та линия куба, которая находится "позади", являетсяобрезается (потому что смешивание ничего не делает для проверки глубины).
Но теперь, если вы посмотрите на «жирные» грани пирамиды - я намеренно сделал невидимые грани без смешения жирным, придав им большее альфа-значение - вы 'Вы увидите, что они вращаются правильно, в том же направлении, что и куб.Это означает, что ваша сетка, пирамида, на самом деле перевернута "наизнанку".С невыпуклыми фигурами, которые были бы более очевидными, с выпуклыми, которые создают иллюзию противоположного вращения.
Все, что вам нужно сделать, это изменить порядок вершин или переключиться на GL_CW для пирамиды (по умолчанию GL_CCW).
Я предполагаю, что это ожидаемый вид пирамиды, если принять во внимание цвета лица.Если это не так, это означает, что вы предположили, что вершины с большей координатой Z находятся дальше от плоскости проекции.С матрицей проекции идентичности и функцией проверки глубины GL_LESS все наоборот.Имейте в виду, что если вы переключаете направление только на одну ось, которая буквально инвертирует все правила, связанные с направлением вращения, против часовой стрелки становится по часовой стрелке.
Примечание: трюк, который я использовал для иллюзии прозрачности, не работает так хорошо свыпуклые цифры.Зачем?Чтобы использовать смешение цветов, вы должны нарисовать грани в порядке их проверки глубины, делая это вручную.Мой грязный трюк дважды рисует все лица, но при отбраковке удаляются те, которые стоят перед камерой во время первого прохода, и удаляются те, которые обращены лицом во время второго прохода.Для невыпуклых, которые не соответствуют порядку - есть лица, которые стоят перед камерой, но находятся дальше, чем некоторые «скрытые», неправильный порядок.Требуется больше работы.Использование гибкого конвейера действительно меняет то, как OpenGL может справиться с этим.