Сглаживание низкооктавного перлин-шума - PullRequest
5 голосов
/ 25 января 2012

Я пытаюсь создать очень простые облака шума Перлина во фрагментном шейдере, используя найденную функцию Noise здесь .

При низких октавах мой вывод, если не сказать лучшего слова, «blobby». Я просто хотел бы сгладить эти пятна и получить сглаженный шум, но немного подробней, чем одна октава.

Фрагмент шейдера:

#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 resolution;

// Noise related functions go here ..

float surface3 ( vec3 coord ) {
        float frequency = 4.0;
        float n = 0.0;  

        n += 1.0    * abs( cnoise( coord * frequency ) );
        n += 0.5    * abs( cnoise( coord * frequency * 2.0 ) );
        n += 0.25   * abs( cnoise( coord * frequency * 4.0 ) );

        return n;
}

void main( void ) {
        vec2 position = gl_FragCoord.xy / resolution.xy;

        float n = surface3(vec3(position, time * 0.1));

        gl_FragColor = vec4(n, n, n, 1.0);
}

Живой пример:
http://glsl.heroku.com/e#1413.0

Слева - то, что у меня есть в данный момент. Как бы я мог добиться чего-то более встраиваемого с правильным изображением?

1 Ответ

4 голосов
/ 27 января 2012

Самый простой способ - убрать два шумовых вызова в поверхностной функции. Оставьте только первую шумовую линию вызова, и вы получите что-то похожее на первую:

http://glsl.heroku.com/e#1450.0

Резкие линии в многооктавном шуме происходят от использования abs (), убирают abs () и заменяют его квадратным значением шума или делают что-то вроде 0.5 * (1.0 + cnoise ()) (если вывод cnoise между -1..1).

Вот результат какой-то игры http://glsl.heroku.com/e#1450.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...