MyGo 云音乐
Go와 MyGo로 만든 서드파티 네이버 클라우드 뮤직 데스크톱 클라이언트
WebGPU로 렌더링된 절차적 수중 세계, 방문마다 GPU 시드로 새로운 해저·산호·식물·물고기와 생물 생성
A procedurally generated underwater world rendered with WebGPU. Every visit grows a new reef: terrain, coral, plants, fish and creatures are all generated from a seed on the GPU.
미디어TypeScript · JavaScriptGitHub @greggman온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A procedurally generated underwater world rendered with WebGPU. Every run grows a
new reef: terrain, rocks, coral, plants, creatures and fish species are all
generated from a seed, mostly in GPU compute shaders.
Compute shaders are used in two places. At load time they build the world:
textures, terrain and every procedural mesh. Every frame they run the fish
simulation and three lighting effects.README 전문 보기 ↗A procedurally generated underwater world rendered with WebGPU. Every run grows a new reef: terrain, rocks, coral, plants, creatures and fish species are all generated from a seed, mostly in GPU compute shaders.
Compute shaders are used in two places. At load time they build the world: textures, terrain and every procedural mesh. Every frame they run the fish simulation and three lighting effects.
1. Detail texture: textures.ts
rgba16float storage texture,
with a different pattern in each channel:
MipGenerator), not compute.2. Terrain heightfield: terrain.ts. Two passes run one
after the other through the dispatch2D helper in util.ts.
basinHeight() builds the basin with fbm, a ridged cliff rim,
strata ledges and a gap that drops into the deep. A smooth-min cap keeps the
terrain from ever breaking the water surface.verifyHeightTexture) reads the
height texture back and compares it with the CPU copy. This catches a device
that wrote one but not the other, which would leave props floating in
mid-water.3. Procedural meshes: meshgen.ts
surface() function, which is spliced into
the builder shader. So there is effectively one compute pipeline per kind, and
each one evaluates every vertex of every patch of every variant in a single
dispatch.withLodChain) are the same surfaces run with fewer segments.4. Volumetric terrain: voxel.ts. This is optional,
enabled with ?terrain=voxel. The seabed becomes a 3D density field, which
allows overhangs and tunnels, and is meshed with surface nets entirely on the
GPU. Each 32³ chunk runs three passes:
density_main (4×4×4 workgroups) samples the field: the height map as a
baseline, plus leaning walls and carved tunnels.vertices places one vertex in each cell the surface crosses, using a Newton
step from the cell centre rather than the usual average of edge crossings,
which avoids a quilted look. Output slots are claimed with atomicAdd into
shared vertex and index buffers.quads emits a quad for each grid edge where the field changes sign, again
allocating with atomics.copyBufferToBuffer snapshots the running counters, which
gives that chunk's index range for culling later.top_main pass marches down each column of a 512² grid to find the
top of the rock, then refines it with bisection. It is read back so plants and
the camera stand on the real surface rather than on the height map.reportVertexError reads vertices back as a self-check against the height map.5. Fish simulation: fish.ts
simGroups[flip]).6. GPU culling and LOD: fish.ts (cullWgsl)
atomicAdd,
writing fish indices into a visible list.7. Indirect-args fill: fish.ts (indirectWgsl)
instanceCount fields of the
drawIndexedIndirect args, two draws per bucket (body and fins).8. Caustics: caustics.ts
causticsStride), followed by a mip rebuild.9. Volumetric light shafts: volumetrics.ts
10. SSAO: ssao.ts
rgba8unorm storage texture.Particles and ground cover are stateless: they are recomputed in the vertex shader from hashes and time, with no simulation buffers. Mip generation, bloom, depth of field, TAA and autofocus are all render passes; autofocus renders a small depth patch and reads it back.
any(id >= size) appears in every shader.createComputePipelineAsync is used almost everywhere.
device.ts wraps both pipeline-creation calls and pass
encoding for error reporting and profiling
(profiler.ts times compute passes).