summaryrefslogtreecommitdiff
path: root/src/3d
diff options
context:
space:
mode:
Diffstat (limited to 'src/3d')
-rw-r--r--src/3d/renderer.cc32
-rw-r--r--src/3d/renderer.h2
2 files changed, 18 insertions, 16 deletions
diff --git a/src/3d/renderer.cc b/src/3d/renderer.cc
index cbc3cfa..f190646 100644
--- a/src/3d/renderer.cc
+++ b/src/3d/renderer.cc
@@ -101,13 +101,14 @@ void Renderer3D::create_default_resources() {
void Renderer3D::set_noise_texture(WGPUTextureView noise_view) {
noise_texture_view_ = noise_view;
- // Note: Bind group needs recreation if texture changes, but we'll do it in
- // render for simplicity or just once at init if it's static. For this demo,
- // let's recreate in render if changed.
+}
+
+void Renderer3D::set_sky_texture(WGPUTextureView sky_view) {
+ sky_texture_view_ = sky_view;
}
void Renderer3D::create_pipeline() {
- WGPUBindGroupLayoutEntry entries[4] = {};
+ WGPUBindGroupLayoutEntry entries[5] = {};
entries[0].binding = 0;
entries[0].visibility = WGPUShaderStage_Vertex | WGPUShaderStage_Fragment;
entries[0].buffer.type = WGPUBufferBindingType_Uniform;
@@ -127,8 +128,13 @@ void Renderer3D::create_pipeline() {
entries[3].visibility = WGPUShaderStage_Fragment;
entries[3].sampler.type = WGPUSamplerBindingType_Filtering;
+ entries[4].binding = 4;
+ entries[4].visibility = WGPUShaderStage_Fragment;
+ entries[4].texture.sampleType = WGPUTextureSampleType_Float;
+ entries[4].texture.viewDimension = WGPUTextureViewDimension_2D;
+
WGPUBindGroupLayoutDescriptor bgl_desc = {};
- bgl_desc.entryCount = 4;
+ bgl_desc.entryCount = 5;
bgl_desc.entries = entries;
WGPUBindGroupLayout bgl = wgpuDeviceCreateBindGroupLayout(device_, &bgl_desc);
@@ -249,34 +255,28 @@ void Renderer3D::draw(WGPURenderPassEncoder pass, const Scene& scene,
if (bind_group_)
wgpuBindGroupRelease(bind_group_);
- WGPUBindGroupEntry bg_entries[4] = {};
+ WGPUBindGroupEntry bg_entries[5] = {};
bg_entries[0].binding = 0;
-
bg_entries[0].buffer = global_uniform_buffer_;
-
bg_entries[0].size = sizeof(GlobalUniforms);
bg_entries[1].binding = 1;
-
bg_entries[1].buffer = object_storage_buffer_;
-
bg_entries[1].size = sizeof(ObjectData) * kMaxObjects;
bg_entries[2].binding = 2;
-
bg_entries[2].textureView = noise_texture_view_;
bg_entries[3].binding = 3;
-
bg_entries[3].sampler = default_sampler_;
- WGPUBindGroupDescriptor bg_desc = {};
+ bg_entries[4].binding = 4;
+ bg_entries[4].textureView = sky_texture_view_ ? sky_texture_view_ : noise_texture_view_; // Fallback
+ WGPUBindGroupDescriptor bg_desc = {};
bg_desc.layout = wgpuRenderPipelineGetBindGroupLayout(pipeline_, 0);
-
- bg_desc.entryCount = 4;
-
+ bg_desc.entryCount = 5;
bg_desc.entries = bg_entries;
bind_group_ = wgpuDeviceCreateBindGroup(device_, &bg_desc);
diff --git a/src/3d/renderer.h b/src/3d/renderer.h
index c6ca2a3..3caa329 100644
--- a/src/3d/renderer.h
+++ b/src/3d/renderer.h
@@ -57,6 +57,7 @@ class Renderer3D {
const Camera& camera, float time);
void set_noise_texture(WGPUTextureView noise_view);
+ void set_sky_texture(WGPUTextureView sky_view);
// Resize handler (if needed for internal buffers)
void resize(int width, int height);
@@ -76,6 +77,7 @@ class Renderer3D {
WGPUBuffer object_storage_buffer_ = nullptr;
WGPUTextureView noise_texture_view_ = nullptr;
+ WGPUTextureView sky_texture_view_ = nullptr;
WGPUSampler default_sampler_ = nullptr;
// Depth buffer management