AI GENERATED
常夜灯と淡い星空
by touyou
PROMPT
真夜中の常夜灯の下、幻想的な星空を夢見ながらまどろむ暗闇。
- DATE
- 2026/6/17
- SOURCE
- AI GENERATED
- MODEL
- gemini-2.5-flash
- LIKES
- 0
VIEW SHADER CODE
float hash11(float p) {
p = fract(p * 0.3183099 + p);
p = p * (p + 71.0) * 0.0009765625;
return fract(p);
}
float hash21(vec2 p) {
p = fract(p * vec2(2345.567, 876.345) + p.yx * vec2(987.654, 123.456));
return fract(p.x * p.y);
}
vec2 hash22(vec2 p) {
p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
return fract(sin(p) * 43758.5453123);
}
float noise(vec2 p) {
vec2 ip = floor(p);
vec2 fp = fract(p);
fp = fp * fp * (3.0 - 2.0 * fp);
float n00 = hash21(ip);
float n10 = hash21(ip + vec2(1.0, 0.0));
float n01 = hash21(ip + vec2(0.0, 1.0));
float n11 = hash21(ip + vec2(1.0, 1.0));
float x1 = mix(n00, n10, fp.x);
float x2 = mix(n01, n11, fp.x);
return mix(x1, x2, fp.y);
}
float fbm(vec2 p) {
float f = 0.0;
float amp = 0.5;
vec2 shift = vec2(100.0, 200.0);
mat2 rot_mat = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));
for (int i = 0; i < 5; i++) {
f += amp * noise(p);
p = rot_mat * p * 2.0 + shift;
amp *= 0.5;
}
return f;
}
vec2 rot(vec2 p, float a) {
return vec2(p.x * cos(a) - p.y * sin(a), p.x * sin(a) + p.y * cos(a));
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;
vec2 ratio = iResolution.xy / iResolution.y;
vec3 final_color = vec3(0.0);
// --- Midnight Darkness Base Color ---
vec3 base_dark_color = vec3(0.03, 0.01, 0.07); // Deep blue-purple
// --- Nightlight ---
vec2 light_pos = vec2(0.0, -0.6); // Slightly below center
float dist_to_light = length(uv - light_pos);
float nightlight_intensity = smoothstep(0.4, 0.05, dist_to_light);
nightlight_intensity *= (0.8 + 0.2 * sin(iTime * 1.5 + dist_to_light * 5.0)); // Subtle pulse/flicker
vec3 nightlight_emit_color = vec3(1.0, 0.75, 0.5); // Warm yellow/orange
// --- Dreamy Starry Sky ---
// Domain warping for a swirling, dreamy effect
vec2 star_p = uv * 3.0;
star_p = rot(star_p, iTime * 0.01); // Slow overall rotation
star_p += 0.5 * fbm(star_p * 0.8 + iTime * 0.02); // First warp layer
star_p += 0.2 * sin(star_p.yx * 3.0 + iTime * 0.05); // Second warp layer
// Generate star field using FBM
float stars = fbm(star_p * 4.0 + iTime * 0.08);
stars += 0.5 * fbm(star_p * 8.0 - iTime * 0.03); // Finer detail layer
stars = pow(stars, 5.0); // Sharpen and enhance brighter spots for star-like appearance
// Subtle twinkling effect
stars *= (0.7 + 0.3 * sin(iTime * 8.0 + stars * 10.0));
// Star color palette (subtly shifting)
vec3 star_color = 0.7 + 0.3 * cos(iTime * 0.2 + vec3(0.0, 1.0, 2.0)); // White-blue stars
// --- Nebula/Background Swirl ---
vec2 nebula_p = uv * 0.8;
nebula_p = rot(nebula_p, iTime * 0.005); // Even slower rotation for background
nebula_p += 0.3 * sin(nebula_p.yx * 2.0 + iTime * 0.03); // Subtle background warp
float nebula_val = fbm(nebula_p * 2.0 + iTime * 0.01);
nebula_val = pow(nebula_val, 2.0); // Soften the nebula appearance
// Nebula color palette (cosmic blues/purples)
vec3 nebula_color = 0.5 + 0.5 * cos(iTime * 0.1 + vec3(0.0, 0.6, 1.0));
// --- Combine Colors ---
final_color = mix(base_dark_color, nebula_color * 0.5, nebula_val); // Blend nebula into dark background
final_color += stars * star_color * 1.5; // Add stars
// Add nightlight illumination
final_color += nightlight_emit_color * nightlight_intensity;
// --- Vignette ---
float len_uv = length(uv * vec2(1.0 / ratio.x, 1.0));
float vignette = smoothstep(1.0, 0.3, len_uv);
final_color *= vignette;
final_color = mix(final_color, vec3(0.0), 0.15 * (1.0 - vignette)); // Darken corners further
// --- Output ---
fragColor = vec4(final_color, 1.0);
}ZIP を展開して .playground を Xcode でダブルクリックし、Live View を表示して ▶ を押すとシェーダーがアニメーションします。Metal ソースは Resources/Shader.metal に独立ファイルとして入っているので、Xcode 上で直接編集できます。