GLSL для Minecraft: как мне установить положение для облаков?

Я использую gl_FragCoord.xy, но облака привязаны к глазу игрока или позиции камеры. Так что они двигаются с вами, если вы оглянетесь назад. Но я хочу, чтобы у облаков было свое статическое положение. Я попробовал это с worldposition = gbufferModelViewInverse * fragposition но с ужасным результатом. Облака растягиваются, если я смотрю на восход или закат и получаю зеркальный эффект. Таким образом, у них был тот же самый образец как на восходе солнца, если я смотрю на закат.

Теперь мой вопрос: как я могу сделать так, чтобы, если игрок смотрел налево, чтобы облака не двигались глазом игрока? Это сложно объяснить, поэтому я попытался создать простую картинку:

Пример изображения

Вот часть из моего кода:

float hash( float n )
{
    return fract(sin(n)*43758.5453);
}

float noise( in vec2 x )
{
    vec2 p = floor(x);
    vec2 f = fract(x);
        f = f*f*(3.0-2.0*f);
        float n = p.x + p.y*57.0;
        float res = mix(mix( hash(n+  0.0), hash(n+  1.0),f.x), mix( hash(n+ 57.0), hash(n+ 58.0),f.x),f.y);
        return res;
}

float fbm( vec2 p )
{
        float f = 0.0;
        f += 0.50000*noise( p ); p = p*2.02;
        f += 0.25000*noise( p ); p = p*2.03;
        f += 0.12500*noise( p ); p = p*2.01;
        f += 0.06250*noise( p ); p = p*2.04;
        f += 0.03125*noise( p );
        return f/0.984375;
}

#define CLOUD_COVER         0.55
#define CLOUD_SHARPNESS     0.015

// Wind - Used to animate the clouds
vec2 wind_vec = vec2(0.001 + frameTimeCounter*0.005, 0.003 + frameTimeCounter * 0.005);

// Set up domain
vec2 q = (gl_FragCoord.xy / 2024);
vec2 p = -1.0 + 3.0 * q + wind_vec;

// Create noise using fBm
float f = fbm( 4.0*p );

float cover = CLOUD_COVER;
float sharpness = CLOUD_SHARPNESS;

float c = f - (1.0 - cover);
if ( c < 0.0 )
c = 0.0;

f = 1.0 - (pow(sharpness, c));

color += f/15*TimeDay;
color += vec3(0.03, 0.19, 0.99)*f/1000*TimeMidnight;

0 ответов

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