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);