Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Shader Rzeki

Ostatnio zmodyfikowano 2025-03-18 23:51
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML] Shader Rzeki
» 2025-03-15 16:47:58
Witam. Posiadam shader "lake.frag" - jeziora z animowaną wodą. Chciałbym przerobić tak ten shader, by woda płynęła w wyznaczonym kierunku vec2(x,y). Próbowałem przerobić shader na wiele spososób ale nie udało mi się tego zrobić. Pomoże ktoś ?


C/C++
// river.frag
uniform sampler2D texture;
uniform vec2 resolution;
uniform float time;
varying vec2 worldPos;
uniform vec2 direction; // kierunek przepływu wody rzeki

float random( float x ) {
   
   
return fract( sin( x ) * 10000. );
   
}

float noise( vec2 p ) {
   
   
return random( p.x + p.y * 10000. );
   
}

vec2 sw( vec2 p ) { return vec2( floor( p.x ), floor( p.y ) ); }
vec2 se( vec2 p ) { return vec2( ceil( p.x ), floor( p.y ) ); }
vec2 nw( vec2 p ) { return vec2( floor( p.x ), ceil( p.y ) ); }
vec2 ne( vec2 p ) { return vec2( ceil( p.x ), ceil( p.y ) ); }

float smoothNoise( vec2 p ) {
   
   
vec2 interp = smoothstep( 0., 1., fract( p ) );
   
float s = mix( noise( sw( p ) ), noise( se( p ) ), interp.x );
   
float n = mix( noise( nw( p ) ), noise( ne( p ) ), interp.x );
   
return mix( s, n, interp.y );
   
}

float fractalNoise( vec2 p ) {
   
   
float x = 0.;
   
x += smoothNoise( p );
   
x += smoothNoise( p * 2. ) / 2.;
   
x += smoothNoise( p * 4. ) / 4.;
   
x += smoothNoise( p * 8. ) / 8.;
   
x += smoothNoise( p * 16. ) / 16.;
   
   
x /= 1. + 1. / 2. + 1. / 4. + 1. / 8. + 1. / 16.;
   
return x;
   
}

float movingNoise( vec2 p ) {
   
vec2 moveOfWater = direction * time;
   
float x = fractalNoise( p + time );
   
float y = fractalNoise( p - time );
   
return fractalNoise( p + vec2( x, y ) - moveOfWater );
   
}

float nestedNoise( vec2 p ) {
   
vec2 moveOfWater = direction * time;
   
float x = movingNoise( p );
   
float y = movingNoise( p + 100. );
   
return movingNoise( p + vec2( x, y ) - moveOfWater ); // nie działa kierunek wody
   
}

void main()
{
   
vec4 texcolor = texture2D( texture, gl_TexCoord[ 0 ].xy );
   
if( texcolor.x == 127. / 255. && texcolor.y == 127. / 255. && texcolor.z == 127. / 255. && texcolor.w == 1.0 ) {
       
vec2 coords = worldPos.xy / resolution;
       
float pixelationFactor = 0.00390625;
       
vec2 pixelCoord = floor( coords / pixelationFactor ) * pixelationFactor;
       
float n = nestedNoise( pixelCoord * 25.60 );
       
vec3 color = mix( vec3( .4, .6, 1. ), vec3( .05, .1, 1. ), n );
       
vec3 darkcolor = color * 0.7;
       
gl_FragColor = vec4( darkcolor, 1. );
   
} else {
       
gl_FragColor = texcolor;
   
}
}
P-182161
tBane
Temat założony przez niniejszego użytkownika
» 2025-03-15 17:12:19
Dobra, działa ... Sorki za zaśmiecenie forum ... :-/

C/C++
// river.frag
uniform sampler2D texture;
uniform vec2 resolution;
uniform float time;
varying vec2 worldPos;
uniform vec2 direction;

float random( float x ) {
   
   
return fract( sin( x ) * 10000. );
   
}

float noise( vec2 p ) {
   
   
return random( p.x + p.y * 10000. );
   
}

vec2 sw( vec2 p ) { return vec2( floor( p.x ), floor( p.y ) ); }
vec2 se( vec2 p ) { return vec2( ceil( p.x ), floor( p.y ) ); }
vec2 nw( vec2 p ) { return vec2( floor( p.x ), ceil( p.y ) ); }
vec2 ne( vec2 p ) { return vec2( ceil( p.x ), ceil( p.y ) ); }

float smoothNoise( vec2 p ) {
   
   
vec2 interp = smoothstep( 0., 1., fract( p ) );
   
float s = mix( noise( sw( p ) ), noise( se( p ) ), interp.x );
   
float n = mix( noise( nw( p ) ), noise( ne( p ) ), interp.x );
   
return mix( s, n, interp.y );
   
}

float fractalNoise( vec2 p ) {
   
   
float x = 0.;
   
x += smoothNoise( p );
   
x += smoothNoise( p * 2. ) / 2.;
   
x += smoothNoise( p * 4. ) / 4.;
   
x += smoothNoise( p * 8. ) / 8.;
   
x += smoothNoise( p * 16. ) / 16.;
   
   
x /= 1. + 1. / 2. + 1. / 4. + 1. / 8. + 1. / 16.;
   
return x;
   
}

float movingNoise( vec2 p ) {
   
   
float x = fractalNoise( p + time );
   
float y = fractalNoise( p - time );
   
return fractalNoise( p + vec2( x, y ) );
   
}

float nestedNoise( vec2 p ) {
   
vec2 moveOfWater = - direction * time;
   
moveOfWater.y = - moveOfWater.y;
   
float x = movingNoise( p );
   
float y = movingNoise( p + 100. );
   
return movingNoise( p + vec2( x, y ) + moveOfWater );
   
}

void main()
{
   
vec4 texcolor = texture2D( texture, gl_TexCoord[ 0 ].xy );
   
if( texcolor.x == 127. / 255. && texcolor.y == 127. / 255. && texcolor.z == 127. / 255. && texcolor.w == 1.0 ) {
       
vec2 coords = worldPos.xy / resolution;
       
float pixelationFactor = 0.00390625;
       
vec2 pixelCoord = floor( coords / pixelationFactor ) * pixelationFactor;
       
float n = nestedNoise( pixelCoord * 25.60 );
       
vec3 color = mix( vec3( .4, .6, 1. ), vec3( .05, .1, 1. ), n );
       
vec3 darkcolor = color * 0.7;
       
gl_FragColor = vec4( darkcolor, 1. );
   
} else {
       
gl_FragColor = texcolor;
   
}
}
P-182162
DejaVu
» 2025-03-15 18:29:49
Kod który działa nie zaśmieca forum, bo może komuś się on przydać :)
P-182163
tBane
Temat założony przez niniejszego użytkownika
» 2025-03-18 23:51:45
P-182165
« 1 »
  Strona 1 z 1