GLSLシェーダーコーディング、デモシーン制作記録。17作目です。
目がチカチカしますね。すみません。
for文を使用してオブジェクトをたくさん配置してランダムに移動させてみました。
for文だと処理が重くなっちゃいますね。でもfractやmodだとうまくランダムな挙動をさせられない。。。
詳しい人がいたら教えて欲しいです。
コード載せときます。
#define PI 3.14159265359
//coloring
vec3 pallete (float t) {
vec3 a = vec3(0.5, 0.5, 0.8);
vec3 b = vec3(0.5, 0.5, 0.5);
vec3 c = vec3(0.5, 0.5, 0.5);
vec3 d = vec3(0.0, 0.5, 0.5);
return a + b*cos( 6.28318*(c*t+d) );
}
// 2Dランダム関数
float random(vec2 st) {
return fract(sin(dot(st.xy, vec2(12.9898,78.233))) * 43758.5453123);
}
mat2 rot(float a)
{
return mat2(cos(a), -sin(a), sin(a), cos(a));
}
// 平面の距離関数
float plane(vec3 p, vec3 n, float h) {
return dot(p, n) + h;
}
// 円の距離関数
float circle(vec3 p, vec3 c, float r) {
return length(p.xz - c.xz) - r;
}
vec2 map(vec3 p)
{
float d;
float circles;
float plane = plane(p, vec3(0.0, 1.0, 0.0), 2.0);
vec3 circlePos = vec3(0.0);
for(int i = 0; i < 30; i++){
circlePos.xz = vec2(random(vec2(float(i * 7))),random(vec2(float(i * 11)))) * 10. - vec2(5., 2.5);
circlePos.x *= 0.4;
circlePos.x += sin(iTime * float(i) * 0.3) * 1.0;
circlePos.z *= 5.0;
circlePos.z += sin(iTime * float(i) * 0.1) * 10.0;
circles = min(circles, circle(p, circlePos, 0.3));
}
if(plane > -circles) {
d = plane;
// xが-1から1の範囲内にあるかどうかをチェック
if (p.x < -2.0 || p.x > 2.0) {
d = 10000.0; // 範囲外の場合、非常に大きな距離を返す
}
return vec2(d, 1.0);
} else {
d = circles;
return vec2(d, 2.0);
}
}
void mainImage (out vec4 fragColor, in vec2 fragCoord)
{
vec2 uv = (fragCoord * 2.0 - iResolution.xy)/iResolution.y;
vec2 m = (iMouse.xy * 2.0 - iResolution.xy)/iResolution.xy;
vec3 ro = vec3(0.0, 0.0, -3.0);
vec3 rd = normalize(vec3(uv, 1.0));
vec3 col = vec3(0.0);
float t = 0.0;
m.x += 0.3 * sin(iTime * 0.5);
m.y += 0.1 * cos(iTime * .3);
float mouseSensitivity = 2.0;
ro.xz *= rot(-m.x * mouseSensitivity);
rd.xz *= rot(-m.x * mouseSensitivity);
ro.yz *= rot(-m.y * mouseSensitivity);
rd.yz *= rot(-m.y * mouseSensitivity);
for(int i = 0; i < 1000; i++)
{
vec3 p = ro + rd*t;
vec2 distId = map(p);
float d = distId.x;
if(d < 0.001) {
if (distId.y == 1.0) {
col = pallete(p.x * .5);
} else if (distId.y == 2.0) {
if(t < 1000.) col *= 20. / t; // 円: 色付け
else col = pallete(p.x * .3 + iTime * 2.0);
}
break;
}
if(t > 100.0) break;
col = pallete(p.x * 10. + iTime * 2.0);
t += d;
}
fragColor = vec4(col, 1.0);
}
では。
#デジタルアート #デモシーン #3DCG #シェーダーコーディング #レイマーチング #SF #demoscene
Please follow and like us:
コメント