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