AI GENERATED
地球
by touyou
PROMPT
波打つ世界
- DATE
- 2026/7/8
- SOURCE
- AI GENERATED
- MODEL
- gemini-2.5-flash
- LIKES
- 1
VIEW SHADER CODE
float hash13(vec3 p3) {
p3 = fract(p3 * vec3(0.1031, 0.11369, 0.13787));
p3 += dot(p3, p3.yzx + 19.19);
return fract((p3.x + p3.y) * p3.z);
}
float noise(vec3 p) {
vec3 i = floor(p);
vec3 f = fract(p);
f = f * f * (3.0 - 2.0 * f); // Smoothstep interpolation
// Get the 8 corner values
float n000 = hash13(i + vec3(0.0, 0.0, 0.0));
float n100 = hash13(i + vec3(1.0, 0.0, 0.0));
float n010 = hash13(i + vec3(0.0, 1.0, 0.0));
float n110 = hash13(i + vec3(1.0, 1.0, 0.0));
float n001 = hash13(i + vec3(0.0, 0.0, 1.0));
float n101 = hash13(i + vec3(1.0, 0.0, 1.0));
float n011 = hash13(i + vec3(0.0, 1.0, 1.0));
float n111 = hash13(i + vec3(1.0, 1.0, 1.0));
// Interpolate along X, then Y, then Z
float res = mix(
mix(mix(n000, n100, f.x), mix(n010, n110, f.x), f.y),
mix(mix(n001, n101, f.x), mix(n011, n111, f.x), f.y),
f.z
);
return res;
}
float fbm(vec3 p) {
float value = 0.0;
float amplitude = 0.5;
float frequency = 1.0;
// For-loop iteration count is a compile-time constant
for (int i = 0; i < 5; i++) {
value += amplitude * noise(p * frequency);
frequency *= 2.0;
amplitude *= 0.5;
}
return value;
}
vec3 palette(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); // Blue-ish tones
// Adjust range and speed for harmonic color transitions
t = t * 0.8 + 0.1;
return a + b * cos(6.28318 * (c * t + d));
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;
float time = iTime * 0.1; // Slow down animation time
// Domain Warping for a "wavy" effect
vec2 warpedUV = uv;
float warpStrength = 1.2;
// First warp pass with larger scale
vec3 p1 = vec3(uv * 1.5, time * 0.5);
vec2 warpOffset1 = vec2(fbm(p1 + vec3(10.0, 20.0, 30.0)), fbm(p1 + vec3(40.0, 50.0, 60.0)));
warpedUV += warpOffset1 * warpStrength * 0.2;
// Second warp pass with finer detail
vec3 p2 = vec3(warpedUV * 3.0, time * 0.7);
vec2 warpOffset2 = vec2(fbm(p2 + vec3(70.0, 80.0, 90.0)), fbm(p2 + vec3(100.0, 110.0, 120.0)));
warpedUV += warpOffset2 * warpStrength * 0.15;
// Main FBM calculation on the warped coordinates
// Self-warping on the Z-axis for more organic motion
float fbmValue = fbm(vec3(warpedUV * 4.0, time * 0.8 + fbm(vec3(warpedUV * 0.5, time * 0.2)) * 0.1));
// Remap FBM value to a color range for contrast
float colorT = fbmValue * 1.5 - 0.2;
// Get color from the palette
vec3 col = palette(colorT);
// Add a subtle glow/luminosity based on the FBM value
col += smoothstep(0.0, 1.0, fbmValue) * 0.05;
// Apply a subtle vignette effect
float len_uv = length(uv);
float vignette = smoothstep(0.4, 0.9, len_uv); // Inner start, outer end of vignette
vignette = pow(vignette, 2.0); // Make it fall off faster
col *= (1.0 - vignette * 0.6); // Apply vignette with strength 0.6
fragColor = vec4(col, 1.0);
}ZIP を展開して .playground を Xcode でダブルクリックし、Live View を表示して ▶ を押すとシェーダーがアニメーションします。Metal ソースは Resources/Shader.metal に独立ファイルとして入っているので、Xcode 上で直接編集できます。