diff --git a/WickedEngine/RendererWindow.cpp b/WickedEngine/RendererWindow.cpp
index 43710e356..2cf2c173e 100644
--- a/WickedEngine/RendererWindow.cpp
+++ b/WickedEngine/RendererWindow.cpp
@@ -58,6 +58,16 @@ RendererWindow::RendererWindow(Renderable3DComponent* component)
voxelRadianceDebugCheckBox->SetCheck(wiRenderer::GetToDrawVoxelHelper());
rendererWindow->AddWidget(voxelRadianceDebugCheckBox);
+ voxelRadianceVoxelSizeSlider = new wiSlider(0.25, 10, 1, 39, "Voxel Radiance Voxel Size: ");
+ voxelRadianceVoxelSizeSlider->SetTooltip("Adjust the voxel size for voxel radiance calculations.");
+ voxelRadianceVoxelSizeSlider->SetSize(XMFLOAT2(100, 30));
+ voxelRadianceVoxelSizeSlider->SetPos(XMFLOAT2(x, y += 30));
+ voxelRadianceVoxelSizeSlider->SetValue(wiRenderer::GetVoxelRadianceVoxelSize());
+ voxelRadianceVoxelSizeSlider->OnSlide([&](wiEventArgs args) {
+ wiRenderer::SetVoxelRadianceVoxelSize(args.fValue);
+ });
+ rendererWindow->AddWidget(voxelRadianceVoxelSizeSlider);
+
partitionBoxesCheckBox = new wiCheckBox("SPTree visualizer: ");
partitionBoxesCheckBox->SetTooltip("Visualize the world space partitioning tree as boxes");
partitionBoxesCheckBox->SetPos(XMFLOAT2(x, y += step));
@@ -151,6 +161,7 @@ RendererWindow::RendererWindow(Renderable3DComponent* component)
speedMultiplierSlider->SetTooltip("Adjust the global speed (time multiplier)");
speedMultiplierSlider->SetSize(XMFLOAT2(100, 30));
speedMultiplierSlider->SetPos(XMFLOAT2(x, y += 30));
+ speedMultiplierSlider->SetValue(wiRenderer::GetGameSpeed());
speedMultiplierSlider->OnSlide([&](wiEventArgs args) {
wiRenderer::SetGameSpeed(args.fValue);
});
@@ -280,6 +291,7 @@ RendererWindow::~RendererWindow()
SAFE_DELETE(occlusionCullingCheckBox);
SAFE_DELETE(voxelRadianceCheckBox);
SAFE_DELETE(voxelRadianceDebugCheckBox);
+ SAFE_DELETE(voxelRadianceVoxelSizeSlider);
SAFE_DELETE(partitionBoxesCheckBox);
SAFE_DELETE(boneLinesCheckBox);
SAFE_DELETE(wireFrameCheckBox);
diff --git a/WickedEngine/RendererWindow.h b/WickedEngine/RendererWindow.h
index 7b7e106fe..18af8319f 100644
--- a/WickedEngine/RendererWindow.h
+++ b/WickedEngine/RendererWindow.h
@@ -21,6 +21,7 @@ public:
wiCheckBox* occlusionCullingCheckBox;
wiCheckBox* voxelRadianceCheckBox;
wiCheckBox* voxelRadianceDebugCheckBox;
+ wiSlider* voxelRadianceVoxelSizeSlider;
wiCheckBox* partitionBoxesCheckBox;
wiCheckBox* boneLinesCheckBox;
wiCheckBox* wireFrameCheckBox;
diff --git a/WickedEngine/ShaderInterop.h b/WickedEngine/ShaderInterop.h
new file mode 100644
index 000000000..f7914e01a
--- /dev/null
+++ b/WickedEngine/ShaderInterop.h
@@ -0,0 +1,6 @@
+#ifndef _WICKEDENGINE_SHADERINTEROP_H_
+#define _WICKEDENGINE_SHADERINTEROP_H_
+
+#define SCENE_VOXELIZATION_RESOLUTION 32
+
+#endif
diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj b/WickedEngine/WickedEngine_SHADERS.vcxproj
index 7f5da8b2c..c46bc1301 100644
--- a/WickedEngine/WickedEngine_SHADERS.vcxproj
+++ b/WickedEngine/WickedEngine_SHADERS.vcxproj
@@ -379,6 +379,16 @@
Domain
Domain
+
+ Geometry
+ 4.0
+ Geometry
+ 4.0
+ Geometry
+ 4.0
+ Geometry
+ 4.0
+
Hull
Hull
@@ -575,6 +585,12 @@
Pixel
Pixel
+
+ Pixel
+ Pixel
+ Pixel
+ Pixel
+
Vertex
Vertex
@@ -587,6 +603,12 @@
Vertex
Vertex
+
+ Vertex
+ Vertex
+ Vertex
+ Vertex
+
Pixel
Pixel
diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
index 71741c3f2..b18fda2fc 100644
--- a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
+++ b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters
@@ -519,6 +519,15 @@
PS
+
+ GS
+
+
+ VS
+
+
+ PS
+
diff --git a/WickedEngine/WickedEngine_SHARED.vcxitems b/WickedEngine/WickedEngine_SHARED.vcxitems
index 42fd7492f..f766af9cc 100644
--- a/WickedEngine/WickedEngine_SHARED.vcxitems
+++ b/WickedEngine/WickedEngine_SHARED.vcxitems
@@ -233,6 +233,7 @@
+
diff --git a/WickedEngine/WickedEngine_SHARED.vcxitems.filters b/WickedEngine/WickedEngine_SHARED.vcxitems.filters
index 76dd3f027..9e3058a04 100644
--- a/WickedEngine/WickedEngine_SHARED.vcxitems.filters
+++ b/WickedEngine/WickedEngine_SHARED.vcxitems.filters
@@ -1089,6 +1089,9 @@
ENGINE\Helpers
+
+ ENGINE\Graphics\GPUMapping
+
diff --git a/WickedEngine/globals.hlsli b/WickedEngine/globals.hlsli
index 48c103c31..057b5f712 100644
--- a/WickedEngine/globals.hlsli
+++ b/WickedEngine/globals.hlsli
@@ -1,5 +1,6 @@
#ifndef _SHADER_GLOBALS_
#define _SHADER_GLOBALS_
+#include "ShaderInterop.h"
#include "ConstantBufferMapping.h"
#include "SamplerMapping.h"
#include "ResourceMapping.h"
diff --git a/WickedEngine/objectGS_voxelizer.hlsl b/WickedEngine/objectGS_voxelizer.hlsl
new file mode 100644
index 000000000..4fc750d58
--- /dev/null
+++ b/WickedEngine/objectGS_voxelizer.hlsl
@@ -0,0 +1,40 @@
+#include "globals.hlsli"
+
+CBUFFER(voxelCamBuffer, 0)
+{
+ float4x4 xVoxelCam[SCENE_VOXELIZATION_RESOLUTION];
+}
+
+struct GSInput
+{
+ float4 pos : SV_POSITION;
+ float2 tex : TEXCOORD;
+};
+
+struct GSOutput
+{
+ float4 pos : SV_POSITION;
+ float2 tex : TEXCOORD;
+ uint RTIndex : SV_RenderTargetArrayIndex;
+};
+
+[maxvertexcount(3 * SCENE_VOXELIZATION_RESOLUTION)]
+void main(
+ triangle GSInput input[3],
+ inout TriangleStream< GSOutput > output
+)
+{
+ for (uint i = 0; i < SCENE_VOXELIZATION_RESOLUTION; i++)
+ {
+ GSOutput element;
+ element.RTIndex = i;
+
+ for (uint j = 0; j < 3; ++j)
+ {
+ element.tex = input[j].tex;
+ element.pos = mul(float4(input[j].pos.xyz, 1), xVoxelCam[i]);
+ output.Append(element);
+ }
+ output.RestartStrip();
+ }
+}
\ No newline at end of file
diff --git a/WickedEngine/objectHF.hlsli b/WickedEngine/objectHF.hlsli
index 4f983f006..9d9f00513 100644
--- a/WickedEngine/objectHF.hlsli
+++ b/WickedEngine/objectHF.hlsli
@@ -119,7 +119,7 @@ inline void VoxelRadiance(in float3 P, inout float ao)
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);
+ float blend = pow(saturate(max(diff.x, max(diff.y, diff.z))), 8);
ao *= lerp(1 - radiance.a, 1, blend);
}
diff --git a/WickedEngine/objectPS_voxelizer.hlsl b/WickedEngine/objectPS_voxelizer.hlsl
new file mode 100644
index 000000000..ead86ce93
--- /dev/null
+++ b/WickedEngine/objectPS_voxelizer.hlsl
@@ -0,0 +1,6 @@
+#include "objectHF.hlsli"
+
+float4 main(float4 pos : SV_POSITION, float2 tex : TEXCOORD, uint RTIndex : SV_RenderTargetArrayIndex) : SV_TARGET
+{
+ return DEGAMMA(xBaseColorMap.Sample(sampler_linear_clamp, tex));
+}
\ No newline at end of file
diff --git a/WickedEngine/objectVS_voxelizer.hlsl b/WickedEngine/objectVS_voxelizer.hlsl
new file mode 100644
index 000000000..efdc5a48e
--- /dev/null
+++ b/WickedEngine/objectVS_voxelizer.hlsl
@@ -0,0 +1,20 @@
+#include "objectHF.hlsli"
+
+struct VSOut
+{
+ float4 pos : SV_POSITION;
+ float2 tex : TEXCOORD;
+};
+
+VSOut main(Input input)
+{
+ VSOut Out = (VSOut)0;
+
+ float4x4 WORLD = MakeWorldMatrixFromInstance(input);
+
+ Out.pos = mul(input.pos, WORLD);
+ Out.tex = input.tex.xy;
+
+
+ return Out;
+}
\ No newline at end of file
diff --git a/WickedEngine/voxelRadianceCS.hlsl b/WickedEngine/voxelRadianceCS.hlsl
index 92b44cb3f..6330f333b 100644
--- a/WickedEngine/voxelRadianceCS.hlsl
+++ b/WickedEngine/voxelRadianceCS.hlsl
@@ -29,28 +29,28 @@ void main( uint3 DTid : SV_DispatchThreadID, uint GroupIndex : SV_GroupIndex )
{
// TODO!
- float3 dim;
- input.GetDimensions(dim.x, dim.y, dim.z);
- float3 uvw = DTid / dim;
+ //float3 dim;
+ //input.GetDimensions(dim.x, dim.y, dim.z);
+ //float3 uvw = DTid / dim;
- float occ = 0;
- uint count = 0;
- for (uint i = 0; i < 16; ++i)
- {
- for (uint j = 1; j < 6; ++j)
- {
- float3 tex = uvw + j * SAMPLES[i] / dim;
- occ += input.SampleLevel(sampler_linear_clamp, tex, 0).a;
+ //float occ = 0;
+ //uint count = 0;
+ //for (uint i = 0; i < 16; ++i)
+ //{
+ // for (uint j = 1; j < 6; ++j)
+ // {
+ // float3 tex = uvw + j * SAMPLES[i] / dim;
+ // occ += input.SampleLevel(sampler_linear_clamp, tex, 0).a;
- count++;
- }
- }
+ // count++;
+ // }
+ //}
- output[DTid] = float4(input[DTid].rgb, occ / count);
+ //output[DTid] = occ / count;
- //float4 current = input[DTid];
+ float4 current = input[DTid];
- //output[DTid] = current;
+ output[DTid] = current;
//accumulation[GroupIndex] = current;
diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h
index ddcb84807..abbf83ae6 100644
--- a/WickedEngine/wiEnums.h
+++ b/WickedEngine/wiEnums.h
@@ -74,6 +74,7 @@ enum CBTYPES
CBTYPE_API,
CBTYPE_TESSELLATION,
CBTYPE_DISPATCHPARAMS,
+ CBTYPE_VOXELIZER,
CBTYPE_LAST
};
@@ -124,6 +125,7 @@ enum VSTYPES
VSTYPE_ENVMAP_SKY,
VSTYPE_SPHERE,
VSTYPE_CUBE,
+ VSTYPE_VOXELIZER,
VSTYPE_VOXEL,
VSTYPE_LAST
};
@@ -188,6 +190,7 @@ enum PSTYPES
PSTYPE_ENVMAP_SKY,
PSTYPE_CUBEMAP,
PSTYPE_CAPTUREIMPOSTOR,
+ PSTYPE_VOXELIZER,
PSTYPE_VOXEL,
PSTYPE_LAST
};
@@ -198,6 +201,7 @@ enum GSTYPES
GSTYPE_STREAMOUT,
GSTYPE_ENVMAP,
GSTYPE_ENVMAP_SKY,
+ GSTYPE_VOXELIZER,
GSTYPE_LAST
};
// hull shaders
diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp
index 43d15b909..90d7487a1 100644
--- a/WickedEngine/wiRenderer.cpp
+++ b/WickedEngine/wiRenderer.cpp
@@ -1,4 +1,5 @@
#include "wiRenderer.h"
+#include "ShaderInterop.h"
#include "wiFrameRate.h"
#include "wiHairParticle.h"
#include "wiEmittedParticle.h"
@@ -57,6 +58,7 @@ float wiRenderer::GameSpeed=1,wiRenderer::overrideGameSpeed=1;
bool wiRenderer::debugLightCulling = false;
bool wiRenderer::occlusionCulling = true;
bool wiRenderer::voxelRadiance = false;
+float wiRenderer::voxelRadianceVoxelSize = 1.0f;
int wiRenderer::visibleCount;
wiRenderTarget wiRenderer::normalMapRT, wiRenderer::imagesRT, wiRenderer::imagesRTAdd;
Camera *wiRenderer::cam = nullptr, *wiRenderer::refCam = nullptr, *wiRenderer::prevFrameCam = nullptr;
@@ -564,6 +566,9 @@ void wiRenderer::LoadBuffers()
bd.ByteWidth = sizeof(DispatchParamsCB);
GetDevice()->CreateBuffer(&bd, nullptr, constantBuffers[CBTYPE_DISPATCHPARAMS]);
+ bd.ByteWidth = sizeof(XMMATRIX) * SCENE_VOXELIZATION_RESOLUTION;
+ GetDevice()->CreateBuffer(&bd, nullptr, constantBuffers[CBTYPE_VOXELIZER]);
+
@@ -589,8 +594,6 @@ void wiRenderer::LoadBuffers()
bd.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED;
bd.StructureByteStride = sizeof(LightArrayType);
GetDevice()->CreateBuffer(&bd, nullptr, resourceBuffers[RBTYPE_LIGHTARRAY]);
-
-
}
void wiRenderer::LoadShaders()
@@ -701,6 +704,7 @@ 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_VOXELIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectVS_voxelizer.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
vertexShaders[VSTYPE_VOXEL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelVS.cso", wiResourceManager::VERTEXSHADER))->vertexShader;
@@ -762,12 +766,14 @@ 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_VOXELIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectPS_voxelizer.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));
geometryShaders[GSTYPE_SHADOWCUBEMAPRENDER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "cubeShadowGS.cso", wiResourceManager::GEOMETRYSHADER));
+ geometryShaders[GSTYPE_VOXELIZER] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectGS_voxelizer.cso", wiResourceManager::GEOMETRYSHADER));
computeShaders[CSTYPE_LUMINANCE_PASS1] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "luminancePass1CS.cso", wiResourceManager::COMPUTESHADER));
@@ -2357,8 +2363,7 @@ void wiRenderer::DrawDebugVoxels(Camera* camera, GRAPHICSTHREAD threadID)
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()->DrawInstanced(36, voxelSceneData.res * voxelSceneData.res * voxelSceneData.res, threadID); // cube
GetDevice()->EventEnd(threadID);
@@ -3275,6 +3280,9 @@ PSTYPES GetPSTYPE(SHADERTYPE shaderType, const Material* const material)
case SHADERTYPE_ALPHATESTONLY:
realPS = PSTYPE_ALPHATESTONLY;
break;
+ case SHADERTYPE_VOXELIZE:
+ realPS = PSTYPE_VOXELIZER;
+ break;
default:
realPS = PSTYPE_TEXTUREONLY;
break;
@@ -3332,7 +3340,12 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle
GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID);
GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_EFFECT], threadID);
- if (shaderType == SHADERTYPE_SHADOW)
+ if (shaderType == SHADERTYPE_VOXELIZE)
+ {
+ GetDevice()->BindVS(vertexShaders[VSTYPE_VOXELIZER], threadID);
+ GetDevice()->BindGS(geometryShaders[GSTYPE_VOXELIZER], threadID);
+ }
+ else if (shaderType == SHADERTYPE_SHADOW)
{
GetDevice()->BindVS(vertexShaders[VSTYPE_SHADOW], threadID);
}
@@ -3914,19 +3927,16 @@ void wiRenderer::VoxelizeScene(GRAPHICSTHREAD threadID)
return;
}
- GetDevice()->EventBegin("Voxelize Scene", threadID);
- wiProfiler::GetInstance().BeginRange("Voxelize Scene", wiProfiler::DOMAIN_GPU, threadID);
- static const int res = 64;
- static const float voxelsize = 1.0f;
- voxelSceneData.res = res;
+ voxelSceneData.res = SCENE_VOXELIZATION_RESOLUTION;
+ voxelSceneData.voxelsize = voxelRadianceVoxelSize;
if (textures[TEXTYPE_3D_VOXELSCENE] == nullptr)
{
Texture3DDesc desc;
ZeroMemory(&desc, sizeof(desc));
- desc.Width = res;
- desc.Height = res;
- desc.Depth = res;
+ desc.Width = voxelSceneData.res;
+ desc.Height = voxelSceneData.res;
+ desc.Depth = voxelSceneData.res;
desc.MipLevels = 1;
desc.Format = FORMAT_R8G8B8A8_UNORM;
desc.BindFlags = BIND_RENDER_TARGET | BIND_SHADER_RESOURCE;
@@ -3935,7 +3945,6 @@ void wiRenderer::VoxelizeScene(GRAPHICSTHREAD threadID)
desc.MiscFlags = 0;
textures[TEXTYPE_3D_VOXELSCENE] = new Texture3D;
- textures[TEXTYPE_3D_VOXELSCENE]->RequestIndepententRenderTargetArraySlices(true);
HRESULT hr = GetDevice()->CreateTexture3D(&desc, nullptr, (Texture3D**)&textures[TEXTYPE_3D_VOXELSCENE]);
assert(SUCCEEDED(hr));
}
@@ -3944,11 +3953,11 @@ void wiRenderer::VoxelizeScene(GRAPHICSTHREAD threadID)
CulledCollection culledRenderer;
AABB bbox;
- XMFLOAT3 extents = XMFLOAT3(res * voxelsize, res * voxelsize, res * voxelsize);
- const float f = 0.5f / voxelsize;
+ XMFLOAT3 extents = XMFLOAT3(voxelSceneData.res * voxelSceneData.voxelsize, voxelSceneData.res * voxelSceneData.voxelsize, voxelSceneData.res * voxelSceneData.voxelsize);
+ const float f = 0.5f / voxelSceneData.voxelsize;
XMFLOAT3 center = XMFLOAT3(floorf(cam->translation.x * f) / f, floorf(cam->translation.y * f) / f, floorf(cam->translation.z * f) / f);
bbox.createFromHalfWidth(center, extents);
- if (spTree != nullptr)
+ if (spTree != nullptr && (wiMath::Distance(center,voxelSceneData.center) > 0.1f || GetToDrawVoxelHelper() )) // debug voxel helper forces the render every time to help graphics debugging!
{
spTree->getVisible(bbox, culledObjects);
@@ -3957,51 +3966,45 @@ void wiRenderer::VoxelizeScene(GRAPHICSTHREAD threadID)
culledRenderer[((Object*)object)->mesh].push_front((Object*)object);
}
+ GetDevice()->EventBegin("Voxelize Scene", threadID);
+ wiProfiler::GetInstance().BeginRange("Voxelize Scene", wiProfiler::DOMAIN_GPU, threadID);
+
ViewPort VP;
VP.TopLeftX = 0;
VP.TopLeftY = 0;
- VP.Width = (float)res;
- VP.Height = (float)res;
+ VP.Width = (float)voxelSceneData.res;
+ VP.Height = (float)voxelSceneData.res;
VP.MinDepth = 0.0f;
VP.MaxDepth = 1.0f;
GetDevice()->BindViewports(1, &VP, threadID);
GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID);
- Camera savedCam = *cam;
-
-
- for (int i = 0; i < res; ++i)
+ XMMATRIX voxelizerCams[SCENE_VOXELIZATION_RESOLUTION];
+ for (int i = 0; i < voxelSceneData.res; ++i)
{
- GetDevice()->BindRenderTargets(1, &textures[TEXTYPE_3D_VOXELSCENE], nullptr, threadID, i);
- static const float color[] = { 0,0,0,0 };
- GetDevice()->ClearRenderTarget(textures[TEXTYPE_3D_VOXELSCENE], color, threadID, i);
-
- cam->Clear();
- cam->Translate(bbox.getCenter());
-
XMMATRIX view = XMMatrixLookToLH(XMLoadFloat3(¢er), XMVectorSet(0, 0, 1, 0), XMVectorSet(0, 1, 0, 0));
- XMStoreFloat4x4(&cam->View, view);
- XMMATRIX projection = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.y, extents.y, -extents.z + i * voxelsize * 2, -extents.z + (i + 1) * voxelsize * 2);
- XMStoreFloat4x4(&cam->Projection, projection);
- XMStoreFloat4x4(&cam->VP, XMMatrixMultiply(view, projection));
+ XMMATRIX projection = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.y, extents.y, -extents.z + i * voxelSceneData.voxelsize * 2, -extents.z + (i + 1) * voxelSceneData.voxelsize * 2);
- UpdateCameraCB(cam, threadID);
-
- RenderMeshes(cam->translation, culledRenderer, SHADERTYPE_VOXELIZE, RENDERTYPE_OPAQUE, threadID);
+ voxelizerCams[i] = XMMatrixTranspose(view*projection);
}
+ GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_VOXELIZER], voxelizerCams, threadID, sizeof(voxelizerCams));
+ GetDevice()->BindConstantBufferGS(constantBuffers[CBTYPE_VOXELIZER], 0, threadID);
+
+ GetDevice()->BindRenderTargets(1, &textures[TEXTYPE_3D_VOXELSCENE], nullptr, threadID);
+ static const float color[] = { 0,0,0,0 };
+ GetDevice()->ClearRenderTarget(textures[TEXTYPE_3D_VOXELSCENE], color, threadID);
+
+ RenderMeshes(center, culledRenderer, SHADERTYPE_VOXELIZE, RENDERTYPE_OPAQUE, threadID);
+
+ GetDevice()->BindRenderTargets(0, nullptr, nullptr, threadID);
- *cam = savedCam;
- UpdateCameraCB(cam, threadID);
+ wiProfiler::GetInstance().EndRange(threadID);
+ GetDevice()->EventEnd();
-
- voxelSceneData.voxelsize = voxelsize;
voxelSceneData.center = center;
}
-
- wiProfiler::GetInstance().EndRange(threadID);
- GetDevice()->EventEnd();
}
void wiRenderer::ComputeTiledLightCulling(GRAPHICSTHREAD threadID)
diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h
index 723673116..b07ff2393 100644
--- a/WickedEngine/wiRenderer.h
+++ b/WickedEngine/wiRenderer.h
@@ -296,6 +296,7 @@ protected:
static bool debugLightCulling;
static bool occlusionCulling;
static bool voxelRadiance;
+ static float voxelRadianceVoxelSize;
struct VoxelizedSceneData
{
@@ -347,6 +348,8 @@ public:
static bool GetOcclusionCullingEnabled() { return occlusionCulling; }
static void SetVoxelRadianceEnabled(bool enabled) { voxelRadiance = enabled; }
static bool GetVoxelRadianceEnabled() { return voxelRadiance; }
+ static void SetVoxelRadianceVoxelSize(float enabled) { voxelRadianceVoxelSize = enabled; }
+ static float GetVoxelRadianceVoxelSize() { return voxelRadianceVoxelSize; }
static bool IsRequestedReflectionRendering() { return requestReflectionRendering; }
static wiGraphicsTypes::Texture2D* GetColorGrading(){return colorGrading;};
static void SetColorGrading(wiGraphicsTypes::Texture2D* tex){colorGrading=tex;};
diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp
index b00fcaed9..05a1231bc 100644
--- a/WickedEngine/wiVersion.cpp
+++ b/WickedEngine/wiVersion.cpp
@@ -7,7 +7,7 @@ namespace wiVersion
// minor features, major updates
const int minor = 10;
// minor bug fixes, alterations, refactors, updates
- const int revision = 0;
+ const int revision = 2;
long GetVersion()