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:
コメント