12作目です。
ノイズについて勉強中。
下記サイトがすごく勉強になるけど、まだまだわからない部分も多い。
The Book of Shaders
Gentle step-by-step guide through the abstract and complex universe of Fragment Shaders.
コード書いておきます。参考までに。
// 2Dランダム関数
float random(vec2 st) {
return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123);
}
// 2Dノイズ関数
float noise(vec2 st) {
vec2 i = floor(st);
vec2 f = fract(st);
// 4つの隅の乱数値を取得
float a = random(i);
float b = random(i + vec2(1.0, 0.0));
float c = random(i + vec2(0.0, 1.0));
float d = random(i + vec2(1.0, 1.0));
// スムーズステップによる補間
vec2 u = f * f * (3.0 - 2.0 * f);
return mix(a, b, u.x) +
(c - a) * u.y * (1.0 - u.x) +
(d - b) * u.x * u.y;
}
// フラクタルブラウン運動(fBm)関数
float fbm(vec2 st) {
float value = 0.0;
float amplitude = 0.5; // 振幅
float frequency = 0.0; // 周波数
for (int i = 0; i < 6; i++) {
value += amplitude * noise(st);
st *= 2.0;
amplitude *= 0.5;
}
return value;
}
// タービュランス関数
float turbulence(vec2 st) {
float value = 0.0;
float amplitude = 0.5;
float frequency = 1.0;
for (int i = 0; i < 6; i++) {
value += amplitude * abs(noise(st * frequency));
st *= 2.0;
amplitude *= 0.5;
}
return value;
}
// Ridgeノイズ関数
float ridge(float h, float offset) {
h = abs(h);
h = offset - h;
h = h * h;
return h;
}
// フラクタル Ridge ノイズ関数
float fractalRidge(vec2 st) {
float value = 0.0;
float amplitude = 0.5;//+ fbm((vec2(iTime * .07, iTime * .05))) * .7;
float frequency = 1.0;
float offset = 1.0; // Ridge ノイズのオフセット
for (int i = 0; i < 6; i++) {
value += amplitude * ridge(noise(st * frequency + vec2(cos(iTime * .1)*cos((1. + cos(iTime * .1)) * PI),sin((1.-sin(iTime * .3)) * PI))), offset);
st *= 2.0;
amplitude *= 0.5;
}
return value;
}
//--------------------------------
//Color
vec3 pallete (float t) {
vec3 a = vec3(0.5, 0.5, 0.5);
vec3 b = vec3(0.5, 0.5, 0.5);
vec3 c = vec3(1.0, 1.0, 1.0);
vec3 d = vec3(0.263, 0.416, 0.557);
return a + b*cos( 6.28318*(c*t+d) );
}
//--------------------------------
void mainImage(out vec4 fragColor, in vec2 fragCoord){
vec2 uv = fragCoord/iResolution.xy;
uv = (fragCoord * 2.0 -iResolution.xy) / iResolution.y;
vec3 col = vec3(0.0);
vec3 finalCol = vec3(0.0);
float ridge = fractalRidge(uv * 2.0 + iTime * 0.0);
for(int i = 0; i < 2; i++){
ridge = fractalRidge(vec2(ridge) + uv * 2.0 - iTime * 0.0);
}
col = vec3(ridge);
col = pallete(ridge + iTime * .2);
finalCol += col;
fragColor = vec4(finalCol,1.0);
}
制作続けていきます。では。
#デジタルアート #デモシーン #3DCG #シェーダーコーディング #レイマーチング #SF #demoscene
Please follow and like us:
コメント