diff options
Diffstat (limited to 'src/gpu')
| -rw-r--r-- | src/gpu/demo_effects.h | 33 | ||||
| -rw-r--r-- | src/gpu/effects/distort_effect.cc | 28 | ||||
| -rw-r--r-- | src/gpu/effects/shaders.cc | 4 | ||||
| -rw-r--r-- | src/gpu/effects/shaders.h | 1 |
4 files changed, 58 insertions, 8 deletions
diff --git a/src/gpu/demo_effects.h b/src/gpu/demo_effects.h index 6c8729d..ad95cfe 100644 --- a/src/gpu/demo_effects.h +++ b/src/gpu/demo_effects.h @@ -127,6 +127,39 @@ class DistortEffect : public PostProcessEffect { void update_bind_group(WGPUTextureView input_view) override; }; +// Parameters for VignetteEffect +struct VignetteParams { + float radius = 0.5f; // Radius of the clear center + float softness = 0.5f; // Softness of the vignette edge +}; + +// Uniform data for VignetteEffect +struct VignetteUniforms { + float time; // offset 0 + float beat; // offset 4 + float intensity; // offset 8 + float aspect_ratio; // offset 12 + float width; // offset 16 + float height; // offset 20 + float radius; // offset 24 + float softness; // offset 28 +}; +static_assert(sizeof(VignetteUniforms) == 32, + "VignetteUniforms must be 32 bytes for WGSL alignment"); + +class VignetteEffect : public PostProcessEffect { + public: + VignetteEffect(const GpuContext& ctx); + VignetteEffect(const GpuContext& ctx, const VignetteParams& params); + void render(WGPURenderPassEncoder pass, float time, float beat, + float intensity, float aspect_ratio) override; + void update_bind_group(WGPUTextureView input_view) override; + + private: + VignetteParams params_; + UniformBuffer<VignetteUniforms> uniforms_; +}; + // Parameters for ChromaAberrationEffect (set at construction time) struct ChromaAberrationParams { float offset_scale = 0.02f; // Default: 2% screen offset diff --git a/src/gpu/effects/distort_effect.cc b/src/gpu/effects/distort_effect.cc index b7e27a7..589cdff 100644 --- a/src/gpu/effects/distort_effect.cc +++ b/src/gpu/effects/distort_effect.cc @@ -5,21 +5,33 @@ #include "gpu/gpu.h" // --- DistortEffect --- -DistortEffect::DistortEffect(const GpuContext& ctx) : PostProcessEffect(ctx) { - uniforms_ = - gpu_create_buffer(ctx_.device, sizeof(float) * 6, - WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst); +DistortEffect::DistortEffect(const GpuContext& ctx) + : DistortEffect(ctx, DistortParams()) {} + +DistortEffect::DistEffect(const GpuContext& ctx, const DistortParams& params) + : PostProcessEffect(ctx), params_(params) { + uniforms_ = gpu_create_buffer(ctx_.device, sizeof(DistortUniforms), + WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst); pipeline_ = create_post_process_pipeline(ctx_.device, ctx_.format, distort_shader_wgsl); } + void DistortEffect::render(WGPURenderPassEncoder pass, float t, float b, float i, float a) { - struct { - float t, b, i, a, w, h; - } u = {t, b, i, a, (float)width_, (float)height_}; + DistortUniforms u = { + .time = t, + .beat = b, + .intensity = i, + .aspect_ratio = a, + .width = (float)width_, + .height = (float)height_, + .strength = params_.strength, + .speed = params_.speed, + }; wgpuQueueWriteBuffer(ctx_.queue, uniforms_.buffer, 0, &u, sizeof(u)); PostProcessEffect::render(pass, t, b, i, a); } + void DistortEffect::update_bind_group(WGPUTextureView v) { pp_update_bind_group(ctx_.device, pipeline_, &bind_group_, v, uniforms_); -} +}
\ No newline at end of file diff --git a/src/gpu/effects/shaders.cc b/src/gpu/effects/shaders.cc index ce60a74..2e1cfe5 100644 --- a/src/gpu/effects/shaders.cc +++ b/src/gpu/effects/shaders.cc @@ -98,3 +98,7 @@ const char* distort_shader_wgsl = const char* chroma_aberration_shader_wgsl = SafeGetAsset(AssetId::ASSET_SHADER_CHROMA_ABERRATION); + +const char* vignette_shader_wgsl = + + SafeGetAsset(AssetId::ASSET_SHADER_VIGNETTE); diff --git a/src/gpu/effects/shaders.h b/src/gpu/effects/shaders.h index f8e45ba..50b4f32 100644 --- a/src/gpu/effects/shaders.h +++ b/src/gpu/effects/shaders.h @@ -17,3 +17,4 @@ extern const char* gaussian_blur_shader_wgsl; extern const char* solarize_shader_wgsl; extern const char* distort_shader_wgsl; extern const char* chroma_aberration_shader_wgsl; +extern const char* vignette_shader_wgsl; |
