AI GENERATED
電脳の海
by touyou
PROMPT
デジタルの海、電脳空間に文字が流れる
- DATE
- 2026/6/30
- SOURCE
- AI GENERATED
- MODEL
- gemini-2.5-flash
- LIKES
- 0
VIEW SHADER CODE
float hash21(vec2 p) {
p = fract(p * vec2(123.45, 678.90));
p += dot(p, p + 45.67);
return fract(p.x * p.y);
}
float value_noise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
f = f * f * (3.0 - 2.0 * f);
float a = hash21(i);
float b = hash21(i + vec2(1.0, 0.0));
float c = hash21(i + vec2(0.0, 1.0));
float d = hash21(i + vec2(1.0, 1.0));
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
}
float fbm(vec2 p) {
float sum = 0.0;
float amp = 0.5;
float freq = 1.0;
for (int i = 0; i < 5; i++) {
sum += value_noise(p * freq) * amp;
freq *= 2.0;
amp *= 0.5;
}
return sum;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;
vec2 R = iResolution.xy / iResolution.y;
float time = iTime * 0.15; // Global slow time
// --- Digital Ocean Flow Field ---
vec2 flow_uv = uv * 0.7 + time * 0.5;
vec2 displacement = vec2(
fbm(flow_uv * 3.0 + vec2(0.0, time * 0.5)),
fbm(flow_uv * 3.0 + vec2(time * 0.5, 0.0))
) * 0.2; // Scale the distortion
vec2 distorted_uv = uv + displacement;
// --- Flowing Text/Data Pattern ---
vec2 grid_uv = distorted_uv * 15.0; // Scale for grid cells
grid_uv.y -= iTime * 0.3; // Overall vertical scroll
vec2 cell_id = floor(grid_uv);
vec2 cell_pos = fract(grid_uv) - 0.5; // Centered in cell (-0.5 to 0.5)
float pattern_val = 0.0;
// Base grid lines (subtle background structure)
float grid_line_thickness = 0.03;
pattern_val += smoothstep(grid_line_thickness, grid_line_thickness * 0.5, abs(cell_pos.x)) * 0.05;
pattern_val += smoothstep(grid_line_thickness, grid_line_thickness * 0.5, abs(cell_pos.y)) * 0.05;
// Procedural "characters" or "data segments"
float char_seed = hash21(cell_id);
float char_time_offset = iTime * (0.5 + char_seed * 0.5); // Varied blinking time per cell
float blink = (sin(char_time_offset * 5.0 + char_seed * 10.0) * 0.5 + 0.5); // Blinking effect
float segment_thickness = 0.1;
// Vertical line segments
if (char_seed < 0.6) {
float segment_length = 0.3 + 0.2 * sin(char_seed * 20.0 + iTime * 2.0);
float segment_offset_y = sin(char_seed * 30.0 + iTime * 1.5) * 0.2; // Wavy motion
float dist_x = abs(cell_pos.x);
float dist_y = abs(cell_pos.y - segment_offset_y);
if (dist_y < segment_length * 0.5) {
pattern_val = max(pattern_val, smoothstep(segment_thickness, segment_thickness * 0.5, dist_x) * blink);
}
}
// Horizontal line segments (less frequent)
if (char_seed > 0.6 && char_seed < 0.8) {
float h_segment_length = 0.2 + 0.1 * sin(char_seed * 15.0 + iTime * 1.8);
float h_segment_offset_x = sin(char_seed * 25.0 + iTime * 1.2) * 0.2;
float dist_x = abs(cell_pos.x - h_segment_offset_x);
float dist_y = abs(cell_pos.y);
if (dist_x < h_segment_length * 0.5) {
pattern_val = max(pattern_val, smoothstep(segment_thickness, segment_thickness * 0.5, dist_y) * blink * 0.5);
}
}
// Random "dots" or "pixels"
if (char_seed > 0.85) {
float dot_size = 0.08 + 0.05 * sin(char_seed * 40.0 + iTime * 4.0);
pattern_val = max(pattern_val, smoothstep(dot_size, dot_size * 0.5, length(cell_pos)) * blink * 1.5);
}
// Add some overall noise for organic texture
pattern_val += fbm(distorted_uv * 8.0 + time * 0.5) * 0.1;
// Amplify and sharpen the pattern for glowing effect
pattern_val = pow(pattern_val, 2.0) * 5.0;
// --- Coloring ---
vec3 color_bg = vec3(0.02, 0.02, 0.1); // Deep dark blue background
vec3 color_mid = vec3(0.05, 0.2, 0.4); // Mid-tone ocean blue
vec3 color_fg = vec3(0.1, 0.6, 0.8); // Cyan/Blue glow
vec3 color_bright = vec3(0.7, 1.0, 1.0); // Brightest core (white-cyan)
vec3 final_color = color_bg;
final_color = mix(final_color, color_mid, pattern_val * 0.5);
final_color = mix(final_color, color_fg, pattern_val * 1.5);
final_color = mix(final_color, color_bright, pattern_val * 3.0);
// Clamp color values to prevent over-saturation
final_color = min(final_color, vec3(1.0));
// --- Subtle Vignette ---
float vignette = smoothstep(1.0, 0.7, length(uv));
final_color *= vignette;
fragColor = vec4(final_color, 1.0);
}ZIP を展開して .playground を Xcode でダブルクリックし、Live View を表示して ▶ を押すとシェーダーがアニメーションします。Metal ソースは Resources/Shader.metal に独立ファイルとして入っているので、Xcode 上で直接編集できます。