Симплексный шумовой шейдер?
У меня есть пара вопросов о симплексном шуме. Я использую Simplex Noise для создания ландшафта в DirectX, но в настоящее время я делаю это, используя классы и тому подобное. Я, вероятно, буду использовать это и для текстур, так что нужно ли превращать это в реализацию шейдера? И если так, это легко сделать?
Также для текстур лучше использовать 3D или 2D шум?
3 ответа
Да, вы действительно должны перенести эту работу в GPU, это то, что лучше всего.
Симплексный шум на GPU - это решенная проблема. Вы можете найти отличную статью по этому вопросу здесь, или вы можете получить реализацию здесь.
Эта реализация в GLSL, но портирование это просто вопрос замены vec3 и vec4 на float3 и float4.
Воспользовавшись этим, я обнаружил, что самая быстрая реализация функции шума - это реализация шума Перлина от Inigo Quilez (реализация, представленная ниже, взята из кода, найденного на сайте shadertoy.com. Это отличный сайт, проверьте его!
#ifndef __noise_hlsl_
#define __noise_hlsl_
// hash based 3d value noise
// function taken from https://www.shadertoy.com/view/XslGRr
// Created by inigo quilez - iq/2013
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
// ported from GLSL to HLSL
float hash( float n )
{
return frac(sin(n)*43758.5453);
}
float noise( float3 x )
{
// The noise function returns a value in the range -1.0f -> 1.0f
float3 p = floor(x);
float3 f = frac(x);
f = f*f*(3.0-2.0*f);
float n = p.x + p.y*57.0 + 113.0*p.z;
return lerp(lerp(lerp( hash(n+0.0), hash(n+1.0),f.x),
lerp( hash(n+57.0), hash(n+58.0),f.x),f.y),
lerp(lerp( hash(n+113.0), hash(n+114.0),f.x),
lerp( hash(n+170.0), hash(n+171.0),f.x),f.y),f.z);
}
#endif
Я хотел бы завершить приведенный выше ответ изображением изумительной функции вышеупомянутого ответа, чтобы вы могли его квалифицировать (он аналогичен валенуазу из библиотеки libnoise)
как вы можете видеть, это потрясающе, и его нужно адаптировать для обработки отрицательных пространственных значений (абсолютных по осям XYZ)... очевидно, это 3D, поэтому ожидайте такую же морфологию по оси Y.
Если ваше приложение не использует сетку шума и текстуры динамически, то вы должны сохранить автономное создание, которое вы в настоящее время используете для своей сетки. Однако, если вы хотите, чтобы ваша сетка и текстуры динамически изменялись с течением времени (представьте себе деформируемый рельеф), то было бы необходимо изменить ее на реализацию шейдера, если для вас важен высокий fps. Это может быть сделано, однако я не уверен в вашем уровне способности утверждать, что это легко. Это будет включать использование геометрических шейдеров (и, возможно, потокового) для случая вашей сетки ландшафта, и пиксельных шейдеров для создания ваших текстур.
Что касается использования 2D или 3D шума для текстур, это зависит от ваших потребностей использования. 3D-текстуры хороши для представления таких вещей, как силовые поля, воксельные поля и т. Д. Они, однако, дороги, создавая их динамически. Если вы просто хотите использовать текстуру в качестве обычного сеточного материала, тогда лучше использовать 2d.