2015-05-03 5 views
5

При рендеринге неба с фиксированной текстурой в 3D-играх люди часто создают 6 текстур в карте куба, а затем визуализируют куб вокруг камеры. В GLSL вы можете получить доступ к пикселам в текстурах с нормальным, а не координатой текстуры, и вы можете легко получить это нормальным путем нормализации положения фрагмента относительно камеры. Однако этот процесс может быть выполнен с любой формой, которая окружает камеру, потому что, когда вы нормализуете каждую позицию, она всегда будет иметь сферу. Теперь мне интересно: Почему это всегда куб, а не тетраэдр? Оказание куба занимает 12 треугольников, всего четыре тетраэдра 4. И, как я уже сказал, любая форма, окружающая камеру, работает. Таким образом, тетраэдры занимают меньше VRAM и быстрее обрабатываются без каких-либо недостатков? Почему бы не использовать их?Почему люди не используют тетраэдры для небоскребов?

+1

скайбоксов просты в реализации и легко определить координаты текстуры. Вот почему это более распространено. –

+0

Ну, вам не нужны текстурные координаты. Я думаю, что определение вершинной позиции немного сложно. – Pikaju

ответ

4

Вам не нужна геометрия среды на всех. Все, что вам нужно сделать, это рисовать полноэкранный квадрат и просто вычислить правильные координаты текстуры для него. Теперь с современной GL, мы не должны даже поставлять данные вершин для этого, мы можем использовать attributless рендеринга:

Vertex Shader:

#version 330 core 
out vec3 dir; 
uniform mat4 invPV; 
void main() 
{ 
     vec2 pos = vec2((gl_VertexID & 2)>>1, 1 - (gl_VertexID & 1)) * 2.0 - 1.0; 
     vec4 front= invPV * vec4(pos, -1.0, 1.0); 
     vec4 back = invPV * vec4(pos, 1.0, 1.0); 

     dir=back.xyz/back.w - front.xyz/front.w; 
     gl_Position = vec4(pos,1.0,1.0); 
} 

где invPV является inverse(Projection*View), поэтому он будет принимать ваши ориентации камеры, а также проекции. Это в принципе может быть дополнительно упрощено, в зависимости от того, сколько ограничений вы можете наложить на матрицу проекции.

Фрагмент Shader:

#version 330 core 
in vec3 dir; 
out color; 
uniform samplerCube uTexEnv; 
void main() 
{ 
     color=texture(uTexEnv, dir); 
} 

Чтобы использовать это, вам просто нужно связать пустой ВАО и текстуру, загружать invPV матрицу и вызывать glDrawArrays(GL_TRIANGLE_STRIP, 0, 4).

Такой подход, конечно, может быть использован для сферического отображения текстуры вместо карт куба

5
  1. это вопрос глубины представления и форма

    лучшего SKYBOX форма является (половина) сферы, поскольку его оштукатуренная поверхность проецирует в пространстве камеры практически без искажений. Если вы используете какую-либо другую фигуру, то артефакты проекции будут происходить особенно в углах, например, большинство приложений/игр используют куб skybox. Посмотрите на солнце с конечным радиусом (а не только на одну точку) и поверните представление, чтобы солнце попало из середины в сторону обзора. Затем, как правило, солнце искажается от формы кругового/диска с эллиптической/овальной формой:

    cube distortion example enter image description here

    это связанно с изменением расстояния между скайбоксом и камерой. Если сравнить его непосредственно оказали звезда:

    rendered sky (no skybox)

    , то вы можете увидеть разницу. Первое изображение является первым уместным изображением найдено Google (с некоторой игры) второй снимок экрана формы инженеров пространства я думаю, и последнее оказывают астро~d приложения шахтного см

    Так больше - форма, далекая от сферы, больше искажений, которые вы получаете.

    Использование 4-сторонней пирамиды еще хуже, чем куб, потому что углы между сторонами ухудшают создание еще больших артефактов. Другая проблема заключается в том, что вам нужно увеличить размер пирамиды, чтобы покрыть одно и то же пространство. Если вы используете Глубинный буфер с определенной целью во время skybox рендеринг, вы можете значительно повлиять на точность, увеличив Z_far самолет.

  2. Накладные

    различию между 6 и 4 полигонов не так много, потому что скайбокса огромен (обложка вся точка зрения) скорость определяется в основном подсчете пикселей/текселей, поданной не экран вершины подсчитываются. Таким образом, пирамида может быть еще медленнее, чем куб, потому что она должна иметь большие грани (требуется больше итераций интерполяции).Но если вы хотите использовать сферический skybox, тогда вам нужна также сферическая текстура, потому что если вы будете использовать стандартную текстуру куба, искажение будет по-прежнему присутствовать, и их сложнее сохранить, ... и вот почему кубы более используются ,

  3. Сферические скайбоксы

    они нуждаются в другой тип текстуры. Полусферическая текстура выглядит следующим образом:

    hemisphericall texture

+1

Уверены ли вы в этом? Если бы я использовал 6 стандартных текстур и сопоставлял их с кубом с нормальными координатами текстуры, то да, он исказился бы. Но поскольку я нормализую вершинные позиции в шейдере фрагмента, я получаю сферу, и, как вы уже сказали, шар идеально подходит для skybox. А также, интерполяция лиц на самом деле не должна иметь значения, так как размер модели совершенно не имеет значения (если буфер глубины отключен) ... – Pikaju

+0

@Pikaju Я согласен, но чтобы он работал, вам нужна сферически отображаемая текстура вместо кубического один или иначе у вас будет идеальный сферический skybox с искаженной текстурой на нем, который имеет похожие результаты, например, cube skybox – Spektre

+0

@Pikaju добавлено изображение примера полусферической текстуры до конца ответа – Spektre

Смежные вопросы