diff options
Diffstat (limited to 'doc/UNIFORM_BUFFER_GUIDELINES.md')
| -rw-r--r-- | doc/UNIFORM_BUFFER_GUIDELINES.md | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/doc/UNIFORM_BUFFER_GUIDELINES.md b/doc/UNIFORM_BUFFER_GUIDELINES.md index 93999d8..c6cf9c8 100644 --- a/doc/UNIFORM_BUFFER_GUIDELINES.md +++ b/doc/UNIFORM_BUFFER_GUIDELINES.md @@ -16,11 +16,17 @@ Structs are padded to the alignment of their largest member. Any trailing space ## Standard Uniform Buffer Pattern -To maintain consistency and facilitate efficient rendering, a standard pattern for uniform buffer usage is established: +To maintain consistency and facilitate efficient rendering, standard patterns for uniform buffer usage are established: +### Post-Process Effects - **Binding 0 & 1:** Reserved for Sampler and Texture access (handled by `pp_update_bind_group`). -- **Binding 2:** **Common Uniforms** (`CommonPostProcessUniforms` or similar). This buffer should contain frequently used data like resolution, aspect ratio, physical time, beat time, beat phase, and audio intensity. -- **Binding 3:** **Effect-Specific Parameters**. This buffer holds parameters unique to a particular effect (e.g., `strength`, `speed`, `fade_amount`). +- **Binding 2:** **Common Uniforms** (`CommonPostProcessUniforms`). Contains resolution, aspect ratio, physical time, beat time, beat phase, audio intensity. +- **Binding 3:** **Effect-Specific Parameters**. Unique per-effect data (e.g., `strength`, `speed`, `fade_amount`). + +### SDF/Raymarching Effects +- **Binding 0:** **Common Uniforms** (`CommonPostProcessUniforms`). Same as above. +- **Binding 1:** **Camera Parameters** (`CameraParams`). Camera transform and projection data for raymarching. +- **Binding 2+:** **Effect-Specific Parameters** (optional). This pattern ensures that common data is shared efficiently across effects, while effect-specific data remains isolated. @@ -98,10 +104,36 @@ struct GaussianBlurParams { float strength = 2.0f; float _pad = 0.0f; }; -static_assert(sizeof(GaussianBlurParams) == 8, +static_assert(sizeof(GaussianBlurParams) == 8, "GaussianBlurParams must be 8 bytes for WGSL alignment"); ``` +**Example (C++ CameraParams):** + +```cpp +struct CameraParams { + mat4 inv_view; // 64 bytes - inverse view matrix (screen→world) + float fov; // 4 bytes - vertical field of view (radians) + float near_plane; // 4 bytes - near clipping plane + float far_plane; // 4 bytes - far clipping plane + float aspect_ratio; // 4 bytes - width/height ratio +}; +static_assert(sizeof(CameraParams) == 80, + "CameraParams must be 80 bytes for WGSL alignment"); +``` + +**Corresponding WGSL:** + +```wgsl +struct CameraParams { + inv_view: mat4x4<f32>, // 64 bytes + fov: f32, // 4 bytes + near_plane: f32, // 4 bytes + far_plane: f32, // 4 bytes + aspect_ratio: f32, // 4 bytes +} +``` + ## Handling Common Pitfalls - **`vec3<f32>` Padding:** Avoid using `vec3<f32>` for padding in WGSL, as it has a 16-byte alignment. If padding is needed, use `vec2<f32>` for 8 bytes or individual `f32`s for 4-byte alignment. |
