OpenGL: Как я могу поместить VIP-трибуну в бесконечность

Я должен знать, как я могу сделать VIP-трибуну, появляется, как это находится в бесконечности?? Я знаю, что это - что-то связанное с глубиной, но я не знаю точную вещь отключить или включить??

7
задан genpfault 10 March 2012 в 03:49
поделиться

4 ответа

Нет бесконечности. Скайбокс - это просто текстурированный бокс с нормальным размером 0,0,0 посередине. Вот небольшой урок: текст ссылки

1
ответ дан 6 December 2019 в 11:46
поделиться

Сначала отключите запись / тестирование глубины (вам не нужно беспокоиться об отключении проверки глубины, если вы сначала рисуете скайбокс и очищаете буфер глубины):

glDisable(GL_DEPTH_TEST);
glDepthMask(false);

Затем переместите камеру в начало координат и поверните ее в обратном направлении по отношению к матрице вида модели:

// assume we're working with the modelview
glPushMatrix();

// inverseModelView is a 4x4 matrix with no translation and a transposed 
// upper 3x3 portion from the regular modelview
glLoadMatrix(&inverseModelView);

Теперь нарисуйте свой небесный бокс и снова включите запись глубины:

DrawSkybox();

glPopMatrix();
glDepthMask(true);
glEnable(GL_DEPTH_TEST);

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

Вы должны сделать это перед отрисовкой чего-либо, чтобы все записи цветного буфера происходили поверх вашего небесного бокса.

11
ответ дан 6 December 2019 в 11:46
поделиться

Лучший подход, который я могу придумать, - это нарисовать его на первом проходе (или на слое), а затем очистить только буфер глубины. После этого просто нарисуйте остальную часть сцены в другом проходе. Таким образом, скайбокс всегда останется «позади» сцены. Просто не забудьте использовать одну и ту же камеру для обоих проходов и каким-то образом привязать скайбокс к камере.

0
ответ дан 6 December 2019 в 11:46
поделиться

Сначала очистите буфер.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Затем сохраните текущую матрицу просмотра модели и загрузите тождество.

glPushMatrix();
glLoadIdentity();

Затем визуализируйте свой скайбокс.

Skybox.render();

Затем очистите буфер глубины и продолжите рендеринг в обычном режиме

glClear(GL_DEPTH_BUFFER_BIT);

OtherStuff.render();

glutSwapBuffers();
3
ответ дан 6 December 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: