From 4365ca8ba08dfb5222eca361a8562aa99d9281ac Mon Sep 17 00:00:00 2001 From: turanszkij Date: Sun, 26 Feb 2017 16:11:10 +0100 Subject: [PATCH] voxelizer updated + voxelizer debug + general updates --- WickedEngine/Renderable3DComponent.cpp | 1 + WickedEngine/RendererWindow.cpp | 10 ++ WickedEngine/RendererWindow.h | 1 + WickedEngine/WickedEngine_SHADERS.vcxproj | 12 +++ .../WickedEngine_SHADERS.vcxproj.filters | 6 ++ WickedEngine/objectHF.hlsli | 5 +- WickedEngine/voxelPS.hlsl | 4 + WickedEngine/voxelRadianceCS.hlsl | 20 ++-- WickedEngine/voxelVS.hlsl | 52 +++++++++ WickedEngine/wiEnums.h | 8 +- WickedEngine/wiLoader.cpp | 18 ++-- WickedEngine/wiRenderer.cpp | 102 +++++++++++++----- WickedEngine/wiRenderer.h | 5 +- 13 files changed, 193 insertions(+), 51 deletions(-) create mode 100644 WickedEngine/voxelPS.hlsl create mode 100644 WickedEngine/voxelVS.hlsl diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index 4373b696f..1cb44d5cf 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -405,6 +405,7 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende wiRenderer::GetDevice()->EventBegin("Debug Geometry", threadID); wiRenderer::DrawDebugGridHelper(wiRenderer::getCamera(), threadID); + wiRenderer::DrawDebugVoxels(wiRenderer::getCamera(), threadID); wiRenderer::DrawDebugEnvProbes(wiRenderer::getCamera(), threadID); wiRenderer::DrawDebugBoneLines(wiRenderer::getCamera(), threadID); wiRenderer::DrawDebugLines(wiRenderer::getCamera(), threadID); diff --git a/WickedEngine/RendererWindow.cpp b/WickedEngine/RendererWindow.cpp index eb4fb018a..43710e356 100644 --- a/WickedEngine/RendererWindow.cpp +++ b/WickedEngine/RendererWindow.cpp @@ -49,6 +49,15 @@ RendererWindow::RendererWindow(Renderable3DComponent* component) voxelRadianceCheckBox->SetCheck(wiRenderer::GetVoxelRadianceEnabled()); rendererWindow->AddWidget(voxelRadianceCheckBox); + voxelRadianceDebugCheckBox = new wiCheckBox("DEBUG: "); + voxelRadianceDebugCheckBox->SetTooltip("Toggle voxel radiance visualization."); + voxelRadianceDebugCheckBox->SetPos(XMFLOAT2(x + 100, y)); + voxelRadianceDebugCheckBox->OnClick([](wiEventArgs args) { + wiRenderer::SetToDrawVoxelHelper(args.bValue); + }); + voxelRadianceDebugCheckBox->SetCheck(wiRenderer::GetToDrawVoxelHelper()); + rendererWindow->AddWidget(voxelRadianceDebugCheckBox); + partitionBoxesCheckBox = new wiCheckBox("SPTree visualizer: "); partitionBoxesCheckBox->SetTooltip("Visualize the world space partitioning tree as boxes"); partitionBoxesCheckBox->SetPos(XMFLOAT2(x, y += step)); @@ -270,6 +279,7 @@ RendererWindow::~RendererWindow() SAFE_DELETE(vsyncCheckBox); SAFE_DELETE(occlusionCullingCheckBox); SAFE_DELETE(voxelRadianceCheckBox); + SAFE_DELETE(voxelRadianceDebugCheckBox); SAFE_DELETE(partitionBoxesCheckBox); SAFE_DELETE(boneLinesCheckBox); SAFE_DELETE(wireFrameCheckBox); diff --git a/WickedEngine/RendererWindow.h b/WickedEngine/RendererWindow.h index d849b43c3..7b7e106fe 100644 --- a/WickedEngine/RendererWindow.h +++ b/WickedEngine/RendererWindow.h @@ -20,6 +20,7 @@ public: wiCheckBox* vsyncCheckBox; wiCheckBox* occlusionCullingCheckBox; wiCheckBox* voxelRadianceCheckBox; + wiCheckBox* voxelRadianceDebugCheckBox; wiCheckBox* partitionBoxesCheckBox; wiCheckBox* boneLinesCheckBox; wiCheckBox* wireFrameCheckBox; diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj b/WickedEngine/WickedEngine_SHADERS.vcxproj index 6e032f310..7f5da8b2c 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj @@ -839,6 +839,12 @@ Pixel Pixel + + Pixel + Pixel + Pixel + Pixel + Compute 4.0 @@ -849,6 +855,12 @@ Compute 4.0 + + Vertex + Vertex + Vertex + Vertex + Vertex Vertex diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters index b0e8010ee..71741c3f2 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters @@ -513,6 +513,12 @@ CS + + VS + + + PS + diff --git a/WickedEngine/objectHF.hlsli b/WickedEngine/objectHF.hlsli index 934487255..7f60285c5 100644 --- a/WickedEngine/objectHF.hlsli +++ b/WickedEngine/objectHF.hlsli @@ -115,16 +115,13 @@ inline void VoxelRadiance(in float3 P, inout float ao) [branch] if (g_xWorld_VoxelRadianceScale > 0) { - float3 dim; - float mips; - texture_voxelradiance.GetDimensions(0, dim.x, dim.y, dim.z, mips); float3 diff = (P - floor(g_xCamera_CamPos)) * g_xWorld_VoxelRadianceScale; float3 uvw = diff * float3(0.5f, -0.5f, 0.5f) + 0.5f; float4 radiance = texture_voxelradiance.SampleLevel(sampler_linear_clamp, uvw, 0); diff = abs(diff); float blend = pow(saturate(max(diff.x, max(diff.y, diff.z))), 4); - ao *= lerp(radiance.a, 1, blend); + ao *= lerp(1 - radiance.a, 1, blend); } } diff --git a/WickedEngine/voxelPS.hlsl b/WickedEngine/voxelPS.hlsl new file mode 100644 index 000000000..a5b00844a --- /dev/null +++ b/WickedEngine/voxelPS.hlsl @@ -0,0 +1,4 @@ +float4 main(float4 pos : SV_POSITION, float4 col : TEXCOORD) : SV_TARGET +{ + return col; +} \ No newline at end of file diff --git a/WickedEngine/voxelRadianceCS.hlsl b/WickedEngine/voxelRadianceCS.hlsl index 32d1ce54b..1c895934b 100644 --- a/WickedEngine/voxelRadianceCS.hlsl +++ b/WickedEngine/voxelRadianceCS.hlsl @@ -12,18 +12,18 @@ void main( uint3 DTid : SV_DispatchThreadID, uint GroupIndex : SV_GroupIndex ) float4 current = input[DTid]; - //output[DTid] = 1 - current.aaaa; + output[DTid] = current; - accumulation[GroupIndex] = current; + //accumulation[GroupIndex] = current; - GroupMemoryBarrierWithGroupSync(); + //GroupMemoryBarrierWithGroupSync(); - float4 avg = 0; - for (uint i = 0; i < 4 * 4 * 4; ++i) - { - avg += accumulation[i]; - } - avg /= 4 * 4 * 4; + //float4 avg = 0; + //for (uint i = 0; i < 4 * 4 * 4; ++i) + //{ + // avg += accumulation[i]; + //} + //avg /= 4 * 4 * 4; - output[DTid] = 1 - avg.aaaa; + //output[DTid] = avg.rgba; } \ No newline at end of file diff --git a/WickedEngine/voxelVS.hlsl b/WickedEngine/voxelVS.hlsl new file mode 100644 index 000000000..2f9c81074 --- /dev/null +++ b/WickedEngine/voxelVS.hlsl @@ -0,0 +1,52 @@ +#include "globals.hlsli" +#include "cube.hlsli" + +inline uint to1D(uint3 coord, uint3 dim) +{ + return (coord.z * dim.x * dim.y) + (coord.y * dim.x) + coord.x; +} + +inline uint3 to3D(uint idx, uint3 dim) +{ + const uint z = idx / (dim.x * dim.y); + idx -= (z * dim.x * dim.y); + const uint y = idx / dim.x; + const uint x = idx % dim.x; + return uint3(x, y, z); +} + +struct VSOut +{ + float4 pos : SV_POSITION; + float4 col : TEXCOORD; +}; + +VSOut main( uint vertexID : SV_VERTEXID, uint instanceID : SV_INSTANCEID ) +{ + VSOut o; + + uint3 dim; + texture_voxelradiance.GetDimensions(dim.x, dim.y, dim.z); + + uint3 coord = to3D(instanceID, dim); + o.col = texture_voxelradiance[coord]; + + + [branch] + if (o.col.a > 0) + { + float3 pos = (float3)coord / (float3)dim * 2 - 1; + pos.y = -pos.y; + pos.xyz *= dim; + pos += CUBE[vertexID].xyz; + pos *= dim * g_xWorld_VoxelRadianceScale; + + o.pos = mul(float4(pos, 1), g_xTransform); + } + else + { + o.pos = 0; + } + + return o; +} \ No newline at end of file diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h index 9de00fd00..ccae7804e 100644 --- a/WickedEngine/wiEnums.h +++ b/WickedEngine/wiEnums.h @@ -43,7 +43,8 @@ enum SHADERTYPE SHADERTYPE_ALPHATESTONLY, SHADERTYPE_ENVMAPCAPTURE, SHADERTYPE_SHADOW, - SHADERTYPE_SHADOWCUBE, + SHADERTYPE_SHADOWCUBE, + SHADERTYPE_VOXELIZE, SHADERTYPE_COUNT }; @@ -123,6 +124,7 @@ enum VSTYPES VSTYPE_ENVMAP_SKY, VSTYPE_SPHERE, VSTYPE_CUBE, + VSTYPE_VOXEL, VSTYPE_LAST }; // pixel shaders @@ -186,6 +188,7 @@ enum PSTYPES PSTYPE_ENVMAP_SKY, PSTYPE_CUBEMAP, PSTYPE_CAPTUREIMPOSTOR, + PSTYPE_VOXEL, PSTYPE_LAST }; // geometry shaders @@ -243,7 +246,8 @@ enum RSTYPES RSTYPE_WIRE_DOUBLESIDED_SMOOTH, RSTYPE_SHADOW, RSTYPE_SHADOW_DOUBLESIDED, - RSTYPE_OCCLUDEE, + RSTYPE_OCCLUDEE, + RSTYPE_VOXELIZE, RSTYPE_LAST }; // depth-stencil states diff --git a/WickedEngine/wiLoader.cpp b/WickedEngine/wiLoader.cpp index 7a288187a..1718104d5 100644 --- a/WickedEngine/wiLoader.cpp +++ b/WickedEngine/wiLoader.cpp @@ -4032,22 +4032,20 @@ void Light::UpdateLight() c = XMVector3Unproject(XMVectorSet((float)wiRenderer::GetDevice()->GetScreenWidth() * 0.5f, (float)wiRenderer::GetDevice()->GetScreenHeight() * 0.5f, 1, 1), 0, 0, (float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight(), 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); d = XMVector3Unproject(XMVectorSet((float)wiRenderer::GetDevice()->GetScreenWidth() * 0.5f, (float)wiRenderer::GetDevice()->GetScreenHeight() * 0.5f, 0, 1), 0, 0, (float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight(), 0.1f, 1.0f, wiRenderer::getCamera()->GetProjection(), wiRenderer::getCamera()->GetView(), XMMatrixIdentity()); - if (!shadowCam_dirLight.empty()) { - + if (!shadowCam_dirLight.empty()) + { + // Avoid shadowmap texel swimming by aligning them to a discrete grid: float f = shadowCam_dirLight[0].size / (float)wiRenderer::SHADOWRES_2D; - e = XMVectorFloor(XMVectorLerp(d, c, lerp) / f)*f; + e = XMVectorFloor(XMVectorLerp(d, c, lerp) * f)/f; f = shadowCam_dirLight[1].size / (float)wiRenderer::SHADOWRES_2D; - e1 = XMVectorFloor(XMVectorLerp(d, c, lerp1) / f)*f; + e1 = XMVectorFloor(XMVectorLerp(d, c, lerp1) * f)/f; f = shadowCam_dirLight[2].size / (float)wiRenderer::SHADOWRES_2D; - e2 = XMVectorFloor(XMVectorLerp(d, c, lerp2) / f)*f; + e2 = XMVectorFloor(XMVectorLerp(d, c, lerp2) * f)/f; XMMATRIX rrr = XMMatrixRotationQuaternion(XMLoadFloat4(&rotation)); shadowCam_dirLight[0].Update(rrr*XMMatrixTranslationFromVector(e)); - if (shadowCam_dirLight.size() > 1) { - shadowCam_dirLight[1].Update(rrr*XMMatrixTranslationFromVector(e1)); - if (shadowCam_dirLight.size() > 2) - shadowCam_dirLight[2].Update(rrr*XMMatrixTranslationFromVector(e2)); - } + shadowCam_dirLight[1].Update(rrr*XMMatrixTranslationFromVector(e1)); + shadowCam_dirLight[2].Update(rrr*XMMatrixTranslationFromVector(e2)); } } diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index b1486ede2..a6121196e 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -49,7 +49,7 @@ Texture *wiRenderer::textures[TEXTYPE_LAST]; int wiRenderer::SHADOWRES_2D = 1024, wiRenderer::SHADOWRES_CUBE = 256, wiRenderer::SHADOWCOUNT_2D = 5 + 3 + 3, wiRenderer::SHADOWCOUNT_CUBE = 5, wiRenderer::SOFTSHADOWQUALITY_2D = 2; bool wiRenderer::HAIRPARTICLEENABLED=true,wiRenderer::EMITTERSENABLED=true; bool wiRenderer::wireRender = false, wiRenderer::debugSpheres = false, wiRenderer::debugBoneLines = false, wiRenderer::debugPartitionTree = false -, wiRenderer::debugEnvProbes = false, wiRenderer::gridHelper = false, wiRenderer::requestReflectionRendering = false; +, wiRenderer::debugEnvProbes = false, wiRenderer::gridHelper = false, wiRenderer::voxelHelper = false, wiRenderer::requestReflectionRendering = false; Texture2D* wiRenderer::enviroMap,*wiRenderer::colorGrading; float wiRenderer::GameSpeed=1,wiRenderer::overrideGameSpeed=1; @@ -700,6 +700,8 @@ void wiRenderer::LoadShaders() vertexShaders[VSTYPE_SHADOW] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_SHADOWCUBEMAPRENDER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; vertexShaders[VSTYPE_WATER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "waterVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + vertexShaders[VSTYPE_VOXEL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader; + pixelShaders[PSTYPE_OBJECT_DEFERRED] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_deferred.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_OBJECT_DEFERRED_NORMALMAP] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_deferred_normalmap.cso", wiResourceManager::PIXELSHADER)); @@ -759,6 +761,8 @@ void wiRenderer::LoadShaders() pixelShaders[PSTYPE_SHADOW] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "shadowPS.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_SHADOWCUBEMAPRENDER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowPS.cso", wiResourceManager::PIXELSHADER)); pixelShaders[PSTYPE_TRAIL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "trailPS.cso", wiResourceManager::PIXELSHADER)); + pixelShaders[PSTYPE_VOXEL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelPS.cso", wiResourceManager::PIXELSHADER)); + geometryShaders[GSTYPE_ENVMAP] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "envMapGS.cso", wiResourceManager::GEOMETRYSHADER)); geometryShaders[GSTYPE_ENVMAP_SKY] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "envMap_skyGS.cso", wiResourceManager::GEOMETRYSHADER)); @@ -952,7 +956,7 @@ void wiRenderer::SetUpStates() rs.DepthBias=0; rs.DepthBiasClamp=0; rs.SlopeScaledDepthBias=0; - rs.DepthClipEnable=false; + rs.DepthClipEnable=true; rs.ScissorEnable=false; rs.MultisampleEnable=false; rs.AntialiasedLineEnable=false; @@ -964,7 +968,7 @@ void wiRenderer::SetUpStates() rs.DepthBias = 0; rs.DepthBiasClamp = 0; rs.SlopeScaledDepthBias=0; - rs.DepthClipEnable=false; + rs.DepthClipEnable=true; rs.ScissorEnable=false; rs.MultisampleEnable=false; rs.AntialiasedLineEnable = false; @@ -978,7 +982,7 @@ void wiRenderer::SetUpStates() rs.DepthBias=0; rs.DepthBiasClamp=0; rs.SlopeScaledDepthBias=0; - rs.DepthClipEnable=false; + rs.DepthClipEnable=true; rs.ScissorEnable=false; rs.MultisampleEnable=false; rs.AntialiasedLineEnable=false; @@ -987,8 +991,8 @@ void wiRenderer::SetUpStates() rs.FillMode = FILL_SOLID; rs.CullMode = CULL_BACK; rs.FrontCounterClockwise = true; - rs.DepthBias = -100; - rs.DepthBiasClamp = 100; + rs.DepthBias = 0; + rs.DepthBiasClamp = 0; rs.SlopeScaledDepthBias = 0; rs.DepthClipEnable = true; rs.ScissorEnable = false; @@ -996,6 +1000,18 @@ void wiRenderer::SetUpStates() rs.AntialiasedLineEnable = false; GetDevice()->CreateRasterizerState(&rs, rasterizers[RSTYPE_OCCLUDEE]); + rs.FillMode = FILL_SOLID; + rs.CullMode = CULL_NONE; + rs.FrontCounterClockwise = true; + rs.DepthBias = 0; + rs.DepthBiasClamp = 0; + rs.SlopeScaledDepthBias = 0; + rs.DepthClipEnable = true; + rs.ScissorEnable = false; + rs.MultisampleEnable = false; + rs.AntialiasedLineEnable = false; + GetDevice()->CreateRasterizerState(&rs, rasterizers[RSTYPE_VOXELIZE]); + for (int i = 0; i < DSSTYPE_LAST; ++i) { depthStencils[i] = new DepthStencilState; @@ -2245,9 +2261,6 @@ void wiRenderer::DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID) GetDevice()->BindPS(pixelShaders[PSTYPE_LINE],threadID); GetDevice()->BindVS(vertexShaders[VSTYPE_LINE],threadID); - - GetDevice()->BindVertexBuffer(&Cube::vertexBuffer,0, sizeof(XMFLOAT4) + sizeof(XMFLOAT4),threadID); - GetDevice()->BindIndexBuffer(&Cube::indexBuffer,threadID); static float col = 0.7f; static int gridVertexCount = 0; @@ -2301,6 +2314,40 @@ void wiRenderer::DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID) GetDevice()->Draw(gridVertexCount, threadID); + GetDevice()->EventEnd(threadID); + } +} +void wiRenderer::DrawDebugVoxels(Camera* camera, GRAPHICSTHREAD threadID) +{ + if (voxelHelper && textures[TEXTYPE_3D_VOXELRADIANCE] != nullptr) { + GetDevice()->EventBegin("Debug Voxels", threadID); + + GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); + + GetDevice()->BindRasterizerState(rasterizers[RSTYPE_FRONT], threadID); + GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], STENCILREF_EMPTY, threadID); + GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID); + + + GetDevice()->BindPS(pixelShaders[PSTYPE_VOXEL], threadID); + GetDevice()->BindVS(vertexShaders[VSTYPE_VOXEL], threadID); + + GetDevice()->BindVertexLayout(nullptr, threadID); + GetDevice()->BindVertexBuffer(nullptr, 0, 0, threadID); + GetDevice()->BindIndexBuffer(nullptr, threadID); + + + + MiscCB sb; + sb.mTransform = XMMatrixTranspose(XMMatrixTranslationFromVector(XMVectorFloor(XMLoadFloat3(&camera->translation))) * camera->GetViewProjection()); + sb.mColor = XMFLOAT4(1, 1, 1, 1); + + GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &sb, threadID); + + Texture3DDesc desc = ((Texture3D*)textures[TEXTYPE_3D_VOXELRADIANCE])->GetDesc(); + GetDevice()->DrawInstanced(36, desc.Width * desc.Height * desc.Depth, threadID); // cube + + GetDevice()->EventEnd(threadID); } } @@ -3324,7 +3371,7 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle targetStencilRef = mesh->stencilRef; - if (mesh->hasImpostor()) + if (mesh->hasImpostor() && shaderType != SHADERTYPE_VOXELIZE) { int k = 0; for (const Object* instance : visibleInstances) @@ -3414,30 +3461,36 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle } } - if (shaderType == SHADERTYPE_SHADOW || shaderType == SHADERTYPE_SHADOWCUBE) + if (shaderType == SHADERTYPE_VOXELIZE) { - if (!mesh->doubleSided) - { - GetDevice()->BindRasterizerState(rasterizers[RSTYPE_SHADOW], threadID); - } - else - { - GetDevice()->BindRasterizerState(rasterizers[RSTYPE_SHADOW_DOUBLESIDED], threadID); - } + GetDevice()->BindRasterizerState(rasterizers[RSTYPE_VOXELIZE], threadID); } else { - if (!mesh->doubleSided) + if (shaderType == SHADERTYPE_SHADOW || shaderType == SHADERTYPE_SHADOWCUBE) { - GetDevice()->BindRasterizerState(wireRender ? rasterizers[RSTYPE_WIRE] : rasterizers[RSTYPE_FRONT], threadID); + if (!mesh->doubleSided) + { + GetDevice()->BindRasterizerState(rasterizers[RSTYPE_SHADOW], threadID); + } + else + { + GetDevice()->BindRasterizerState(rasterizers[RSTYPE_SHADOW_DOUBLESIDED], threadID); + } } else { - GetDevice()->BindRasterizerState(wireRender ? rasterizers[RSTYPE_WIRE] : rasterizers[RSTYPE_DOUBLESIDED], threadID); + if (!mesh->doubleSided) + { + GetDevice()->BindRasterizerState(wireRender ? rasterizers[RSTYPE_WIRE] : rasterizers[RSTYPE_FRONT], threadID); + } + else + { + GetDevice()->BindRasterizerState(wireRender ? rasterizers[RSTYPE_WIRE] : rasterizers[RSTYPE_DOUBLESIDED], threadID); + } } } - int k = 0; for (const Object* instance : visibleInstances) { @@ -3921,7 +3974,7 @@ void wiRenderer::VoxelizeScene(GRAPHICSTHREAD threadID) UpdateCameraCB(cam, threadID); - RenderMeshes(cam->translation, culledRenderer, SHADERTYPE_TEXTURE, RENDERTYPE_OPAQUE, threadID); + RenderMeshes(cam->translation, culledRenderer, SHADERTYPE_VOXELIZE, RENDERTYPE_OPAQUE, threadID); } @@ -4177,6 +4230,7 @@ void wiRenderer::ComputeVoxelRadiance(GRAPHICSTHREAD threadID) GetDevice()->UnBindResources(0, 1, threadID); GetDevice()->UnBindUnorderedAccessResources(0, 1, threadID); + GetDevice()->BindResourceVS(textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELRADIANCE, threadID); GetDevice()->BindResourcePS(textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELRADIANCE, threadID); wiProfiler::GetInstance().EndRange(threadID); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index a05434f28..ff63b02ad 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -270,7 +270,7 @@ protected: - static bool wireRender, debugSpheres, debugBoneLines, debugPartitionTree, debugEnvProbes, gridHelper; + static bool wireRender, debugSpheres, debugBoneLines, debugPartitionTree, debugEnvProbes, gridHelper, voxelHelper; static bool requestReflectionRendering; @@ -330,6 +330,8 @@ public: static void SetToDrawDebugEnvProbes(bool value) { debugEnvProbes = value; } static bool GetToDrawGridHelper() { return gridHelper; } static void SetToDrawGridHelper(bool value) { gridHelper = value; } + static bool GetToDrawVoxelHelper() { return voxelHelper; } + static void SetToDrawVoxelHelper(bool value) { voxelHelper = value; } static void SetDebugLightCulling(bool enabled) { debugLightCulling = enabled; } static bool GetDebugLightCulling() { return debugLightCulling; } static void SetOcclusionCullingEnabled(bool enabled) { occlusionCulling = enabled; } @@ -402,6 +404,7 @@ public: static void DrawTranslators(Camera* camera, GRAPHICSTHREAD threadID); static void DrawDebugEnvProbes(Camera* camera, GRAPHICSTHREAD threadID); static void DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID); + static void DrawDebugVoxels(Camera* camera, GRAPHICSTHREAD threadID); static void DrawSoftParticles(Camera* camera, GRAPHICSTHREAD threadID, bool dark = false); static void DrawSoftPremulParticles(Camera* camera, GRAPHICSTHREAD threadID, bool dark = false); static void DrawTrails(GRAPHICSTHREAD threadID, wiGraphicsTypes::Texture2D* refracRes);