При рендеринге неба с фиксированной текстурой в 3D-играх люди часто создают 6 текстур в карте куба, а затем визуализируют куб вокруг камеры. В GLSL вы можете получить доступ к пикселам в текстурах с нормальным, а не координатой текстуры, и вы можете легко получить это нормальным путем нормализации положения фрагмента относительно камеры. Однако этот процесс может быть выполнен с любой формой, которая окружает камеру, потому что, когда вы нормализуете каждую позицию, она всегда будет иметь сферу. Теперь мне интересно: Почему это всегда куб, а не тетраэдр? Оказание куба занимает 12 треугольников, всего четыре тетраэдра 4. И, как я уже сказал, любая форма, окружающая камеру, работает. Таким образом, тетраэдры занимают меньше VRAM и быстрее обрабатываются без каких-либо недостатков? Почему бы не использовать их?Почему люди не используют тетраэдры для небоскребов?
ответ
Вам не нужна геометрия среды на всех. Все, что вам нужно сделать, это рисовать полноэкранный квадрат и просто вычислить правильные координаты текстуры для него. Теперь с современной 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)
.
Такой подход, конечно, может быть использован для сферического отображения текстуры вместо карт куба
это вопрос глубины представления и форма
лучшего SKYBOX форма является (половина) сферы, поскольку его оштукатуренная поверхность проецирует в пространстве камеры практически без искажений. Если вы используете какую-либо другую фигуру, то артефакты проекции будут происходить особенно в углах, например, большинство приложений/игр используют куб skybox. Посмотрите на солнце с конечным радиусом (а не только на одну точку) и поверните представление, чтобы солнце попало из середины в сторону обзора. Затем, как правило, солнце искажается от формы кругового/диска с эллиптической/овальной формой:
это связанно с изменением расстояния между скайбоксом и камерой. Если сравнить его непосредственно оказали звезда:
, то вы можете увидеть разницу. Первое изображение является первым уместным изображением найдено Google (с некоторой игры) второй снимок экрана формы инженеров пространства я думаю, и последнее оказывают астро~d приложения шахтного см
Так больше - форма, далекая от сферы, больше искажений, которые вы получаете.
Использование 4-сторонней пирамиды еще хуже, чем куб, потому что углы между сторонами ухудшают создание еще больших артефактов. Другая проблема заключается в том, что вам нужно увеличить размер пирамиды, чтобы покрыть одно и то же пространство. Если вы используете Глубинный буфер с определенной целью во время skybox рендеринг, вы можете значительно повлиять на точность, увеличив Z_far самолет.
Накладные
различию между 6 и 4 полигонов не так много, потому что скайбокса огромен (обложка вся точка зрения) скорость определяется в основном подсчете пикселей/текселей, поданной не экран вершины подсчитываются. Таким образом, пирамида может быть еще медленнее, чем куб, потому что она должна иметь большие грани (требуется больше итераций интерполяции).Но если вы хотите использовать сферический skybox, тогда вам нужна также сферическая текстура, потому что если вы будете использовать стандартную текстуру куба, искажение будет по-прежнему присутствовать, и их сложнее сохранить, ... и вот почему кубы более используются ,
Сферические скайбоксы
они нуждаются в другой тип текстуры. Полусферическая текстура выглядит следующим образом:
Уверены ли вы в этом? Если бы я использовал 6 стандартных текстур и сопоставлял их с кубом с нормальными координатами текстуры, то да, он исказился бы. Но поскольку я нормализую вершинные позиции в шейдере фрагмента, я получаю сферу, и, как вы уже сказали, шар идеально подходит для skybox. А также, интерполяция лиц на самом деле не должна иметь значения, так как размер модели совершенно не имеет значения (если буфер глубины отключен) ... – Pikaju
@Pikaju Я согласен, но чтобы он работал, вам нужна сферически отображаемая текстура вместо кубического один или иначе у вас будет идеальный сферический skybox с искаженной текстурой на нем, который имеет похожие результаты, например, cube skybox – Spektre
@Pikaju добавлено изображение примера полусферической текстуры до конца ответа – Spektre
- 1. Почему люди используют textmate?
- 2. Почему люди используют ProjectData
- 3. Почему люди используют JSP?
- 4. Почему люди используют `Module.send (: prepend, ...)`?
- 5. Почему люди используют linq для sql?
- 6. pixel.gif, почему люди используют его?
- 7. Почему люди используют CommandManager.InvalidateRequerySposed() для ICommands?
- 8. Почему люди используют .net для веб-разработки
- 9. Почему люди используют ATL для программирования COM?
- 10. Почему люди не используют обмены xor?
- 11. Почему люди не используют <CFLOGIN>?
- 12. Torch- почему люди не используют активацию явно?
- 13. Почему люди используют вложенную нотацию для модулей, а не :: синтаксис?
- 14. Почему люди не используют последовательные номера для хранения изображений?
- 15. Почему люди используют CURLOPT_PROXYPORT 3128 без CURLOPT_PROXY?
- 16. Почему люди используют командную строку вместо IDE?
- 17. Почему люди используют несколько идентификаторов в CSS?
- 18. Почему люди используют переменные в некоторых случаях?
- 19. Почему люди используют скорость и/или NVelocity?
- 20. Почему люди используют комментарии как бизнес-логику
- 21. Почему люди используют _? как суффикс идентификатора?
- 22. Что люди используют Elasticsearch?
- 23. Почему не все люди используют emacs с viper-mode?
- 24. Почему люди используют node.js для предоставления http-сервиса?
- 25. Почему люди используют #ifdef для тестирования флагов объектов?
- 26. Почему люди используют Owin в signalr для maphub
- 27. Почему люди все еще используют угловой 1.4 для нового проекта?
- 28. Почему люди используют BufferedReader для чтения данных по почте
- 29. Почему люди просто не используют «базу данных объектов»?
- 30. Что люди используют для загрузки классов?
скайбоксов просты в реализации и легко определить координаты текстуры. Вот почему это более распространено. –
Ну, вам не нужны текстурные координаты. Я думаю, что определение вершинной позиции немного сложно. – Pikaju