Reestructura carpetes: src->source, third_party->source/external, shaders->data/shaders
This commit is contained in:
26
CLAUDE.md
26
CLAUDE.md
@@ -51,9 +51,9 @@ Requires `glslc` (Debian/Ubuntu: `apt install glslang-tools`; macOS: `brew insta
|
||||
./shadertoy [SHADER_NAME_OR_PATH] [-F|--fullscreen] [--backend=auto|gpu|opengl]
|
||||
|
||||
# Examples:
|
||||
./shadertoy test # auto backend, shaders/test/
|
||||
./shadertoy test # auto backend, data/shaders/test/
|
||||
./shadertoy --backend=gpu seascape # force SDL3 GPU (Vulkan/Metal)
|
||||
./shadertoy -F shaders/fractal_pyramid # explicit folder path, fullscreen
|
||||
./shadertoy -F data/shaders/fractal_pyramid # explicit folder path, fullscreen
|
||||
```
|
||||
|
||||
**Runtime Controls:**
|
||||
@@ -64,22 +64,22 @@ Requires `glslc` (Debian/Ubuntu: `apt install glslang-tools`; macOS: `brew insta
|
||||
## Architecture
|
||||
|
||||
### Layered design
|
||||
- `src/main.cpp` — SDL3 window, event loop, shader-list scanning, dispatch to a backend.
|
||||
- `src/rendering/shader_backend.hpp` — abstract `IShaderBackend` interface + `ShaderMetadata` / `ShaderUniforms` / `ShaderProgramSpec` shared types. Two factories: `makeOpenGLBackend()`, `makeSdl3GpuBackend()`.
|
||||
- `src/rendering/opengl_shader_backend.{hpp,cpp}` — OpenGL 3.3 implementation. Loads `<folder>/<name>.gl.glsl` at runtime.
|
||||
- `src/rendering/sdl3gpu/sdl3gpu_shader_backend.{hpp,cpp}` — SDL3 GPU implementation. Loads `<folder>/<name>.frag.spv` (Linux/Windows) or `<folder>/<name>.frag.msl` (macOS); shares one passthrough vertex shader from `shaders/_common/passthrough.vert.{spv,msl}`.
|
||||
- `src/rendering/sdl3gpu/shader_factory.hpp` — small helper that loads a shader binary/source from disk and creates an `SDL_GPUShader`.
|
||||
- `source/main.cpp` — SDL3 window, event loop, shader-list scanning, dispatch to a backend.
|
||||
- `source/rendering/shader_backend.hpp` — abstract `IShaderBackend` interface + `ShaderMetadata` / `ShaderUniforms` / `ShaderProgramSpec` shared types. Two factories: `makeOpenGLBackend()`, `makeSdl3GpuBackend()`.
|
||||
- `source/rendering/opengl_shader_backend.{hpp,cpp}` — OpenGL 3.3 implementation. Loads `<folder>/<name>.gl.glsl` at runtime.
|
||||
- `source/rendering/sdl3gpu/sdl3gpu_shader_backend.{hpp,cpp}` — SDL3 GPU implementation. Loads `<folder>/<name>.frag.spv` (Linux/Windows) or `<folder>/<name>.frag.msl` (macOS); shares one passthrough vertex shader from `shaders/_common/passthrough.vert.{spv,msl}`.
|
||||
- `source/rendering/sdl3gpu/shader_factory.hpp` — small helper that loads a shader binary/source from disk and creates an `SDL_GPUShader`.
|
||||
|
||||
### Shader folder layout
|
||||
One folder per shader, under `shaders/`:
|
||||
One folder per shader, under `data/shaders/`:
|
||||
```
|
||||
shaders/<name>/
|
||||
data/shaders/<name>/
|
||||
<name>.gl.glsl # OpenGL GLSL 3.30 (handwritten)
|
||||
<name>.vk.glsl # Vulkan GLSL 4.50 (handwritten)
|
||||
<name>.frag.msl # Metal Shading Language (handwritten)
|
||||
<name>.frag.spv # generated by `make compile_shaders` from .vk.glsl
|
||||
meta.txt # Name / Author / iChannelN
|
||||
shaders/_common/
|
||||
data/shaders/_common/
|
||||
passthrough.vk.glsl # shared fullscreen-triangle vertex (Vulkan)
|
||||
passthrough.vert.spv # generated
|
||||
passthrough.vert.msl # handwritten Metal
|
||||
@@ -103,7 +103,7 @@ shaders_directory_ // Shaders root path (resolved at startup)
|
||||
|
||||
### Dependencies
|
||||
- **SDL3** ≥ 3.2 — windowing, events, GPU API (`SDL_gpu.h`)
|
||||
- **GLAD** — OpenGL 3.3 loader (used only by the OpenGL backend, statically linked via `third_party/glad/`)
|
||||
- **GLAD** — OpenGL 3.3 loader (used only by the OpenGL backend, statically linked via `source/external/glad/`)
|
||||
- **C++17 stdlib** — filesystem, fstream, vector, algorithms
|
||||
- Build-time tool: `glslc` (only required to regenerate `.frag.spv`)
|
||||
|
||||
@@ -116,7 +116,7 @@ Uses preprocessor defines (`WINDOWS_BUILD`, `MACOS_BUILD`, `LINUX_BUILD`) for:
|
||||
## Shader System
|
||||
|
||||
### Authoring a shader (manual steps)
|
||||
For each new shader, three handwritten files live in `shaders/<name>/`:
|
||||
For each new shader, three handwritten files live in `data/shaders/<name>/`:
|
||||
1. **`<name>.gl.glsl`** — OpenGL GLSL 3.30 (the original Shadertoy-style format described below).
|
||||
2. **`<name>.vk.glsl`** — Vulkan GLSL 4.50 with explicit `layout(set=3, binding=0) uniform ShadertoyUBO { float iTime; vec2 iResolution; } u;` and `layout(set=2, binding=N) uniform sampler2D` for any texture channel.
|
||||
3. **`<name>.frag.msl`** — Metal Shading Language. Entry point must be named `<name>_fs`. Uniforms come in via `[[buffer(0)]]`; samplers via `[[texture(N)]] [[sampler(N)]]`.
|
||||
@@ -159,7 +159,7 @@ void main() {
|
||||
```
|
||||
|
||||
### Adding New Shaders
|
||||
1. Create `.glsl` file in `shaders/` directory (use `.frag.glsl` convention)
|
||||
1. Create `.glsl` file in `data/shaders/<name>/` directory (use `.frag.glsl` convention)
|
||||
2. Follow required format above
|
||||
3. File automatically appears in runtime shader rotation (arrow keys to navigate)
|
||||
4. **No code changes required** - directory is scanned at startup
|
||||
|
||||
Reference in New Issue
Block a user