Вывести значения неопределенности из текстуры шума?

Я пытаюсь реализовать 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), выбранным экспериментально.

Другие вопросы по тегам