Вывести значения неопределенности из текстуры шума?
Я пытаюсь реализовать Sketchy Drawings. Я нахожусь в той части процесса, которая требует использования текстуры шума для получения значений неопределенности, которые обеспечат смещение в карту границ.
Вот изображение моей карты ребер для тора:
И вот текстура шума, которую я получил, используя функцию Perlin, как было предложено:
Я сохранил их как текстуры в edgeTexture
а также noiseTexture
соответственно.
Теперь я застрял в разделе, где вы должны сместить координаты текстуры карты границ на значения неопределенности, полученные из текстуры шума. Это изображение из книги:
offs = turbulence(s, t);
offt = turbulence(1 - s, 1 - t);
Я пока игнорирую матрицу 2х2. Вот моя текущая попытка фрагмента шейдера и результат, который он дает:
#version 330
out vec4 vFragColor;
uniform sampler2D edgeTexture;
uniform sampler2D noiseTexture;
smooth in vec2 vTexCoords;
float turbulence(float s, float t)
{
float sum = 0;
float scale = 1;
float s1 = 1;
vec2 coords = vec2(s,t);
for (int i=0; i < 10; i++)
{
vec4 noise = texture(noiseTexture, 0.25 * s1 * coords);
sum += scale * noise.x;
scale = scale / 2;
s1 = s1 * 2;
}
return sum;
}
void main( void )
{
float off_s = turbulence(vTexCoords.s, vTexCoords.t);
float off_t = turbulence(1 - vTexCoords.s, 1 - vTexCoords.t);
vFragColor = texture(edgeTexture, vTexCoords + vec2(off_s, off_t));
}
Очевидно, мое дополнение к vTexCoords
это далеко, но я не понимаю, почему. Я пробовал несколько других определений функции турбулентности, но ни одно из них не было близко к желаемому результату, поэтому я думаю, что мой общий подход где-то ошибочен. Любая помощь здесь очень ценится, и, пожалуйста, прокомментируйте, если я не был ясно. Желаемый результат для тора выглядел бы как грубо нарисованный круг, который я себе представляю.
1 ответ
Ваша функция турбулентности будет возвращать значения в диапазоне (0,1). Во-первых, вам нужно изменить это, чтобы значения центрировались на 0. Это должно быть сделано внутри цикла в функции, иначе вы получите странное распределение. Итак, во-первых, я думаю, что вы должны изменить строку:
vec4 noise = texture(noiseTexture, 0.25 * s1 * coords);
в
vec4 noise = texture(noiseTexture, 0.25 * s1 * coords) * 2.0 - 1.0;
Затем вам нужно масштабировать смещение, чтобы вы не сэмплировали краевую текстуру слишком далеко от нарисованного фрагмента. Изменить:
vFragColor = texture(edgeTexture, vTexCoords + vec2(off_s, off_t));
в
vFragColor = texture(edgeTexture, vTexCoords + vec2(off_s, off_t) * off_scale);
где off_scale
является небольшим значением (возможно, около 0,05), выбранным экспериментально.