Я добавил небо к своему трассировщику лучей, которое отбирается, когда луч полностью пропускает какой-либо объект.
Что я делаю здесь, если луч полностью пропускает что-либо в сцене, он возвращает функцию шума Перлина в (ray.direction.x, ray.direction.y, ray.direction.z) - другими словами, он «пробует» сфера вокруг происхождения ".
Но это «выглядит неправильно» (потому что небо выглядит так, будто оно смотрит на тебя).
Как я могу улучшить небо и сделать его больше похожим на горизонт Земли?
Или это более или менее так должно выглядеть, и мне просто нужно добавить больше геометрии на пол?
sky
perlin-noise
bobobobo
источник
источник
Ответы:
В качестве альтернативы вы можете использовать кубическую карту с текстурой неба вместо перлин-шума. И я также думаю, что это сделает вашу сцену лучше благодаря наличию большего количества деталей и изменений в картографировании окружающей среды. Это именно то, что я сделал, когда внедрил свой raytracer.
Еще одна причина, по которой я рекомендую это, заключается в том, что окружающая среда не должна быть только облаками. Это может быть горы, это может быть сцена в помещении, может быть сцена из Марса. Используя кубическую карту, единственное, что вам нужно сделать, это поменять текстуру, и все готово.
Поэтому первым шагом будет поиск карты куба, которая соответствует вашим потребностям. Он может храниться в виде шести отдельных текстур или в виде одной текстуры, как показано ниже. Также проверьте эту ссылку для получения дополнительной информации о том, как создать свой собственный:
Затем в вашем коде я бы порекомендовал создать
CubeMap
класс для инкапсуляции расчетов выборки. Этот класс должен знать, как загрузить текстуру карты куба, и, имея луч, он должен знать, на каком лице и в каком положении брать образец. В моей реализации мне было проще хранить каждую из шести граней в отдельных текстурных объектах и ветвления в зависимости от направления луча:Если у вас еще нет
Texture
класса, просто создайте свой собственный. Это может быть так же просто, как двумерный массив цветов. Итак, просто для справки и без каких-либо гарантий эффективности или надежности этой реализации приведен код, который я использовал в своем проекте - CubeMap и CubeFace .источник
Вы можете попробовать использовать 2D Perlin с (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Проецирует вектор направления на плоскость Z = 1. Это должно дать вам эффект бесконечного (плоского) неба.
источник
Возможно, вы захотите проверить статью Ignig Quilez (iq) Dynamic Clouds - она выглядит как то, что может соответствовать вашему билету.
источник