diff options
Diffstat (limited to 'src/3d')
| -rw-r--r-- | src/3d/renderer.cc | 32 | ||||
| -rw-r--r-- | src/3d/renderer.h | 2 |
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 |
