diff --git a/code/Mesh/Instance/InstanceMesh.cpp b/code/Mesh/Instance/InstanceMesh.cpp index ddd71d1aab..aa522464a1 100644 --- a/code/Mesh/Instance/InstanceMesh.cpp +++ b/code/Mesh/Instance/InstanceMesh.cpp @@ -18,6 +18,7 @@ #include "Render/Context/RenderContext.h" #include "Render/Mesh/Mesh.h" #include "World/IWorldRenderPass.h" +#include "World/WorldHandles.h" #include "World/WorldRenderView.h" namespace traktor::mesh @@ -29,8 +30,6 @@ render::Handle s_handleInstanceWorld(L"InstanceWorld"); render::Handle s_handleInstanceWorldLast(L"InstanceWorldLast"); render::Handle s_handleBoundingBoxMin(L"InstanceMesh_BoundingBoxMin"); render::Handle s_handleBoundingBoxMax(L"InstanceMesh_BoundingBoxMax"); -render::Handle s_handleView(L"InstanceMesh_View"); -render::Handle s_handleViewInverse(L"InstanceMesh_ViewInverse"); render::Handle s_handleVisibility(L"InstanceMesh_Visibility"); render::Handle s_handleCullFrustum(L"InstanceMesh_CullFrustum"); render::Handle s_handleDraw(L"InstanceMesh_Draw"); @@ -87,7 +86,7 @@ void InstanceMesh::build( const AlignedVector< Part >& parts = it->second; const auto& meshParts = m_renderMesh->getParts(); - const uint32_t bufferItemCount = alignUp(m_instances.size(), 16); + const uint32_t bufferItemCount = (uint32_t)alignUp(m_instances.size(), 16); // Lazy create the buffers. if (!m_instanceBuffer || bufferItemCount > m_instanceAllocatedCount) @@ -100,11 +99,11 @@ void InstanceMesh::build( } const uint32_t peakCascade = worldRenderView.getCascade(); - const uint32_t vbSize = m_visibilityBuffers.size(); + const uint32_t vbSize = (uint32_t)m_visibilityBuffers.size(); for (uint32_t i = vbSize; i < peakCascade + 1; ++i) m_visibilityBuffers.push_back(m_renderSystem->createBuffer(render::BufferUsage::BuStructured, bufferItemCount * sizeof(float), false)); - const uint32_t dbSize = m_drawBuffers.size(); + const uint32_t dbSize = (uint32_t)m_drawBuffers.size(); for (uint32_t i = dbSize; i < (peakCascade + 1) * parts.size(); ++i) m_drawBuffers.push_back(m_renderSystem->createBuffer(render::BufferUsage::BuStructured | render::BufferUsage::BuIndirect, bufferItemCount * sizeof(render::IndexedIndirectDraw), false)); @@ -128,29 +127,42 @@ void InstanceMesh::build( const Frustum& cf = worldRenderView.getCullFrustum(); T_FATAL_ASSERT(cf.planes.size() <= sizeof_array(cullFrustum)); - for (int32_t i = 0; i < cf.planes.size(); ++i) + for (int32_t i = 0; i < (int32_t)cf.planes.size(); ++i) cullFrustum[i] = cf.planes[i].normal().xyz0() + Vector4(0.0f, 0.0f, 0.0f, cf.planes[i].distance()); - for (int32_t i = cf.planes.size(); i < sizeof_array(cullFrustum); ++i) + for (int32_t i = (int32_t)cf.planes.size(); i < sizeof_array(cullFrustum); ++i) cullFrustum[i] = Vector4::zero(); auto renderBlock = renderContext->allocNamed< render::ComputeRenderBlock >( str(L"InstanceMesh cull %d", worldRenderView.getCascade()) ); - renderBlock->program = m_shaderCull->getProgram().program; + render::Shader::Permutation perm; + if (worldRenderPass.getTechnique() == world::s_techniqueDeferredGBufferWrite) + { + // Deferred g-buffer pass has access to HiZ texture. + m_shaderCull->setCombination(render::getParameterHandle(L"InstanceMesh_HiZ"), true, perm); + } + else + { + // All other paths use simple frustum culling only. + m_shaderCull->setCombination(render::getParameterHandle(L"InstanceMesh_HiZ"), false, perm); + } + + renderBlock->program = m_shaderCull->getProgram(perm).program; renderBlock->programParams = renderContext->alloc< render::ProgramParameters >(); renderBlock->programParams->beginParameters(renderContext); + + worldRenderPass.setProgramParameters(renderBlock->programParams); + renderBlock->programParams->setVectorParameter(s_handleBoundingBoxMin, m_renderMesh->getBoundingBox().mn); renderBlock->programParams->setVectorParameter(s_handleBoundingBoxMax, m_renderMesh->getBoundingBox().mx); renderBlock->programParams->setVectorArrayParameter(s_handleCullFrustum, cullFrustum, sizeof_array(cullFrustum)); - renderBlock->programParams->setMatrixParameter(s_handleView, worldRenderView.getView()); - renderBlock->programParams->setMatrixParameter(s_handleViewInverse, worldRenderView.getView().inverse()); renderBlock->programParams->setBufferViewParameter(s_handleInstanceWorld, m_instanceBuffer->getBufferView()); renderBlock->programParams->setBufferViewParameter(s_handleVisibility, visibilityBuffer->getBufferView()); renderBlock->programParams->endParameters(renderContext); - renderBlock->workSize[0] = m_instances.size(); + renderBlock->workSize[0] = (int32_t)m_instances.size(); renderContext->compute(renderBlock); renderContext->compute< render::BarrierRenderBlock >(render::Stage::Compute, render::Stage::Compute); @@ -185,7 +197,7 @@ void InstanceMesh::build( renderBlock->programParams->setBufferViewParameter(s_handleDraw, drawBuffer->getBufferView()); renderBlock->programParams->endParameters(renderContext); - renderBlock->workSize[0] = m_instances.size(); + renderBlock->workSize[0] = (int32_t)m_instances.size(); renderContext->compute(renderBlock); } @@ -217,7 +229,7 @@ void InstanceMesh::build( renderBlock->vertexLayout = m_renderMesh->getVertexLayout(); renderBlock->primitive = meshParts[part.meshPart].primitives.type; renderBlock->drawBuffer = drawBuffer->getBufferView(); - renderBlock->drawCount = m_instances.size(); + renderBlock->drawCount = (uint32_t)m_instances.size(); renderBlock->programParams->beginParameters(renderContext); @@ -248,12 +260,13 @@ InstanceMesh::Instance* InstanceMesh::allocateInstance() return instance; } -void InstanceMesh::releaseInstance(Instance* instance) +void InstanceMesh::releaseInstance(Instance*& instance) { T_FATAL_ASSERT(instance->mesh == this); auto it = std::find(m_instances.begin(), m_instances.end(), instance); m_instances.erase(it); delete instance; + instance = nullptr; } void InstanceMesh::Instance::setTransform(const Transform& transform) diff --git a/code/Mesh/Instance/InstanceMesh.h b/code/Mesh/Instance/InstanceMesh.h index 5a0785870b..0e87c30955 100644 --- a/code/Mesh/Instance/InstanceMesh.h +++ b/code/Mesh/Instance/InstanceMesh.h @@ -100,7 +100,7 @@ class T_DLLCLASS InstanceMesh : public IMesh Instance* allocateInstance(); - void releaseInstance(Instance* instance); + void releaseInstance(Instance*& instance); // diff --git a/code/Mesh/Instance/InstanceMeshComponent.cpp b/code/Mesh/Instance/InstanceMeshComponent.cpp index d1cdf02bf3..c008994375 100644 --- a/code/Mesh/Instance/InstanceMeshComponent.cpp +++ b/code/Mesh/Instance/InstanceMeshComponent.cpp @@ -23,9 +23,17 @@ InstanceMeshComponent::InstanceMeshComponent(const resource::Proxy< InstanceMesh m_meshInstance = m_mesh->allocateInstance(); } +InstanceMeshComponent::~InstanceMeshComponent() +{ + // Need to call destroy here since editor doesn't always call destroy on components + // but instead rely on reference counting to do the cleanup. + destroy(); +} + void InstanceMeshComponent::destroy() { - m_mesh->releaseInstance(m_meshInstance); + if (m_mesh && m_meshInstance != nullptr) + m_mesh->releaseInstance(m_meshInstance); m_mesh.clear(); MeshComponent::destroy(); } @@ -33,7 +41,6 @@ void InstanceMeshComponent::destroy() void InstanceMeshComponent::setTransform(const Transform& transform) { MeshComponent::setTransform(transform); - m_meshInstance->setTransform(transform); } diff --git a/code/Mesh/Instance/InstanceMeshComponent.h b/code/Mesh/Instance/InstanceMeshComponent.h index b8445c2f82..2e2a2d3e88 100644 --- a/code/Mesh/Instance/InstanceMeshComponent.h +++ b/code/Mesh/Instance/InstanceMeshComponent.h @@ -34,6 +34,8 @@ class T_DLLCLASS InstanceMeshComponent : public MeshComponent public: explicit InstanceMeshComponent(const resource::Proxy< InstanceMesh >& mesh); + virtual ~InstanceMeshComponent(); + virtual void destroy() override final; virtual void setTransform(const Transform& transform) override; diff --git a/code/Render/Frame/RenderGraph.cpp b/code/Render/Frame/RenderGraph.cpp index a09f9aff90..8cd104ca37 100644 --- a/code/Render/Frame/RenderGraph.cpp +++ b/code/Render/Frame/RenderGraph.cpp @@ -196,6 +196,18 @@ handle_t RenderGraph::addTransientTexture(const wchar_t* const name, const Rende return resourceId; } +handle_t RenderGraph::addPersistentTexture(const wchar_t* const name, handle_t persistentHandle, const RenderGraphTextureDesc& textureDesc) +{ + const handle_t resourceId = m_nextResourceId++; + + auto& tr = m_textures[resourceId]; + tr.name = name; + tr.persistentHandle = persistentHandle; + tr.textureDesc = textureDesc; + + return resourceId; +} + IRenderTargetSet* RenderGraph::getTargetSet(handle_t resource) const { auto it = m_targets.find(resource); @@ -355,10 +367,7 @@ bool RenderGraph::build(RenderContext* renderContext, int32_t width, int32_t hei auto& sbuffer = it.second; if (sbuffer.buffer == nullptr) { - sbuffer.buffer = m_bufferPool->acquire( - sbuffer.bufferSize, - sbuffer.persistentHandle - ); + sbuffer.buffer = m_bufferPool->acquire(sbuffer.bufferSize, sbuffer.persistentHandle); if (!sbuffer.buffer) return false; } @@ -369,7 +378,7 @@ bool RenderGraph::build(RenderContext* renderContext, int32_t width, int32_t hei auto& texture = it.second; if (texture.texture == nullptr) { - texture.texture = m_texturePool->acquire(texture.textureDesc); + texture.texture = m_texturePool->acquire(texture.textureDesc, texture.persistentHandle); if (!texture.texture) return false; } diff --git a/code/Render/Frame/RenderGraph.h b/code/Render/Frame/RenderGraph.h index d8ad179a6e..e8460fce2a 100644 --- a/code/Render/Frame/RenderGraph.h +++ b/code/Render/Frame/RenderGraph.h @@ -89,6 +89,7 @@ class T_DLLCLASS RenderGraph : public Object struct TextureResource { const wchar_t* name = nullptr; + handle_t persistentHandle = 0; RenderGraphTextureDesc textureDesc; Ref< ITexture > texture; }; @@ -192,6 +193,10 @@ class T_DLLCLASS RenderGraph : public Object */ handle_t addTransientTexture(const wchar_t* const name, const RenderGraphTextureDesc& textureDesc); + /*! + */ + handle_t addPersistentTexture(const wchar_t* const name, handle_t persistentHandle, const RenderGraphTextureDesc& textureDesc); + /*! Get target set from resource handle. * * \param resource Opaque resource handle. diff --git a/code/Render/Frame/RenderGraphTexturePool.cpp b/code/Render/Frame/RenderGraphTexturePool.cpp index 7949d07d84..7920446a93 100644 --- a/code/Render/Frame/RenderGraphTexturePool.cpp +++ b/code/Render/Frame/RenderGraphTexturePool.cpp @@ -26,13 +26,16 @@ void RenderGraphTexturePool::destroy() m_renderSystem = nullptr; } -Ref< ITexture > RenderGraphTexturePool::acquire(const RenderGraphTextureDesc& textureDesc) +Ref< ITexture > RenderGraphTexturePool::acquire(const RenderGraphTextureDesc& textureDesc, uint32_t persistentHandle) { auto it = std::find_if( m_pool.begin(), m_pool.end(), [&](const RenderGraphTexturePool::Pool& p) { + if (p.persistentHandle != persistentHandle) + return false; + return std::memcmp(&p.textureDesc, &textureDesc, sizeof(textureDesc)) == 0; } ); @@ -45,6 +48,7 @@ Ref< ITexture > RenderGraphTexturePool::acquire(const RenderGraphTextureDesc& te { pool = &m_pool.push_back(); pool->textureDesc = textureDesc; + pool->persistentHandle = persistentHandle; } // Acquire free texture, if no one left we need to create a new texture. diff --git a/code/Render/Frame/RenderGraphTexturePool.h b/code/Render/Frame/RenderGraphTexturePool.h index 3f0124583c..93b0d4eedb 100644 --- a/code/Render/Frame/RenderGraphTexturePool.h +++ b/code/Render/Frame/RenderGraphTexturePool.h @@ -31,7 +31,7 @@ class RenderGraphTexturePool : public Object void destroy(); - Ref< ITexture > acquire(const RenderGraphTextureDesc& textureDesc); + Ref< ITexture > acquire(const RenderGraphTextureDesc& textureDesc, uint32_t persistentHandle); void release(Ref< ITexture >& texture); @@ -40,6 +40,7 @@ class RenderGraphTexturePool : public Object { // Pool identification. RenderGraphTextureDesc textureDesc; + uint32_t persistentHandle; // Pool buffers. RefArray< ITexture > free; diff --git a/code/Weather/Sky/SkyComponent.cpp b/code/Weather/Sky/SkyComponent.cpp index ddfe86721d..3140c9fc33 100644 --- a/code/Weather/Sky/SkyComponent.cpp +++ b/code/Weather/Sky/SkyComponent.cpp @@ -20,6 +20,7 @@ #include "Weather/Sky/SkyComponent.h" #include "World/Entity.h" #include "World/IWorldRenderPass.h" +#include "World/WorldHandles.h" #include "World/WorldRenderView.h" #include "World/WorldSetupContext.h" #include "World/Entity/LightComponent.h" @@ -43,6 +44,8 @@ const render::Handle s_handleWeather_SkySunDirection(L"Weather_SkySunDirection") const render::Handle s_handleWeather_SkySunColor(L"Weather_SkySunColor"); const render::Handle s_handleWeather_SkyEyePosition(L"Weather_SkyEyePosition"); const render::Handle s_handleWeather_SkyCloudTexture(L"Weather_SkyCloudTexture"); +const render::Handle s_handleWeather_InputTexture(L"Weather_InputTexture"); +const render::Handle s_handleWeather_OutputTexture(L"Weather_OutputTexture"); const int32_t c_longitudes = 16; const int32_t c_latitudes = 24; @@ -134,6 +137,8 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I ); render::SimpleTextureCreateDesc stcd = {}; + render::VolumeTextureCreateDesc vtcd = {}; + stcd.width = 512; stcd.height = 512; stcd.mipCount = 1; @@ -141,7 +146,6 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I stcd.shaderStorage = true; m_cloudTextures[0] = renderSystem->createSimpleTexture(stcd, T_FILE_LINE_W); - render::VolumeTextureCreateDesc vtcd = {}; vtcd.width = 64; vtcd.height = 64; vtcd.depth = 64; @@ -150,7 +154,6 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I vtcd.shaderStorage = true; m_cloudTextures[1] = renderSystem->createVolumeTexture(vtcd, T_FILE_LINE_W); - //render::SimpleTextureCreateDesc stcd = {}; stcd.width = 1024; stcd.height = 256; stcd.mipCount = 1; @@ -159,7 +162,7 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I m_cloudDomeTexture[0] = renderSystem->createSimpleTexture(stcd, T_FILE_LINE_W); m_cloudDomeTexture[1] = renderSystem->createSimpleTexture(stcd, T_FILE_LINE_W); - if (!m_cloudTextures[0] || !m_cloudTextures[1]) + if (!m_cloudTextures[0] || !m_cloudTextures[1] || !m_cloudDomeTexture[0] || !m_cloudDomeTexture[1]) return false; if (!resourceManager->bind(c_shaderClouds2D, m_shaderClouds2D)) @@ -183,6 +186,8 @@ void SkyComponent::destroy() safeDestroy(m_vertexBuffer); safeDestroy(m_cloudTextures[0]); safeDestroy(m_cloudTextures[1]); + safeDestroy(m_cloudDomeTexture[0]); + safeDestroy(m_cloudDomeTexture[1]); m_shader.clear(); m_texture.clear(); m_shaderClouds2D.clear(); @@ -214,8 +219,6 @@ void SkyComponent::setup( const world::WorldRenderView& worldRenderView ) { - const static render::Handle s_handleInputTexture(L"Weather_InputTexture"); - const static render::Handle s_handleOutputTexture(L"Weather_OutputTexture"); render::RenderGraph& renderGraph = context.getRenderGraph(); if (m_shaderClouds2D.changed() || m_shaderClouds3D.changed()) @@ -238,7 +241,7 @@ void SkyComponent::setup( renderBlock->programParams = renderContext->alloc< render::ProgramParameters >(); renderBlock->programParams->beginParameters(renderContext); - renderBlock->programParams->setImageViewParameter(s_handleOutputTexture, m_cloudTextures[0], 0); + renderBlock->programParams->setImageViewParameter(s_handleWeather_OutputTexture, m_cloudTextures[0], 0); renderBlock->programParams->endParameters(renderContext); renderContext->compute(renderBlock); @@ -253,7 +256,7 @@ void SkyComponent::setup( renderBlock->programParams = renderContext->alloc< render::ProgramParameters >(); renderBlock->programParams->beginParameters(renderContext); - renderBlock->programParams->setImageViewParameter(s_handleOutputTexture, m_cloudTextures[1], 0); + renderBlock->programParams->setImageViewParameter(s_handleWeather_OutputTexture, m_cloudTextures[1], 0); renderBlock->programParams->endParameters(renderContext); renderContext->compute(renderBlock); @@ -265,7 +268,7 @@ void SkyComponent::setup( m_dirty = false; } - const int32_t cloudFrame = int32_t(worldRenderView.getTime() * 4.0f); + const int32_t cloudFrame = int32_t(worldRenderView.getTime() * 8.0f); // Generate dome projected cloud layer. if (worldRenderView.getIndex() == 0 && cloudFrame != m_cloudFrame) @@ -293,17 +296,14 @@ void SkyComponent::setup( renderBlock->programParams = renderContext->alloc< render::ProgramParameters >(); renderBlock->programParams->beginParameters(renderContext); - - renderBlock->programParams->setImageViewParameter(s_handleInputTexture, input, 0); - renderBlock->programParams->setImageViewParameter(s_handleOutputTexture, output, 0); - + renderBlock->programParams->setImageViewParameter(s_handleWeather_InputTexture, input, 0); + renderBlock->programParams->setImageViewParameter(s_handleWeather_OutputTexture, output, 0); renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud2D, m_cloudTextures[0]); renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud3D, m_cloudTextures[1]); renderBlock->programParams->setFloatParameter(s_handleWeather_SkyRadius, worldRenderView.getViewFrustum().getFarZ() - 10.0f); renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunColor, sunColor); renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunDirection, sunDirection); - renderBlock->programParams->setFloatParameter(render::getParameterHandle(L"World_Time"), worldRenderView.getTime()); - + renderBlock->programParams->setFloatParameter(world::s_handleTime, worldRenderView.getTime()); renderBlock->programParams->endParameters(renderContext); renderContext->compute(renderBlock); @@ -355,23 +355,17 @@ void SkyComponent::build( renderBlock->primitives = m_primitives; renderBlock->programParams->beginParameters(renderContext); - worldRenderPass.setProgramParameters(renderBlock->programParams); - renderBlock->programParams->setFloatParameter(s_handleWeather_SkyRadius, worldRenderView.getViewFrustum().getFarZ() - 10.0f); renderBlock->programParams->setFloatParameter(s_handleWeather_SkyRotation, rotation); renderBlock->programParams->setFloatParameter(s_handleWeather_SkyIntensity, m_intensity); - renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunDirection, sunDirection); renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunColor, sunColor); renderBlock->programParams->setVectorParameter(s_handleWeather_SkyEyePosition, eyePosition); - renderBlock->programParams->setTextureParameter(s_handleWeather_SkyTexture, m_texture); renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud2D, m_cloudTextures[0]); renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud3D, m_cloudTextures[1]); - renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloudTexture, cloudDomeTexture); - renderBlock->programParams->endParameters(renderContext); renderContext->draw(sp.priority, renderBlock); diff --git a/code/World/Deferred/WorldRendererDeferred.cpp b/code/World/Deferred/WorldRendererDeferred.cpp index 7689e9cd4a..771d7910a5 100644 --- a/code/World/Deferred/WorldRendererDeferred.cpp +++ b/code/World/Deferred/WorldRendererDeferred.cpp @@ -53,12 +53,18 @@ namespace traktor::world namespace { -const render::Handle s_handleVisualTargetSet[] = +const render::Handle s_persistentVisualTargetSet[] = { render::Handle(L"World_VisualTargetSet_Even"), render::Handle(L"World_VisualTargetSet_Odd") }; +const render::Handle s_persistentHiZTexture[] = +{ + render::Handle(L"World_HiZTexture_Even"), + render::Handle(L"World_HiZTexture_Odd") +}; + const resource::Id< render::Shader > c_lightShader(L"{707DE0B0-0E2B-A44A-9441-9B1FCFD428AA}"); } @@ -127,23 +133,40 @@ void WorldRendererDeferred::setup( } // Add visual target sets. - render::RenderGraphTargetSetDesc rgtd; - rgtd.count = 1; - rgtd.createDepthStencil = false; - rgtd.referenceWidthDenom = 1; - rgtd.referenceHeightDenom = 1; - rgtd.targets[0].colorFormat = render::TfR16G16B16A16F; + render::RenderGraphTargetSetDesc rgtsd; + rgtsd.count = 1; + rgtsd.createDepthStencil = false; + rgtsd.referenceWidthDenom = 1; + rgtsd.referenceHeightDenom = 1; + rgtsd.targets[0].colorFormat = render::TfR16G16B16A16F; const DoubleBufferedTarget visualTargetSetId = { - renderGraph.addPersistentTargetSet(L"Previous", s_handleVisualTargetSet[count % 2], false, rgtd, outputTargetSetId, outputTargetSetId), - renderGraph.addPersistentTargetSet(L"Current", s_handleVisualTargetSet[(count + 1) % 2], false, rgtd, outputTargetSetId, outputTargetSetId) + renderGraph.addPersistentTargetSet(L"Previous", s_persistentVisualTargetSet[count % 2], false, rgtsd, outputTargetSetId, outputTargetSetId), + renderGraph.addPersistentTargetSet(L"Current", s_persistentVisualTargetSet[(count + 1) % 2], false, rgtsd, outputTargetSetId, outputTargetSetId) }; + // Add Hi-Z textures. + const Vector2 viewSize = worldRenderView.getViewSize(); + const int32_t viewWidth = (int32_t)viewSize.x; + const int32_t viewHeight = (int32_t)viewSize.y; + const int32_t mipCount = log2(std::max(viewWidth, viewHeight)) + 1; + + render::RenderGraphTextureDesc rgtxd; + rgtxd.width = viewWidth >> 1; + rgtxd.height = viewHeight >> 1; + rgtxd.mipCount = mipCount - 1; + rgtxd.format = render::TfR32F; + const DoubleBufferedTarget hizTextureId = + { + renderGraph.addPersistentTexture(L"HiZ Previous", s_persistentHiZTexture[count % 2], rgtxd), + renderGraph.addPersistentTexture(L"HiZ Current", s_persistentHiZTexture[(count + 1) % 2], rgtxd) + }; + // Add passes to render graph. m_lightClusterPass->setup(worldRenderView, m_gatheredView); - auto gbufferTargetSetId = m_gbufferPass->setup(worldRenderView, m_gatheredView, m_irradianceGrid, s_techniqueDeferredGBufferWrite, renderGraph, outputTargetSetId); + auto gbufferTargetSetId = m_gbufferPass->setup(worldRenderView, m_gatheredView, m_irradianceGrid, s_techniqueDeferredGBufferWrite, renderGraph, hizTextureId.previous, outputTargetSetId); auto dbufferTargetSetId = m_dbufferPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId); - auto hiZTextureId = m_hiZPass->setup(worldRenderView, renderGraph, gbufferTargetSetId); + m_hiZPass->setup(worldRenderView, renderGraph, gbufferTargetSetId, hizTextureId.current); auto velocityTargetSetId = m_velocityPass->setup(worldRenderView, m_gatheredView, count, renderGraph, gbufferTargetSetId, outputTargetSetId); auto ambientOcclusionTargetSetId = m_ambientOcclusionPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId); auto contactShadowsTargetSetId = m_contactShadowsPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId); @@ -163,11 +186,11 @@ void WorldRendererDeferred::setup( visualTargetSetId.current, gbufferTargetSetId, dbufferTargetSetId, - hiZTextureId, ambientOcclusionTargetSetId, contactShadowsTargetSetId, reflectionsTargetSetId, - shadowMapAtlasTargetSetId + shadowMapAtlasTargetSetId, + hizTextureId.current ); m_postProcessPass->setup(worldRenderView, m_gatheredView, count, renderGraph, gbufferTargetSetId, velocityTargetSetId, visualTargetSetId, outputTargetSetId); @@ -181,11 +204,11 @@ void WorldRendererDeferred::setupVisualPass( render::handle_t visualWriteTargetSetId, render::handle_t gbufferTargetSetId, render::handle_t dbufferTargetSetId, - render::handle_t hiZTextureId, render::handle_t ambientOcclusionTargetSetId, render::handle_t contactShadowsTargetSetId, render::handle_t reflectionsTargetSetId, - render::handle_t shadowMapAtlasTargetSetId + render::handle_t shadowMapAtlasTargetSetId, + render::handle_t outputHiZTextureId ) const { T_PROFILER_SCOPE(L"World setup visual"); @@ -211,11 +234,11 @@ void WorldRendererDeferred::setupVisualPass( Ref< render::RenderPass > rp = new render::RenderPass(L"Visual"); rp->addInput(gbufferTargetSetId); rp->addInput(dbufferTargetSetId); - // rp->addInput(hiZTextureId); rp->addInput(ambientOcclusionTargetSetId); // rp->addInput(contactShadowsTargetSetId); rp->addInput(reflectionsTargetSetId); rp->addInput(shadowMapAtlasTargetSetId); + rp->addInput(outputHiZTextureId); for (auto attachment : m_visualAttachments) rp->addInput(attachment); diff --git a/code/World/Deferred/WorldRendererDeferred.h b/code/World/Deferred/WorldRendererDeferred.h index b96e0625a4..3ed55a174a 100644 --- a/code/World/Deferred/WorldRendererDeferred.h +++ b/code/World/Deferred/WorldRendererDeferred.h @@ -65,11 +65,11 @@ class T_DLLCLASS WorldRendererDeferred : public WorldRendererShared render::handle_t visualWriteTargetSetId, render::handle_t gbufferTargetSetId, render::handle_t dbufferTargetSetId, - render::handle_t hiZTextureId, render::handle_t ambientOcclusionTargetSetId, render::handle_t contactShadowsTargetSetId, render::handle_t reflectionsTargetSetId, - render::handle_t shadowMapAtlasTargetSetId + render::handle_t shadowMapAtlasTargetSetId, + render::handle_t outputHiZTextureId ) const; }; diff --git a/code/World/Forward/WorldRendererForward.cpp b/code/World/Forward/WorldRendererForward.cpp index 0ee8944dd3..6e84a3ef22 100644 --- a/code/World/Forward/WorldRendererForward.cpp +++ b/code/World/Forward/WorldRendererForward.cpp @@ -139,9 +139,9 @@ void WorldRendererForward::setup( // Add passes to render graph. m_lightClusterPass->setup(worldRenderView, m_gatheredView); - auto gbufferTargetSetId = m_gbufferPass->setup(worldRenderView, m_gatheredView, nullptr, s_techniqueForwardGBufferWrite, renderGraph, outputTargetSetId); + auto gbufferTargetSetId = m_gbufferPass->setup(worldRenderView, m_gatheredView, nullptr, s_techniqueForwardGBufferWrite, renderGraph, 0, outputTargetSetId); auto dbufferTargetSetId = m_dbufferPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId); - auto hiZTargetSetId = m_hiZPass->setup(worldRenderView, renderGraph, gbufferTargetSetId); + //m_hiZPass->setup(worldRenderView, renderGraph, gbufferTargetSetId); auto velocityTargetSetId = m_velocityPass->setup(worldRenderView, m_gatheredView, count, renderGraph, gbufferTargetSetId, outputTargetSetId); auto ambientOcclusionTargetSetId = m_ambientOcclusionPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId); auto reflectionsTargetSetId = m_reflectionsPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, dbufferTargetSetId, visualTargetSetId.previous, outputTargetSetId); diff --git a/code/World/Shared/Passes/GBufferPass.cpp b/code/World/Shared/Passes/GBufferPass.cpp index 9987bd3e0d..5ab95913d0 100644 --- a/code/World/Shared/Passes/GBufferPass.cpp +++ b/code/World/Shared/Passes/GBufferPass.cpp @@ -40,6 +40,7 @@ render::handle_t GBufferPass::setup( const IrradianceGrid* irradianceGrid, render::handle_t gbufferWriteTechnique, render::RenderGraph& renderGraph, + render::handle_t hiZTextureId, render::handle_t outputTargetSetId ) const { @@ -60,6 +61,7 @@ render::handle_t GBufferPass::setup( // Add GBuffer render pass. Ref< render::RenderPass > rp = new render::RenderPass(L"GBuffer"); + rp->addInput(hiZTextureId); render::Clear clear; clear.mask = render::CfColor | render::CfDepth | render::CfStencil; @@ -95,6 +97,12 @@ render::handle_t GBufferPass::setup( sharedParams->setBufferViewParameter(s_handleIrradianceGridSBuffer, irradianceGrid->getBuffer()->getBufferView()); } + if (hiZTextureId != 0) + { + auto hiZTexture = renderGraph.getTexture(hiZTextureId); + sharedParams->setTextureParameter(s_handleHiZTexture, hiZTexture); + } + sharedParams->endParameters(renderContext); const WorldRenderPassShared gbufferPass( diff --git a/code/World/Shared/Passes/GBufferPass.h b/code/World/Shared/Passes/GBufferPass.h index 4f36afe23d..f28cf3254a 100644 --- a/code/World/Shared/Passes/GBufferPass.h +++ b/code/World/Shared/Passes/GBufferPass.h @@ -44,6 +44,7 @@ class GBufferPass : public Object const IrradianceGrid* irradianceGrid, render::handle_t gbufferWriteTechnique, render::RenderGraph& renderGraph, + render::handle_t hiZTextureId, render::handle_t outputTargetSetId ) const; diff --git a/code/World/Shared/Passes/HiZPass.cpp b/code/World/Shared/Passes/HiZPass.cpp index 3a76476def..a7a020319f 100644 --- a/code/World/Shared/Passes/HiZPass.cpp +++ b/code/World/Shared/Passes/HiZPass.cpp @@ -47,10 +47,11 @@ bool HiZPass::create(resource::IResourceManager* resourceManager) return true; } -render::handle_t HiZPass::setup( +void HiZPass::setup( const WorldRenderView& worldRenderView, render::RenderGraph& renderGraph, - render::handle_t gbufferTargetSetId + render::handle_t gbufferTargetSetId, + render::handle_t outputHiZTextureId ) const { T_PROFILER_SCOPE(L"HiZPass::setup"); @@ -60,16 +61,16 @@ render::handle_t HiZPass::setup( const int32_t viewHeight = (int32_t)viewSize.y; const int32_t mipCount = log2(std::max(viewWidth, viewHeight)) + 1; - render::RenderGraphTextureDesc rgtd; - rgtd.width = viewWidth >> 1; - rgtd.height = viewHeight >> 1; - rgtd.mipCount = mipCount - 1; - rgtd.format = render::TfR32F; - auto hizTextureId = renderGraph.addTransientTexture(L"HiZ", rgtd); + //render::RenderGraphTextureDesc rgtd; + //rgtd.width = viewWidth >> 1; + //rgtd.height = viewHeight >> 1; + //rgtd.mipCount = mipCount - 1; + //rgtd.format = render::TfR32F; + //auto hizTextureId = renderGraph.addTransientTexture(L"HiZ", rgtd); Ref< render::RenderPass > rp = new render::RenderPass(L"HiZ"); rp->addInput(gbufferTargetSetId); - rp->setOutput(hizTextureId); + rp->setOutput(outputHiZTextureId); for (int32_t i = 0; i < mipCount - 2; ++i) { @@ -92,14 +93,14 @@ render::handle_t HiZPass::setup( if (i == 0) { const auto inputTexture = renderGraph.getTargetSet(gbufferTargetSetId)->getColorTexture(0); - const auto outputTexture = renderGraph.getTexture(hizTextureId); + const auto outputTexture = renderGraph.getTexture(outputHiZTextureId); renderBlock->programParams->setImageViewParameter(s_handleHiZInput, inputTexture, 0); renderBlock->programParams->setImageViewParameter(s_handleHiZOutput, outputTexture, 0); } else { - const auto inoutTexture = renderGraph.getTexture(hizTextureId); + const auto inoutTexture = renderGraph.getTexture(outputHiZTextureId); renderBlock->programParams->setImageViewParameter(s_handleHiZInput, inoutTexture, i - 1); renderBlock->programParams->setImageViewParameter(s_handleHiZOutput, inoutTexture, i); @@ -116,7 +117,7 @@ render::handle_t HiZPass::setup( renderGraph.addPass(rp); - return hizTextureId; + //return hizTextureId; } } diff --git a/code/World/Shared/Passes/HiZPass.h b/code/World/Shared/Passes/HiZPass.h index c23936411d..774b80ead3 100644 --- a/code/World/Shared/Passes/HiZPass.h +++ b/code/World/Shared/Passes/HiZPass.h @@ -1,6 +1,6 @@ /* * TRAKTOR - * Copyright (c) 2023 Anders Pistol. + * Copyright (c) 2023-2024 Anders Pistol. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -42,10 +42,11 @@ class HiZPass : public Object public: bool create(resource::IResourceManager* resourceManager); - render::handle_t setup( + void setup( const WorldRenderView& worldRenderView, render::RenderGraph& renderGraph, - render::handle_t gbufferTargetSetId + render::handle_t gbufferTargetSetId, + render::handle_t outputHiZTextureId ) const; private: diff --git a/code/World/WorldHandles.cpp b/code/World/WorldHandles.cpp index 2c06b31ecf..cb1eece320 100644 --- a/code/World/WorldHandles.cpp +++ b/code/World/WorldHandles.cpp @@ -69,6 +69,7 @@ const render::Handle s_handleGBufferNormalMap(L"World_GBufferNormalMap"); const render::Handle s_handleDBufferColorMap(L"World_DBufferColorMap"); const render::Handle s_handleDBufferMiscMap(L"World_DBufferMiscMap"); const render::Handle s_handleDBufferNormalMap(L"World_DBufferNormalMap"); +const render::Handle s_handleHiZTexture(L"World_HiZTexture"); // Irradiance grid. const render::Handle s_handleIrradianceGridBoundsMax(L"World_IrradianceGridBoundsMax"); diff --git a/code/World/WorldHandles.h b/code/World/WorldHandles.h index e6f5923af5..5d4e17846d 100644 --- a/code/World/WorldHandles.h +++ b/code/World/WorldHandles.h @@ -33,91 +33,92 @@ extern const render::Handle T_DLLCLASS s_techniqueVelocityWrite; extern const render::Handle T_DLLCLASS s_techniqueShadow; // Permutations -extern const render::Handle s_handleIrradianceEnable; -extern const render::Handle s_handleIrradianceSingle; -extern const render::Handle s_handleVolumetricFogEnable; +extern const render::Handle T_DLLCLASS s_handleIrradianceEnable; +extern const render::Handle T_DLLCLASS s_handleIrradianceSingle; +extern const render::Handle T_DLLCLASS s_handleVolumetricFogEnable; // Shader parameters. -extern const render::Handle s_handleIrradianceMap; -extern const render::Handle s_handleDecalParams; -extern const render::Handle s_handleExposure; -extern const render::Handle s_handleFxRotate; -extern const render::Handle s_handleExtent; -extern const render::Handle s_handleFogColor; -extern const render::Handle s_handleFogDistanceAndDensity; -extern const render::Handle s_handleGamma; -extern const render::Handle s_handleGammaInverse; -extern const render::Handle s_handleLastWorld; -extern const render::Handle s_handleLastWorldView; -extern const render::Handle s_handleLightDiffuseMap; -extern const render::Handle s_handleLightIndexSBuffer; -extern const render::Handle s_handleLightMap; -extern const render::Handle s_handleLightSBuffer; -extern const render::Handle s_handleLightSpecularMap; -extern const render::Handle s_handleMagicCoeffs; -extern const render::Handle s_handleOcclusionMap; -extern const render::Handle s_handleContactShadowsMap; -extern const render::Handle s_handleProjection; -extern const render::Handle s_handleReflectionMap; -extern const render::Handle s_handleScreenMap; -extern const render::Handle s_handleShadowMapAtlas; -extern const render::Handle s_handleShadowBias; -extern const render::Handle s_handleTileSBuffer; -extern const render::Handle s_handleTime; -extern const render::Handle s_handleViewDistance; -extern const render::Handle s_handleView; -extern const render::Handle s_handleViewInverse; -extern const render::Handle s_handleWorld; -extern const render::Handle s_handleWorldView; -extern const render::Handle s_handleWorldViewInv; -extern const render::Handle s_handleJitter; -extern const render::Handle s_handleSlicePositions; -extern const render::Handle s_handleGBufferColorMap; -extern const render::Handle s_handleGBufferDepthMap; -extern const render::Handle s_handleGBufferMiscMap; -extern const render::Handle s_handleGBufferNormalMap; -extern const render::Handle s_handleDBufferColorMap; -extern const render::Handle s_handleDBufferMiscMap; -extern const render::Handle s_handleDBufferNormalMap; +extern const render::Handle T_DLLCLASS s_handleIrradianceMap; +extern const render::Handle T_DLLCLASS s_handleDecalParams; +extern const render::Handle T_DLLCLASS s_handleExposure; +extern const render::Handle T_DLLCLASS s_handleFxRotate; +extern const render::Handle T_DLLCLASS s_handleExtent; +extern const render::Handle T_DLLCLASS s_handleFogColor; +extern const render::Handle T_DLLCLASS s_handleFogDistanceAndDensity; +extern const render::Handle T_DLLCLASS s_handleGamma; +extern const render::Handle T_DLLCLASS s_handleGammaInverse; +extern const render::Handle T_DLLCLASS s_handleLastWorld; +extern const render::Handle T_DLLCLASS s_handleLastWorldView; +extern const render::Handle T_DLLCLASS s_handleLightDiffuseMap; +extern const render::Handle T_DLLCLASS s_handleLightIndexSBuffer; +extern const render::Handle T_DLLCLASS s_handleLightMap; +extern const render::Handle T_DLLCLASS s_handleLightSBuffer; +extern const render::Handle T_DLLCLASS s_handleLightSpecularMap; +extern const render::Handle T_DLLCLASS s_handleMagicCoeffs; +extern const render::Handle T_DLLCLASS s_handleOcclusionMap; +extern const render::Handle T_DLLCLASS s_handleContactShadowsMap; +extern const render::Handle T_DLLCLASS s_handleProjection; +extern const render::Handle T_DLLCLASS s_handleReflectionMap; +extern const render::Handle T_DLLCLASS s_handleScreenMap; +extern const render::Handle T_DLLCLASS s_handleShadowMapAtlas; +extern const render::Handle T_DLLCLASS s_handleShadowBias; +extern const render::Handle T_DLLCLASS s_handleTileSBuffer; +extern const render::Handle T_DLLCLASS s_handleTime; +extern const render::Handle T_DLLCLASS s_handleViewDistance; +extern const render::Handle T_DLLCLASS s_handleView; +extern const render::Handle T_DLLCLASS s_handleViewInverse; +extern const render::Handle T_DLLCLASS s_handleWorld; +extern const render::Handle T_DLLCLASS s_handleWorldView; +extern const render::Handle T_DLLCLASS s_handleWorldViewInv; +extern const render::Handle T_DLLCLASS s_handleJitter; +extern const render::Handle T_DLLCLASS s_handleSlicePositions; +extern const render::Handle T_DLLCLASS s_handleGBufferColorMap; +extern const render::Handle T_DLLCLASS s_handleGBufferDepthMap; +extern const render::Handle T_DLLCLASS s_handleGBufferMiscMap; +extern const render::Handle T_DLLCLASS s_handleGBufferNormalMap; +extern const render::Handle T_DLLCLASS s_handleDBufferColorMap; +extern const render::Handle T_DLLCLASS s_handleDBufferMiscMap; +extern const render::Handle T_DLLCLASS s_handleDBufferNormalMap; +extern const render::Handle T_DLLCLASS s_handleHiZTexture; // Irradiance grid. -extern const render::Handle s_handleIrradianceGridBoundsMax; -extern const render::Handle s_handleIrradianceGridBoundsMin; -extern const render::Handle s_handleIrradianceGridSBuffer; -extern const render::Handle s_handleIrradianceGridSize; +extern const render::Handle T_DLLCLASS s_handleIrradianceGridBoundsMax; +extern const render::Handle T_DLLCLASS s_handleIrradianceGridBoundsMin; +extern const render::Handle T_DLLCLASS s_handleIrradianceGridSBuffer; +extern const render::Handle T_DLLCLASS s_handleIrradianceGridSize; // Reflection probe. -extern const render::Handle s_handleProbeDiffuse; -extern const render::Handle s_handleProbeIntensity; -extern const render::Handle s_handleProbeTexture; -extern const render::Handle s_handleProbeTextureMips; -extern const render::Handle s_handleProbeVolumeCenter; -extern const render::Handle s_handleProbeVolumeExtent; -extern const render::Handle s_handleProbeRoughness; -extern const render::Handle s_handleProbeFilterCorners; +extern const render::Handle T_DLLCLASS s_handleProbeDiffuse; +extern const render::Handle T_DLLCLASS s_handleProbeIntensity; +extern const render::Handle T_DLLCLASS s_handleProbeTexture; +extern const render::Handle T_DLLCLASS s_handleProbeTextureMips; +extern const render::Handle T_DLLCLASS s_handleProbeVolumeCenter; +extern const render::Handle T_DLLCLASS s_handleProbeVolumeExtent; +extern const render::Handle T_DLLCLASS s_handleProbeRoughness; +extern const render::Handle T_DLLCLASS s_handleProbeFilterCorners; // Volumetric fog. -extern const render::Handle s_handleFogVolume; -extern const render::Handle s_handleFogVolumeTexture; -extern const render::Handle s_handleFogVolumeRange; -extern const render::Handle s_handleFogVolumeSliceCount; -extern const render::Handle s_handleFogVolumeSliceCurrent; -extern const render::Handle s_handleFogVolumeMediumColor; -extern const render::Handle s_handleFogVolumeMediumDensity; +extern const render::Handle T_DLLCLASS s_handleFogVolume; +extern const render::Handle T_DLLCLASS s_handleFogVolumeTexture; +extern const render::Handle T_DLLCLASS s_handleFogVolumeRange; +extern const render::Handle T_DLLCLASS s_handleFogVolumeSliceCount; +extern const render::Handle T_DLLCLASS s_handleFogVolumeSliceCurrent; +extern const render::Handle T_DLLCLASS s_handleFogVolumeMediumColor; +extern const render::Handle T_DLLCLASS s_handleFogVolumeMediumDensity; // Contact shadows. -extern const render::Handle s_handleContactLightDirection; +extern const render::Handle T_DLLCLASS s_handleContactLightDirection; // ImageGraph inputs. -extern const render::Handle s_handleInputColor; -extern const render::Handle s_handleInputColorLast; -extern const render::Handle s_handleInputDepth; -extern const render::Handle s_handleInputNormal; -extern const render::Handle s_handleInputVelocity; -extern const render::Handle s_handleInputVelocityLast; -extern const render::Handle s_handleInputColorGrading; +extern const render::Handle T_DLLCLASS s_handleInputColor; +extern const render::Handle T_DLLCLASS s_handleInputColorLast; +extern const render::Handle T_DLLCLASS s_handleInputDepth; +extern const render::Handle T_DLLCLASS s_handleInputNormal; +extern const render::Handle T_DLLCLASS s_handleInputVelocity; +extern const render::Handle T_DLLCLASS s_handleInputVelocityLast; +extern const render::Handle T_DLLCLASS s_handleInputColorGrading; // Persistent targets. -extern const render::Handle s_handleTargetShadowMap[]; +extern const render::Handle T_DLLCLASS s_handleTargetShadowMap[]; } diff --git a/data/Source/System/Mesh/Shaders/Instance/Cull/Cull.xdi b/data/Source/System/Mesh/Shaders/Instance/Cull/Cull.xdi index a21073625b..cbfe69b036 100644 --- a/data/Source/System/Mesh/Shaders/Instance/Cull/Cull.xdi +++ b/data/Source/System/Mesh/Shaders/Instance/Cull/Cull.xdi @@ -5,8 +5,8 @@ {4BAA3A0D-D779-C141-B519-197EEA8640D6} - 19 - 103 + -336 + 123 Global @@ -14,8 +14,8 @@ {B63DBBD3-72C0-C645-8A24-4893BBF22E30} - 248 - 112 + -107 + 132 x @@ -23,8 +23,8 @@ {A4DC3ED3-6068-054F-9623-163C10D79FD1} - 440 - 36 + 85 + 56 rotation @@ -35,8 +35,8 @@ {7E76A642-57F5-1F4D-90C1-E578206B7057} - 109 - 20 + -246 + 40 InstanceWorld @@ -54,8 +54,8 @@ {FB4B169C-944B-E049-927D-F60F28080923} - 733 - 120 + 378 + 140 w @@ -63,8 +63,8 @@ {91EC5EF9-EBF6-8546-A91A-4550CAEB6CDE} - 733 - 50 + 378 + 70 xyz @@ -72,10 +72,10 @@ {91A1C374-33C8-6F4C-B0E5-0D7C530C3452} - 318 - 394 + 383 + 388 - InstanceMesh_View + World_View Matrix Frame @@ -83,7 +83,7 @@ {012016E9-7DB1-D849-AF8D-3641CE8D9C6C} - 269 + 271 306 InstanceMesh_BoundingBoxMin @@ -95,7 +95,7 @@ 271 - 346 + 347 InstanceMesh_BoundingBoxMax Vector @@ -105,8 +105,8 @@ {A12CD3AB-ABC5-BE47-882A-206186C7504A} - 723 - 339 + 722 + 340 Frustum @@ -186,8 +186,8 @@ $Output = (inside0 && inside1) ? 1.0f : 0.0f; {861D7610-0664-6C4B-A21F-0D64852C2041} - 1209 - 249 + 1572 + 363 WriteOut Default @@ -224,8 +224,8 @@ $Buffer[index].visible = $Input; {32AF829B-BE26-9242-99ED-1189D698205D} - 923 - 257 + 1286 + 371 InstanceMesh_Visibility @@ -239,22 +239,155 @@ $Buffer[index].visible = $Input; {91A8C6C3-38AF-0E49-9137-BEB73CB41DD4} - 296 - 450 + 223 + 548 InstanceMesh_CullFrustum Vector Frame 12 - - {132DCAD9-5472-4B66-A84F-D5C4227C923A} + + {2524AA09-8565-774A-B5BA-F09DAE6026BD} + + + 1212 + 579 + + InstanceMesh_HiZ + + + {6FAE432D-36E8-D046-96BA-65165BB9DCCC} + + + 435 + 918 + + World_HiZTexture + Texture2D + Frame + + + {B3BCC5CA-6F48-3A42-BB0C-3DE19CDFE7DF} + + + 721 + 756 + + HiZ + + + 1 + 1 + 1 + + + {45D674A1-6AC4-6B4E-B7CB-DC7F9C2EC215} + + + + {38213B60-FC63-A541-BCC2-95E414C2276D} + Bbmn + + + {484ABC89-3116-A645-8DEB-1DD2AD5B66E9} + Bbmx + + + {1384E810-955D-844D-B29B-91D1A448D1AC} + Translation + + + {38C7084D-4F8D-D749-A614-108D37B2EF5D} + View + + + {2D477B25-59BB-AB41-AD8A-B373447C47C4} + Projection + + + {B53AF0D1-D6CC-9A40-9334-2C4CD642EE5B} + HiZTexture + + + {6D0649E3-ED26-0646-A195-028038D29BD8} + HiZState + + + + + {5D1C8949-65AE-2046-A34D-469B22E09B20} + Output + Scalar + + + + + + {E6AAA1C9-EEBE-3143-A4AB-7A05E14E17AB} + + + 435 + 875 + + World_Projection + Matrix + Frame + + + {7B83C271-F045-4343-9666-B5DC8E2A479D} + + + 453 + 961 + + FtPoint + FtPoint + FtPoint + AdWrap + AdWrap + AdWrap + CfNone + 0 + false + false + + + {B2B588B8-DCC2-004F-AE5B-672497EEBFAB} - 1038 - 370 + 1011 + 651 - 1 @@ -383,11 +516,121 @@ $Buffer[index].visible = $Input; {C2E0B588-DBCB-F04B-9978-8C1B6593F31A} + + + {92AA3735-BB4C-4541-81DA-AC500930B2E6} + + + + + + {9D9FA2FC-9298-4A6F-88A9-A055F8A91F52} + {89D6EAF6-DAAD-C647-B640-7F86B233A509} + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {38213B60-FC63-A541-BCC2-95E414C2276D} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {484ABC89-3116-A645-8DEB-1DD2AD5B66E9} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {38C7084D-4F8D-D749-A614-108D37B2EF5D} + + + + + + {ADB4FC1D-3726-4CC5-B4D5-1E2468274325} + + + + {1384E810-955D-844D-B29B-91D1A448D1AC} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {2D477B25-59BB-AB41-AD8A-B373447C47C4} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {B53AF0D1-D6CC-9A40-9334-2C4CD642EE5B} + + + + + + {82C966B2-7B19-48B2-8FE0-B85FF4E3C504} + + + + {6D0649E3-ED26-0646-A195-028038D29BD8} + + + + + + {5D1C8949-65AE-2046-A34D-469B22E09B20} + + + + {D2D716D6-C4A1-471F-894A-D718515F6281} + + + + + + {C2E0B588-DBCB-F04B-9978-8C1B6593F31A} + + + + {69997292-C813-490C-910C-620B9AD3A2BB} + + + + + + {9E839249-E9B9-4736-8BDD-A95A1C892B42} + + + + {A1DDB166-9422-45A3-AE93-6702275DAD1C} + + diff --git a/data/Source/System/Shaders/Modules/Frustum.xdi b/data/Source/System/Shaders/Modules/Frustum.xdi index 64222753d0..51026471f4 100644 --- a/data/Source/System/Shaders/Modules/Frustum.xdi +++ b/data/Source/System/Shaders/Modules/Frustum.xdi @@ -23,6 +23,31 @@ bool FrustumInside(in Frustum frustum, in vec3 center, in float radius) return true; } +// Sphere + +bool ProjectSphere(in vec3 center, in float radius, float znear, float P00, float P11, out vec4 aabb) +{ + if (center.z < radius + znear) + return false; + + vec3 cr = center * radius; + float czr2 = center.z * center.z - radius * radius; + + float vx = sqrt(center.x * center.x + czr2); + float minx = (vx * center.x - cr.z) / (vx * center.z + cr.x); + float maxx = (vx * center.x + cr.z) / (vx * center.z - cr.x); + + float vy = sqrt(center.y * center.y + czr2); + float miny = (vy * center.y - cr.z) / (vy * center.z + cr.y); + float maxy = (vy * center.y + cr.z) / (vy * center.z - cr.y); + + aabb = vec4(minx * P00, miny * P11, maxx * P00, maxy * P11); + aabb = aabb.xwzy * vec4(0.5f, -0.5f, 0.5f, -0.5f) + vec4(0.5f); // clip space -> uv space + + return true; +} + + ]]>