デモシーン13

デモシーン

13作目です。

動画編集を少し凝ってみようかと思い、インプット学習をしてみましたが、アウトプット力がまだ足りませんでした。イントロだけ試しました(笑)

徐々にクオリティを上げていければと思ってます。

あ、コード貼っておきますね。

#iChannel0 "sky01.png"
#define intervalTime 5.0

vec3 pallete(float t) {
    vec3 a = vec3(0.5);
    vec3 b = vec3(0.5);
    vec3 c = vec3(1.0);
    vec3 d = vec3(0.263, 0.416, 0.557);
    return a + b * cos(6.28318 * (c * t + d));
}

mat2 rot(float angle) {
    float c = cos(angle), s = sin(angle);
    return mat2(c, -s, s, c);
}

vec3 rotateY(vec3 pos, float angle) {
    float c = cos(angle), s = sin(angle);
    return vec3(c * pos.x + s * pos.z, pos.y, -s * pos.x + c * pos.z);
}

vec3 rotateX(vec3 pos, float angle) {
    float c = cos(angle), s = sin(angle);
    return vec3(pos.x, c * pos.y - s * pos.z, s * pos.y + c * pos.z);
}

float sdSphere(vec3 p, float r) {
    return length(p) - r;
}

float map(vec3 p) {
    p = fract(p) - 0.5;
    float d = sdSphere(p, 0.15);

    float orbitRadius = 0.3;
    float angle = iTime;
    float orbitSpeed = 2.0;
    float randomAngle = sin(iTime * 0.1) * 2.0 * 3.14159265;

    vec3 satellitePos = vec3(orbitRadius * cos(angle * orbitSpeed), 0.0, orbitRadius * sin(angle * orbitSpeed));
    satellitePos = rotateX(satellitePos, randomAngle);
    satellitePos = rotateY(satellitePos, randomAngle);
    float d_miniSphere = sdSphere(p - satellitePos, 0.03);

    d = min(d, d_miniSphere);
    return d;
}

vec2 getUV(vec3 p) {
    float u = atan(p.z, p.x) / (2.0 * 3.14159265) + 0.5;
    float v = asin(p.y) / 3.14159265 + 0.5;
    return vec2(u, v);
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    vec2 uv = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
    vec2 m = (2.0 * iMouse.xy - iResolution.xy) / iResolution.y;

    vec2 textureUv = uv * 0.5 + 0.5;
    vec3 textureSky = texture(iChannel0, textureUv).xyz;

    vec3 totalcol = vec3(0.0);
    vec3 col = vec3(0.0);
    vec3 ro = vec3(0.0, 0.0, -3.0);
    vec3 rd = normalize(vec3(uv, 1.0));

    uv = fract(uv * 10.0);
    uv = m;

    float interval = intervalTime;
    float time = mod(iTime, 4.0 * interval);
    float rotateSpeed = 0.1;
    float forwardSpeed = 0.4;

    if (time < interval) {
        m.x += iTime * rotateSpeed;
    } else if (time < interval * 2.0) {
        m.y += iTime * rotateSpeed;
    } else if (time < interval * 3.0) {
        m.x += iTime * rotateSpeed;
        m.y -= iTime * rotateSpeed;
    } else {
        m.x -= iTime * rotateSpeed;
        m.y += iTime * rotateSpeed;
    }

    ro.xz *= rot(m.x);
    rd.xz *= rot(m.x);
    ro.yz *= rot(m.y);
    rd.yz *= rot(m.y);

    ro.z += iTime * forwardSpeed;

    float t = 0.0;
    for (int i = 0; i < 64; i++) {
        vec3 p = ro + t * rd;
        float d = map(p);

        if (d < 0.01) {
            vec2 sphereUV = getUV(p);
            col = texture(iChannel0, sphereUV).xyz;
            col += 0.0005 / d;
            break;
        }

        if (t > 10.0) {
            break;
        }

        if (d > 0.001 && t < 10.0) {
            col = pallete(t * 0.5 * sin(iTime * 0.01));
        }
        t += d;
    }

    totalcol += col;
    fragColor = vec4(totalcol, 1.0);
}

使用したテクスチャ(画像)は以前使ったものと同じです。空模様です。(↓)
ほとんど目立ちませんが。。。

制作を続けていきます。では。

#デジタルアート #デモシーン #3DCG #シェーダーコーディング #レイマーチング #SF #demoscene

Please follow and like us:

Follow me!

コメント

Social Share Buttons and Icons powered by Ultimatelysocial
YouTube
YouTube
Instagram
Copy link
URL has been copied successfully!
PAGE TOP