OpenGL: как я могу поставить скайбокс в бесконечность - PullRequest
7 голосов
/ 18 мая 2010

Мне нужно знать, как сделать так, чтобы скайбокс появлялся в бесконечности ?? Я знаю, что это связано с глубиной, но я не знаю, что именно нужно отключить или включить ??

Ответы [ 5 ]

11 голосов
/ 18 мая 2010

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

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(), чтобы убедиться, что другие ваши состояния правильно установлены после того, как вы тоже нарисуете скайбокс (обязательно выключите такие вещи, как освещение или смешивание, если необходимо).

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

3 голосов
/ 19 мая 2010

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

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

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

glPushMatrix();
glLoadIdentity();

Затем просмотрите ваш скайбокс.

Skybox.render();

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

glClear(GL_DEPTH_BUFFER_BIT);

OtherStuff.render();

glutSwapBuffers();
2 голосов
/ 10 марта 2012

Во-первых, единственной проблемой при рисовании небесного блока является то, что ваш пиксельный шейдер будет выполняться для каждого пикселя в небесном боксе.Просто чтобы потом перезаписать другой объект в вашем мире.Лучше всего сначала визуализировать все непрозрачные объекты, а затем визуализировать ваш скайбокс.Таким образом, пиксельный шейдер для Sky Box выполняется только для пикселя, который прошел тест z-буфера.

1 голос
/ 18 мая 2010

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

0 голосов
/ 19 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...