В качестве альтернативы вы можете использовать кубическую карту с текстурой неба вместо перлин-шума. И я также думаю, что это сделает вашу сцену лучше благодаря наличию большего количества деталей и изменений в картографировании окружающей среды. Это именно то, что я сделал, когда внедрил свой raytracer.
Еще одна причина, по которой я рекомендую это, заключается в том, что окружающая среда не должна быть только облаками. Это может быть горы, это может быть сцена в помещении, может быть сцена из Марса. Используя кубическую карту, единственное, что вам нужно сделать, это поменять текстуру, и все готово.
Поэтому первым шагом будет поиск карты куба, которая соответствует вашим потребностям. Он может храниться в виде шести отдельных текстур или в виде одной текстуры, как показано ниже. Также проверьте эту ссылку для получения дополнительной информации о том, как создать свой собственный:
Затем в вашем коде я бы порекомендовал создать CubeMap
класс для инкапсуляции расчетов выборки. Этот класс должен знать, как загрузить текстуру карты куба, и, имея луч, он должен знать, на каком лице и в каком положении брать образец. В моей реализации мне было проще хранить каждую из шести граней в отдельных текстурных объектах и ветвления в зависимости от направления луча:
class CubeMap
{
public void Load(string path);
public Color GetSample(Ray ray);
private Texture[6] faces;
}
Если у вас еще нет Texture
класса, просто создайте свой собственный. Это может быть так же просто, как двумерный массив цветов. Итак, просто для справки и без каких-либо гарантий эффективности или надежности этой реализации приведен код, который я использовал в своем проекте - CubeMap и CubeFace .