diff options
Diffstat (limited to 'src/effects/hybrid3_d_effect_v2.cc')
| -rw-r--r-- | src/effects/hybrid3_d_effect_v2.cc | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/src/effects/hybrid3_d_effect_v2.cc b/src/effects/hybrid3_d_effect_v2.cc index 5b44133..38e4e66 100644 --- a/src/effects/hybrid3_d_effect_v2.cc +++ b/src/effects/hybrid3_d_effect_v2.cc @@ -8,9 +8,51 @@ Hybrid3DEffectV2::Hybrid3DEffectV2(const GpuContext& ctx, const std::vector<std::string>& inputs, const std::vector<std::string>& outputs) - : EffectV2(ctx, inputs, outputs), depth_node_(outputs[0] + "_depth") { + : EffectV2(ctx, inputs, outputs), depth_node_(outputs[0] + "_depth"), + dummy_texture_(nullptr), dummy_texture_view_(nullptr) { // Initialize renderer (format is always RGBA8Unorm for v2) renderer_.init(ctx_.device, ctx_.queue, WGPUTextureFormat_RGBA8Unorm); + + // Create 1×1 white dummy texture for noise/sky (Renderer3D requires these) + WGPUTextureDescriptor tex_desc = {}; + tex_desc.size = {1, 1, 1}; + tex_desc.format = WGPUTextureFormat_RGBA8Unorm; + tex_desc.usage = WGPUTextureUsage_TextureBinding | WGPUTextureUsage_CopyDst; + tex_desc.dimension = WGPUTextureDimension_2D; + tex_desc.mipLevelCount = 1; + tex_desc.sampleCount = 1; + dummy_texture_ = wgpuDeviceCreateTexture(ctx_.device, &tex_desc); + dummy_texture_view_ = wgpuTextureCreateView(dummy_texture_, nullptr); + + // Write white pixel + uint32_t white_pixel = 0xFFFFFFFF; +#if defined(DEMO_CROSS_COMPILE_WIN32) + WGPUImageCopyTexture dst = { + .texture = dummy_texture_, + .mipLevel = 0, + .origin = {0, 0, 0} + }; + WGPUTextureDataLayout data_layout = { + .bytesPerRow = 4, + .rowsPerImage = 1 + }; +#else + WGPUTexelCopyTextureInfo dst = { + .texture = dummy_texture_, + .mipLevel = 0, + .origin = {0, 0, 0} + }; + WGPUTexelCopyBufferLayout data_layout = { + .bytesPerRow = 4, + .rowsPerImage = 1 + }; +#endif + WGPUExtent3D size = {1, 1, 1}; + wgpuQueueWriteTexture(ctx_.queue, &dst, &white_pixel, 4, &data_layout, &size); + + renderer_.set_noise_texture(dummy_texture_view_); + renderer_.set_sky_texture(dummy_texture_view_); + initialized_ = true; // Setup simple scene (1 center cube + 8 surrounding objects) @@ -40,6 +82,14 @@ Hybrid3DEffectV2::Hybrid3DEffectV2(const GpuContext& ctx, } } +Hybrid3DEffectV2::~Hybrid3DEffectV2() { + if (dummy_texture_view_) + wgpuTextureViewRelease(dummy_texture_view_); + if (dummy_texture_) + wgpuTextureRelease(dummy_texture_); + renderer_.shutdown(); +} + void Hybrid3DEffectV2::declare_nodes(NodeRegistry& registry) { // Declare depth buffer node registry.declare_node(depth_node_, NodeType::DEPTH24, -1, -1); |
