diff --git a/Content/Shaders/VolumetricFog.flax b/Content/Shaders/VolumetricFog.flax index 3613c79b6..6612a2c6a 100644 --- a/Content/Shaders/VolumetricFog.flax +++ b/Content/Shaders/VolumetricFog.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9ccc821da8613409f4c829f14958534f87c142edc6ac0f0d73d8a9e6e3fc6efc -size 13299 +oid sha256:ebbfff2b1ca68e630dff99b58b00de77f3e19e32fae3ad04dc7fae6ae95117ef +size 13293 diff --git a/Source/Engine/Graphics/Materials/MaterialShader.cpp b/Source/Engine/Graphics/Materials/MaterialShader.cpp index 63faaf300..ef119245d 100644 --- a/Source/Engine/Graphics/Materials/MaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShader.cpp @@ -87,6 +87,7 @@ void IMaterial::BindParameters::BindViewData() void IMaterial::BindParameters::BindDrawData() { // Write draw call to the object buffer + ASSERT(DrawCall); auto& objectBuffer = RenderContext.List->TempObjectBuffer; objectBuffer.Clear(); ShaderObjectData objData; diff --git a/Source/Engine/Renderer/VolumetricFogPass.cpp b/Source/Engine/Renderer/VolumetricFogPass.cpp index 2b9a4b441..d9a77bc37 100644 --- a/Source/Engine/Renderer/VolumetricFogPass.cpp +++ b/Source/Engine/Renderer/VolumetricFogPass.cpp @@ -60,9 +60,10 @@ bool VolumetricFogPass::setupResources() REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 0, Data); return true; } - if (shader->GetCB(1)->GetSize() != sizeof(PerLight)) + // CB1 is used for per-draw info (ObjectIndex) + if (shader->GetCB(2)->GetSize() != sizeof(PerLight)) { - REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 1, PerLight); + REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, 2, PerLight); return true; } @@ -254,7 +255,7 @@ GPUTextureView* VolumetricFogPass::GetLocalShadowedLightScattering(RenderContext } template -void VolumetricFogPass::RenderRadialLight(RenderContext& renderContext, GPUContext* context, RenderView& view, VolumetricFogOptions& options, T& light, PerLight& perLight, GPUConstantBuffer* cb1) +void VolumetricFogPass::RenderRadialLight(RenderContext& renderContext, GPUContext* context, RenderView& view, VolumetricFogOptions& options, T& light, PerLight& perLight, GPUConstantBuffer* cb2) { const Float3 center = light.Position; const float radius = light.Radius; @@ -281,8 +282,8 @@ void VolumetricFogPass::RenderRadialLight(RenderContext& renderContext, GPUConte light.SetShaderData(perLight.LocalLight, withShadow); // Upload data - context->UpdateCB(cb1, &perLight); - context->BindCB(1, cb1); + context->UpdateCB(cb2, &perLight); + context->BindCB(2, cb2); // Ensure to have valid buffers created if (_vbCircleRasterize == nullptr || _ibCircleRasterize == nullptr) @@ -414,6 +415,8 @@ void VolumetricFogPass::Render(RenderContext& renderContext) customData.VolumetricFogMaxDistance = cache.Data.VolumetricFogMaxDistance; bindParams.CustomData = &customData; bindParams.BindViewData(); + bindParams.DrawCall = &renderContext.List->VolumetricFogParticles.First(); + bindParams.BindDrawData(); for (auto& drawCall : renderContext.List->VolumetricFogParticles) { @@ -439,7 +442,7 @@ void VolumetricFogPass::Render(RenderContext& renderContext) // Setup volumetric shader data PerLight perLight; - auto cb1 = _shader->GetShader()->GetCB(1); + auto cb2 = _shader->GetShader()->GetCB(2); perLight.SliceToDepth.X = cache.Data.GridSize.Z; perLight.SliceToDepth.Y = cache.Data.VolumetricFogMaxDistance; perLight.MinZ = volumeZBoundsMin; @@ -447,8 +450,8 @@ void VolumetricFogPass::Render(RenderContext& renderContext) Matrix::Transpose(renderContext.View.Projection, perLight.ViewToVolumeClip); // Upload data - context->UpdateCB(cb1, &perLight); - context->BindCB(1, cb1); + context->UpdateCB(cb2, &perLight); + context->BindCB(2, cb2); // Call rendering to the volume const int32 instanceCount = volumeZBoundsMax - volumeZBoundsMin; @@ -495,7 +498,7 @@ void VolumetricFogPass::Render(RenderContext& renderContext) PerLight perLight; perLight.SliceToDepth.X = cache.Data.GridSize.Z; perLight.SliceToDepth.Y = cache.Data.VolumetricFogMaxDistance; - auto cb1 = _shader->GetShader()->GetCB(1); + auto cb2 = _shader->GetShader()->GetCB(2); // Bind the output context->SetRenderTarget(localShadowedLightScattering); @@ -505,12 +508,12 @@ void VolumetricFogPass::Render(RenderContext& renderContext) context->BindSR(0, shadowMap); context->BindSR(1, shadowsBuffer); for (int32 i = 0; i < pointLights.Count(); i++) - RenderRadialLight(renderContext, context, view, options, renderContext.List->PointLights[pointLights[i]], perLight, cb1); + RenderRadialLight(renderContext, context, view, options, renderContext.List->PointLights[pointLights[i]], perLight, cb2); for (int32 i = 0; i < spotLights.Count(); i++) - RenderRadialLight(renderContext, context, view, options, renderContext.List->SpotLights[spotLights[i]], perLight, cb1); + RenderRadialLight(renderContext, context, view, options, renderContext.List->SpotLights[spotLights[i]], perLight, cb2); // Cleanup - context->UnBindCB(1); + context->UnBindCB(2); context->ResetRenderTarget(); context->FlushState(); } diff --git a/Source/Engine/Renderer/VolumetricFogPass.h b/Source/Engine/Renderer/VolumetricFogPass.h index 0489bb88a..156f485f8 100644 --- a/Source/Engine/Renderer/VolumetricFogPass.h +++ b/Source/Engine/Renderer/VolumetricFogPass.h @@ -157,7 +157,7 @@ private: GPUTextureView* GetLocalShadowedLightScattering(RenderContext& renderContext, GPUContext* context, VolumetricFogOptions& options) const; void InitCircleBuffer(); template - void RenderRadialLight(RenderContext& renderContext, GPUContext* context, RenderView& view, VolumetricFogOptions& options, T& light, PerLight& perLight, GPUConstantBuffer* cb1); + void RenderRadialLight(RenderContext& renderContext, GPUContext* context, RenderView& view, VolumetricFogOptions& options, T& light, PerLight& perLight, GPUConstantBuffer* cb2); #if COMPILE_WITH_DEV_ENV void OnShaderReloading(Asset* obj) { diff --git a/Source/Shaders/VolumetricFog.shader b/Source/Shaders/VolumetricFog.shader index 0032149b2..d04a2eb92 100644 --- a/Source/Shaders/VolumetricFog.shader +++ b/Source/Shaders/VolumetricFog.shader @@ -60,7 +60,7 @@ SkyLightData SkyLight; DDGIData DDGI; META_CB_END -META_CB_BEGIN(1, PerLight) +META_CB_BEGIN(2, PerLight) float2 SliceToDepth; int MinZ; float LocalLightScatteringIntensity;