From 06a4c9c4a696349d8e94ea732bb322bb64d6d37f Mon Sep 17 00:00:00 2001 From: turanszkij Date: Sat, 25 Feb 2017 22:43:18 +0100 Subject: [PATCH] Scene voxelization on GPU + voxel radiance compute started + general updates --- WickedEngine/MainComponent.cpp | 6 +- WickedEngine/RendererWindow.cpp | 13 +- WickedEngine/RendererWindow.h | 1 + WickedEngine/ResourceMapping.h | 44 ++- WickedEngine/WickedEngine_SHADERS.vcxproj | 10 + .../WickedEngine_SHADERS.vcxproj.filters | 3 + WickedEngine/globals.hlsli | 6 +- WickedEngine/models/Sponza/sponza.wimf | Bin 21062147 -> 21062545 bytes WickedEngine/objectHF.hlsli | 21 ++ WickedEngine/objectPS_tiledforward.hlsl | 2 + .../objectPS_tiledforward_normalmap.hlsl | 2 + ...ledforward_normalmap_planarreflection.hlsl | 2 + .../objectPS_tiledforward_normalmap_pom.hlsl | 2 + ...bjectPS_tiledforward_planarreflection.hlsl | 2 + WickedEngine/objectPS_tiledforward_pom.hlsl | 2 + WickedEngine/voxelRadianceCS.hlsl | 29 ++ WickedEngine/wiEnums.h | 3 + WickedEngine/wiGraphicsDescriptors.h | 23 ++ WickedEngine/wiGraphicsDevice.h | 11 +- WickedEngine/wiGraphicsDevice_DX11.cpp | 283 ++++++++++++++++-- WickedEngine/wiGraphicsDevice_DX11.h | 19 +- WickedEngine/wiGraphicsResource.cpp | 26 +- WickedEngine/wiGraphicsResource.h | 32 +- WickedEngine/wiProfiler.cpp | 4 + WickedEngine/wiRenderTarget.cpp | 4 +- WickedEngine/wiRenderer.cpp | 168 ++++++++++- WickedEngine/wiRenderer.h | 7 +- WickedEngine/wiVersion.cpp | 4 +- 28 files changed, 650 insertions(+), 79 deletions(-) create mode 100644 WickedEngine/voxelRadianceCS.hlsl diff --git a/WickedEngine/MainComponent.cpp b/WickedEngine/MainComponent.cpp index 5e8fa232b..6627dbf8d 100644 --- a/WickedEngine/MainComponent.cpp +++ b/WickedEngine/MainComponent.cpp @@ -120,11 +120,7 @@ void MainComponent::run() } wiProfiler::GetInstance().EndRange(); // Fixed Update - // Rendering: - wiProfiler::GetInstance().BeginRange("GPU Frame", wiProfiler::DOMAIN_GPU, GRAPHICSTHREAD_IMMEDIATE); Render(); - wiProfiler::GetInstance().EndRange(GRAPHICSTHREAD_IMMEDIATE); // GPU Frame - wiProfiler::GetInstance().EndRange(); // CPU Frame @@ -157,7 +153,9 @@ void MainComponent::Render() wiLua::GetGlobal()->Render(); wiRenderer::GetDevice()->LOCK(); + wiProfiler::GetInstance().BeginRange("GPU Frame", wiProfiler::DOMAIN_GPU, GRAPHICSTHREAD_IMMEDIATE); getActiveComponent()->Render(); + wiProfiler::GetInstance().EndRange(GRAPHICSTHREAD_IMMEDIATE); // GPU Frame wiRenderer::GetDevice()->UNLOCK(); } diff --git a/WickedEngine/RendererWindow.cpp b/WickedEngine/RendererWindow.cpp index 546b8654d..eb4fb018a 100644 --- a/WickedEngine/RendererWindow.cpp +++ b/WickedEngine/RendererWindow.cpp @@ -16,7 +16,7 @@ RendererWindow::RendererWindow(Renderable3DComponent* component) wiRenderer::SetToDrawGridHelper(true); rendererWindow = new wiWindow(GUI, "Renderer Window"); - rendererWindow->SetSize(XMFLOAT2(400, 550)); + rendererWindow->SetSize(XMFLOAT2(400, 580)); rendererWindow->SetEnabled(true); GUI->AddWidget(rendererWindow); @@ -40,6 +40,15 @@ RendererWindow::RendererWindow(Renderable3DComponent* component) occlusionCullingCheckBox->SetCheck(wiRenderer::GetOcclusionCullingEnabled()); rendererWindow->AddWidget(occlusionCullingCheckBox); + voxelRadianceCheckBox = new wiCheckBox("Voxel Radiance: "); + voxelRadianceCheckBox->SetTooltip("Toggle voxel radiance computation (EXPERIMENTAL)."); + voxelRadianceCheckBox->SetPos(XMFLOAT2(x, y += step)); + voxelRadianceCheckBox->OnClick([](wiEventArgs args) { + wiRenderer::SetVoxelRadianceEnabled(args.bValue); + }); + voxelRadianceCheckBox->SetCheck(wiRenderer::GetVoxelRadianceEnabled()); + rendererWindow->AddWidget(voxelRadianceCheckBox); + partitionBoxesCheckBox = new wiCheckBox("SPTree visualizer: "); partitionBoxesCheckBox->SetTooltip("Visualize the world space partitioning tree as boxes"); partitionBoxesCheckBox->SetPos(XMFLOAT2(x, y += step)); @@ -259,6 +268,8 @@ RendererWindow::~RendererWindow() SAFE_DELETE(rendererWindow); SAFE_DELETE(vsyncCheckBox); SAFE_DELETE(vsyncCheckBox); + SAFE_DELETE(occlusionCullingCheckBox); + SAFE_DELETE(voxelRadianceCheckBox); SAFE_DELETE(partitionBoxesCheckBox); SAFE_DELETE(boneLinesCheckBox); SAFE_DELETE(wireFrameCheckBox); diff --git a/WickedEngine/RendererWindow.h b/WickedEngine/RendererWindow.h index bafe9379a..d849b43c3 100644 --- a/WickedEngine/RendererWindow.h +++ b/WickedEngine/RendererWindow.h @@ -19,6 +19,7 @@ public: wiWindow* rendererWindow; wiCheckBox* vsyncCheckBox; wiCheckBox* occlusionCullingCheckBox; + wiCheckBox* voxelRadianceCheckBox; wiCheckBox* partitionBoxesCheckBox; wiCheckBox* boneLinesCheckBox; wiCheckBox* wireFrameCheckBox; diff --git a/WickedEngine/ResourceMapping.h b/WickedEngine/ResourceMapping.h index 6f9b3f458..bc1692730 100644 --- a/WickedEngine/ResourceMapping.h +++ b/WickedEngine/ResourceMapping.h @@ -36,26 +36,28 @@ #define TEXSLOT_SHADOWARRAY_2D 12 #define TEXSLOT_SHADOWARRAY_CUBE 13 -#define TEXSLOT_ONDEMAND0 14 -#define TEXSLOT_ONDEMAND1 15 -#define TEXSLOT_ONDEMAND2 16 -#define TEXSLOT_ONDEMAND3 17 -#define TEXSLOT_ONDEMAND4 18 -#define TEXSLOT_ONDEMAND5 19 -#define TEXSLOT_ONDEMAND6 20 -#define TEXSLOT_ONDEMAND7 21 -#define TEXSLOT_ONDEMAND8 22 -#define TEXSLOT_ONDEMAND9 23 +#define TEXSLOT_VOXELRADIANCE 14 + +#define TEXSLOT_ONDEMAND0 15 +#define TEXSLOT_ONDEMAND1 16 +#define TEXSLOT_ONDEMAND2 17 +#define TEXSLOT_ONDEMAND3 18 +#define TEXSLOT_ONDEMAND4 19 +#define TEXSLOT_ONDEMAND5 20 +#define TEXSLOT_ONDEMAND6 21 +#define TEXSLOT_ONDEMAND7 22 +#define TEXSLOT_ONDEMAND8 23 +#define TEXSLOT_ONDEMAND9 24 #define TEXSLOT_ONDEMAND_COUNT (TEXSLOT_ONDEMAND9 - TEXSLOT_ONDEMAND0 + 1) -#define TEXSLOT_LIGHTGRID 24 +#define TEXSLOT_LIGHTGRID 25 #define TEXSLOT_COUNT TEXSLOT_LIGHTGRID #define SBSLOT_BONE 0 -#define SBSLOT_TILEFRUSTUMS 24 -#define SBSLOT_LIGHTINDEXLIST 25 -#define SBSLOT_LIGHTARRAY 26 +#define SBSLOT_TILEFRUSTUMS 25 +#define SBSLOT_LIGHTINDEXLIST 26 +#define SBSLOT_LIGHTARRAY 27 /////////////////////////// @@ -83,6 +85,14 @@ #define RWSTRUCTUREDBUFFER_X(name, type, slot) RWStructuredBuffer< type > name : register(u ## slot) #define RWSTRUCTUREDBUFFER(name, type, slot) RWSTRUCTUREDBUFFER_X(name, type, slot) + +#define TEXTURE1D_X(name, type, slot) Texture1D< type > name : register(t ## slot); +#define TEXTURE1D(name, type, slot) TEXTURE1D_X(name, type, slot) +#define TEXTURE1DARRAY_X(name, type, slot) Texture1DArray< type > name : register(t ## slot); +#define TEXTURE1DARRAY(name, type, slot) TEXTURE1DARRAY_X(name, type, slot) +#define RWTEXTURE1D_X(name, type, slot) RWTexture1D< type > name : register(u ## slot); +#define RWTEXTURE1D(name, type, slot) RWTEXTURE1D_X(name, type, slot) + #define TEXTURE2D_X(name, type, slot) Texture2D< type > name : register(t ## slot); #define TEXTURE2D(name, type, slot) TEXTURE2D_X(name, type, slot) #define TEXTURE2DMS_X(name, type, slot) Texture2DMS< type > name : register(t ## slot); @@ -91,10 +101,16 @@ #define TEXTURE2DARRAY(name, type, slot) TEXTURE2DARRAY_X(name, type, slot) #define RWTEXTURE2D_X(name, type, slot) RWTexture2D< type > name : register(u ## slot); #define RWTEXTURE2D(name, type, slot) RWTEXTURE2D_X(name, type, slot) + #define TEXTURECUBE_X(name, type, slot) TextureCube< type > name : register(t ## slot); #define TEXTURECUBE(name, type, slot) TEXTURECUBE_X(name, type, slot) #define TEXTURECUBEARRAY_X(name, type, slot) TextureCubeArray< type > name : register(t ## slot); #define TEXTURECUBEARRAY(name, type, slot) TEXTURECUBEARRAY_X(name, type, slot) +#define TEXTURE3D_X(name, type, slot) Texture3D< type > name : register(t ## slot); +#define TEXTURE3D(name, type, slot) TEXTURE3D_X(name, type, slot) +#define RWTEXTURE3D_X(name, type, slot) RWTexture3D< type > name : register(u ## slot); +#define RWTEXTURE3D(name, type, slot) RWTEXTURE3D_X(name, type, slot) + #endif // _RESOURCEBUFFER_MAPPING_H_ diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj b/WickedEngine/WickedEngine_SHADERS.vcxproj index f9882f1b9..6e032f310 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj @@ -839,6 +839,16 @@ Pixel Pixel + + Compute + 4.0 + Compute + 4.0 + Compute + 5.0 + Compute + 4.0 + Vertex Vertex diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters index e3fdbcd5e..b0e8010ee 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters @@ -510,6 +510,9 @@ PS + + CS + diff --git a/WickedEngine/globals.hlsli b/WickedEngine/globals.hlsli index 0f0937dd5..cc364feeb 100644 --- a/WickedEngine/globals.hlsli +++ b/WickedEngine/globals.hlsli @@ -15,9 +15,11 @@ TEXTURECUBE(texture_env_global, float4, TEXSLOT_ENV_GLOBAL) TEXTURECUBE(texture_env0, float4, TEXSLOT_ENV0) TEXTURECUBE(texture_env1, float4, TEXSLOT_ENV1) TEXTURECUBE(texture_env2, float4, TEXSLOT_ENV2) +TEXTURE2D(texture_decalatlas, float4, TEXSLOT_DECALATLAS) TEXTURE2DARRAY(texture_shadowarray_2d, float, TEXSLOT_SHADOWARRAY_2D) TEXTURECUBEARRAY(texture_shadowarray_cube, float, TEXSLOT_SHADOWARRAY_CUBE) -TEXTURE2D(texture_decalatlas, float4, TEXSLOT_DECALATLAS) +TEXTURE3D(texture_voxelradiance, float4, TEXSLOT_VOXELRADIANCE) + TEXTURE2D(texture_0, float4, TEXSLOT_ONDEMAND0) TEXTURE2D(texture_1, float4, TEXSLOT_ONDEMAND1) TEXTURE2D(texture_2, float4, TEXSLOT_ONDEMAND2) @@ -48,7 +50,7 @@ CBUFFER(WorldCB, CBSLOT_RENDERER_WORLD) float3 g_xWorld_Ambient; float xPadding2_WorldCB; float3 g_xWorld_Fog; float xPadding3_WorldCB; float2 g_xWorld_ScreenWidthHeight; - float xPadding4_WorldCB; + float g_xWorld_VoxelRadianceScale; float xPadding5_WorldCB; }; CBUFFER(FrameCB, CBSLOT_RENDERER_FRAME) diff --git a/WickedEngine/models/Sponza/sponza.wimf b/WickedEngine/models/Sponza/sponza.wimf index 96c544fd0c25cfe9f7bb6e8bba3f863087ac3b3d..79a7e545e8917cc449cb459d8235019fb5f46053 100644 GIT binary patch delta 1968 zcmbu;c~F!E7{_tmRX|n{5O6^kR0KgmF0WN#UtTiGG&-cn5M7ThJ51Z`4vG-UkN}M+ za6EG2zFc}t1!Bk8`Ix=8|icDz8!X=oFOOcJsa5-k+ z3e3bTT!|c9g{yH5uElKR;yPT9JludexDol7ivrBUeAuu63$X}`aT9LFEw~l8VF_-> z9k>&BVJYs$GAzeEu;X5=zp zR-*#Xpb}N6#u}`}v#7yysKxVm0d;s0>)=2=*5f6-j171Nui`aq#Ov6E&DerB(116w z6>ni1-bN$d!MkX}duT=rwqplc(FP}6Xh#R$$4=}*Cw5~GKEQ|g2p{7UbYU+(MK?Zc zs(0_Js?FEGN6+unbN`QTwzS;7AD`m@4&nohTriA{={kgg)=ydbNCzo;5;s@Dz_^YkQgNWB>g4c5+8}L zWPrp^Vw4P&_)7vLgCv2HAW5)fup~qhDhZPek(eamk_gFA$uNmo5-Ew243~_MjFd!6 zMoD5Mv69h}I7z%@jAX1NL6RsLCrOedOHw4Mk~GP9$ppzn$t1~SiA6F+GF387k}k=R zSS70BEVpMWxjl-}ab&ip)J3?DdRzN06sqTO27W8;PIth<)+EQWxtd~fY?-eqLC&^Z zO$qmLOrN7EDNdh!Oh?`)ryLuh`ZF9&hhD7~8(6pu1gm-K?A}&wV%~FiXFY?P^i7^n2O*y}mtfWIJZ? zuSKQ?C2vY%`ozM4*mCf;`}?d6*xB) zHe`CGp4d@k$dG51XBW@u)s=ox2}Nr7YKt0eu&Z8PMQTW~k54hVVlpG=@I{&;)^Kie?Bxa|A>0Xn~fnpcPu94MGuywrGcNM4&w) z5rq!uh)#$`3_2qgap;1s=!ST7M*@1FCwieb643{JkpwG}VM9Ok#{djO3I<^?hTs9D zVkpuu4Cxq-2k{U_AOjEM5sbv6cnp~sh0%B%V~~YxJb|$ohbQqAp2jm6j|q4d&tW2- z$0SU~3&_EXm;yUq!c6n3;n1wg+CUWr>@-Q3un1i{Phxu3l2Nq%x z7GnvPVi}g>ZLB~6R-zEAuo`Qy7VA)iVw7M#HsBp>#3sCp&DetX@IF4khxiB|V=K1d z6KqE*KE)2~#4hZ{9_+8bQmdMk-aAEmF7q*x7?!=7wp zoHl%lsz=z2H6c|so=MkhXIk&!HvDGWT~&T#_r(?EjJ6q(E@y_#2=)pKu=Tn1lO%hn=!+4OxgfT#gsTpMPinvLfesUNpauhp_UZ$Mtggr bCB?kgHt)^tep4RmI+krSqKswf9^Ur>U diff --git a/WickedEngine/objectHF.hlsli b/WickedEngine/objectHF.hlsli index 967094d7d..934487255 100644 --- a/WickedEngine/objectHF.hlsli +++ b/WickedEngine/objectHF.hlsli @@ -110,6 +110,24 @@ inline void Refraction(in float2 ScreenCoord, in float2 normal2D, in float3 bump color.a = 1; } +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); + } +} + inline void DirectionalLight(in float3 N, in float3 V, in float3 P, in float3 f0, in float3 albedo, in float roughness, inout float3 diffuse, out float3 specular) { @@ -266,6 +284,9 @@ inline void TiledLighting(in float2 pixel, in float3 N, in float3 V, in float3 P #define OBJECT_PS_LIGHT_TILED \ TiledLighting(pixel, N, V, P, f0, albedo, roughness, diffuse, specular); +#define OBJECT_PS_VOXELRADIANCE \ + VoxelRadiance(P, ao); + #define OBJECT_PS_LIGHT_END \ color.rgb = lerp(1, GetAmbientColor() * ao + diffuse, opacity) * albedo + specular; diff --git a/WickedEngine/objectPS_tiledforward.hlsl b/WickedEngine/objectPS_tiledforward.hlsl index 6d163d24a..4ce85e8e4 100644 --- a/WickedEngine/objectPS_tiledforward.hlsl +++ b/WickedEngine/objectPS_tiledforward.hlsl @@ -17,6 +17,8 @@ float4 main(PixelInputType input) : SV_TARGET OBJECT_PS_ENVIRONMENTREFLECTIONS + OBJECT_PS_VOXELRADIANCE + OBJECT_PS_LIGHT_END OBJECT_PS_EMISSIVE diff --git a/WickedEngine/objectPS_tiledforward_normalmap.hlsl b/WickedEngine/objectPS_tiledforward_normalmap.hlsl index 241da2d18..687111a8d 100644 --- a/WickedEngine/objectPS_tiledforward_normalmap.hlsl +++ b/WickedEngine/objectPS_tiledforward_normalmap.hlsl @@ -21,6 +21,8 @@ float4 main(PixelInputType input) : SV_TARGET OBJECT_PS_ENVIRONMENTREFLECTIONS + OBJECT_PS_VOXELRADIANCE + OBJECT_PS_LIGHT_END OBJECT_PS_EMISSIVE diff --git a/WickedEngine/objectPS_tiledforward_normalmap_planarreflection.hlsl b/WickedEngine/objectPS_tiledforward_normalmap_planarreflection.hlsl index c5a8ef39f..06e745d50 100644 --- a/WickedEngine/objectPS_tiledforward_normalmap_planarreflection.hlsl +++ b/WickedEngine/objectPS_tiledforward_normalmap_planarreflection.hlsl @@ -21,6 +21,8 @@ float4 main(PixelInputType input) : SV_TARGET OBJECT_PS_PLANARREFLECTIONS + OBJECT_PS_VOXELRADIANCE + OBJECT_PS_LIGHT_END OBJECT_PS_EMISSIVE diff --git a/WickedEngine/objectPS_tiledforward_normalmap_pom.hlsl b/WickedEngine/objectPS_tiledforward_normalmap_pom.hlsl index 624186b29..57c1e1902 100644 --- a/WickedEngine/objectPS_tiledforward_normalmap_pom.hlsl +++ b/WickedEngine/objectPS_tiledforward_normalmap_pom.hlsl @@ -23,6 +23,8 @@ float4 main(PixelInputType input) : SV_TARGET OBJECT_PS_ENVIRONMENTREFLECTIONS + OBJECT_PS_VOXELRADIANCE + OBJECT_PS_LIGHT_END OBJECT_PS_EMISSIVE diff --git a/WickedEngine/objectPS_tiledforward_planarreflection.hlsl b/WickedEngine/objectPS_tiledforward_planarreflection.hlsl index 1587b3a29..37f5ebbb6 100644 --- a/WickedEngine/objectPS_tiledforward_planarreflection.hlsl +++ b/WickedEngine/objectPS_tiledforward_planarreflection.hlsl @@ -17,6 +17,8 @@ float4 main(PixelInputType input) : SV_TARGET OBJECT_PS_PLANARREFLECTIONS + OBJECT_PS_VOXELRADIANCE + OBJECT_PS_LIGHT_END OBJECT_PS_EMISSIVE diff --git a/WickedEngine/objectPS_tiledforward_pom.hlsl b/WickedEngine/objectPS_tiledforward_pom.hlsl index cec64ae4a..4c6af1621 100644 --- a/WickedEngine/objectPS_tiledforward_pom.hlsl +++ b/WickedEngine/objectPS_tiledforward_pom.hlsl @@ -21,6 +21,8 @@ float4 main(PixelInputType input) : SV_TARGET OBJECT_PS_ENVIRONMENTREFLECTIONS + OBJECT_PS_VOXELRADIANCE + OBJECT_PS_LIGHT_END OBJECT_PS_EMISSIVE diff --git a/WickedEngine/voxelRadianceCS.hlsl b/WickedEngine/voxelRadianceCS.hlsl new file mode 100644 index 000000000..32d1ce54b --- /dev/null +++ b/WickedEngine/voxelRadianceCS.hlsl @@ -0,0 +1,29 @@ +#include "globals.hlsli" + +TEXTURE3D(input, float4, 0); +RWTEXTURE3D(output, float4, 0); + +groupshared float4 accumulation[4 * 4 * 4]; + +[numthreads(4, 4, 4)] +void main( uint3 DTid : SV_DispatchThreadID, uint GroupIndex : SV_GroupIndex ) +{ + // TODO! + + float4 current = input[DTid]; + + //output[DTid] = 1 - current.aaaa; + + accumulation[GroupIndex] = current; + + GroupMemoryBarrierWithGroupSync(); + + float4 avg = 0; + for (uint i = 0; i < 4 * 4 * 4; ++i) + { + avg += accumulation[i]; + } + avg /= 4 * 4 * 4; + + output[DTid] = 1 - avg.aaaa; +} \ No newline at end of file diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h index e9712815e..9de00fd00 100644 --- a/WickedEngine/wiEnums.h +++ b/WickedEngine/wiEnums.h @@ -92,6 +92,8 @@ enum TEXTYPES TEXTYPE_2D_LIGHTGRID_OPAQUE, TEXTYPE_2D_LIGHTGRID_TRANSPARENT, TEXTYPE_2D_DEBUGUAV, + TEXTYPE_3D_VOXELSCENE, + TEXTYPE_3D_VOXELRADIANCE, TEXTYPE_LAST }; @@ -216,6 +218,7 @@ enum CSTYPES CSTYPE_TILEDLIGHTCULLING, CSTYPE_TILEDLIGHTCULLING_DEBUG, CSTYPE_RESOLVEMSAADEPTHSTENCIL, + CSTYPE_VOXELRADIANCE, CSTYPE_LAST }; diff --git a/WickedEngine/wiGraphicsDescriptors.h b/WickedEngine/wiGraphicsDescriptors.h index b92b0a845..1a2c0c409 100644 --- a/WickedEngine/wiGraphicsDescriptors.h +++ b/WickedEngine/wiGraphicsDescriptors.h @@ -355,6 +355,17 @@ namespace wiGraphicsTypes UINT Count; UINT Quality; }; + struct Texture1DDesc + { + UINT Width; + UINT MipLevels; + UINT ArraySize; + FORMAT Format; + USAGE Usage; + UINT BindFlags; + UINT CPUAccessFlags; + UINT MiscFlags; + }; struct Texture2DDesc { UINT Width; @@ -368,6 +379,18 @@ namespace wiGraphicsTypes UINT CPUAccessFlags; UINT MiscFlags; }; + struct Texture3DDesc + { + UINT Width; + UINT Height; + UINT Depth; + UINT MipLevels; + FORMAT Format; + USAGE Usage; + UINT BindFlags; + UINT CPUAccessFlags; + UINT MiscFlags; + }; struct SamplerDesc { FILTER Filter; diff --git a/WickedEngine/wiGraphicsDevice.h b/WickedEngine/wiGraphicsDevice.h index 1eada192b..49c1d61c4 100644 --- a/WickedEngine/wiGraphicsDevice.h +++ b/WickedEngine/wiGraphicsDevice.h @@ -23,12 +23,9 @@ namespace wiGraphicsTypes GraphicsDevice() :FRAMECOUNT(0), VSYNC(true), SCREENWIDTH(0), SCREENHEIGHT(0), FULLSCREEN(false) {} virtual HRESULT CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *ppBuffer) = 0; - virtual HRESULT CreateTexture1D() = 0; + virtual HRESULT CreateTexture1D(const Texture1DDesc* pDesc, const SubresourceData *pInitialData, Texture1D **ppTexture1D) = 0; virtual HRESULT CreateTexture2D(const Texture2DDesc* pDesc, const SubresourceData *pInitialData, Texture2D **ppTexture2D) = 0; - virtual HRESULT CreateTexture3D() = 0; - virtual HRESULT CreateShaderResourceView(Texture2D* pTexture) = 0; - virtual HRESULT CreateRenderTargetView(Texture2D* pTexture) = 0; - virtual HRESULT CreateDepthStencilView(Texture2D* pTexture) = 0; + virtual HRESULT CreateTexture3D(const Texture3DDesc* pDesc, const SubresourceData *pInitialData, Texture3D **ppTexture3D) = 0; virtual HRESULT CreateInputLayout(const VertexLayoutDesc *pInputElementDescs, UINT NumElements, const void *pShaderBytecodeWithInputSignature, SIZE_T BytecodeLength, VertexLayout *pInputLayout) = 0; virtual HRESULT CreateVertexShader(const void *pShaderBytecode, SIZE_T BytecodeLength, ClassLinkage* pClassLinkage, VertexShader *pVertexShader) = 0; @@ -82,8 +79,8 @@ namespace wiGraphicsTypes ///////////////Thread-sensitive//////////////////////// virtual void BindViewports(UINT NumViewports, const ViewPort *pViewports, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; - virtual void BindRenderTargets(UINT NumViews, Texture2D* const *ppRenderTargetViews, Texture2D* depthStencilTexture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) = 0; - virtual void ClearRenderTarget(Texture2D* pTexture, const FLOAT ColorRGBA[4], GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) = 0; + virtual void BindRenderTargets(UINT NumViews, Texture* const *ppRenderTargets, Texture2D* depthStencilTexture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) = 0; + virtual void ClearRenderTarget(Texture* pTexture, const FLOAT ColorRGBA[4], GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) = 0; virtual void ClearDepthStencil(Texture2D* pTexture, UINT ClearFlags, FLOAT Depth, UINT8 Stencil, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) = 0; virtual void BindResourcePS(const GPUResource* resource, int slot, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual void BindResourceVS(const GPUResource* resource, int slot, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 7e6a4a119..8b1d665aa 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -820,6 +820,20 @@ inline DXGI_FORMAT _ConvertFormat(FORMAT value) return DXGI_FORMAT_UNKNOWN; } +inline D3D11_TEXTURE1D_DESC _ConvertTexture1DDesc(const Texture1DDesc* pDesc) +{ + D3D11_TEXTURE1D_DESC desc; + desc.Width = pDesc->Width; + desc.MipLevels = pDesc->MipLevels; + desc.ArraySize = pDesc->ArraySize; + desc.Format = _ConvertFormat(pDesc->Format); + desc.Usage = _ConvertUsage(pDesc->Usage); + desc.BindFlags = _ParseBindFlags(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); + + return desc; +} inline D3D11_TEXTURE2D_DESC _ConvertTexture2DDesc(const Texture2DDesc* pDesc) { D3D11_TEXTURE2D_DESC desc; @@ -837,6 +851,21 @@ inline D3D11_TEXTURE2D_DESC _ConvertTexture2DDesc(const Texture2DDesc* pDesc) return desc; } +inline D3D11_TEXTURE3D_DESC _ConvertTexture3DDesc(const Texture3DDesc* pDesc) +{ + D3D11_TEXTURE3D_DESC desc; + desc.Width = pDesc->Width; + desc.Height = pDesc->Height; + desc.Depth = pDesc->Depth; + desc.MipLevels = pDesc->MipLevels; + desc.Format = _ConvertFormat(pDesc->Format); + desc.Usage = _ConvertUsage(pDesc->Usage); + desc.BindFlags = _ParseBindFlags(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); + + return desc; +} inline D3D11_SUBRESOURCE_DATA* _ConvertSubresourceData(const SubresourceData* pInitialData) { if (pInitialData == nullptr) @@ -1289,23 +1318,52 @@ inline USAGE _ConvertUsage_Inv(D3D11_USAGE value) return USAGE_DEFAULT; } -inline Texture2DDesc _ConvertTexture2DDesc_Inv(const D3D11_TEXTURE2D_DESC* pDesc) - { - Texture2DDesc desc; - desc.Width = pDesc->Width; - desc.Height = pDesc->Height; - desc.MipLevels = pDesc->MipLevels; - desc.ArraySize = pDesc->ArraySize; - desc.Format = _ConvertFormat_Inv(pDesc->Format); - desc.SampleDesc.Count = pDesc->SampleDesc.Count; - desc.SampleDesc.Quality = pDesc->SampleDesc.Quality; - desc.Usage = _ConvertUsage_Inv(pDesc->Usage); - desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); - desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); - desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); +inline Texture1DDesc _ConvertTexture1DDesc_Inv(const D3D11_TEXTURE1D_DESC* pDesc) +{ + Texture1DDesc desc; + desc.Width = pDesc->Width; + desc.MipLevels = pDesc->MipLevels; + desc.ArraySize = pDesc->ArraySize; + desc.Format = _ConvertFormat_Inv(pDesc->Format); + desc.Usage = _ConvertUsage_Inv(pDesc->Usage); + desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); - return desc; - } + return desc; +} +inline Texture2DDesc _ConvertTexture2DDesc_Inv(const D3D11_TEXTURE2D_DESC* pDesc) +{ + Texture2DDesc desc; + desc.Width = pDesc->Width; + desc.Height = pDesc->Height; + desc.MipLevels = pDesc->MipLevels; + desc.ArraySize = pDesc->ArraySize; + desc.Format = _ConvertFormat_Inv(pDesc->Format); + desc.SampleDesc.Count = pDesc->SampleDesc.Count; + desc.SampleDesc.Quality = pDesc->SampleDesc.Quality; + desc.Usage = _ConvertUsage_Inv(pDesc->Usage); + desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); + + return desc; +} +inline Texture3DDesc _ConvertTexture3DDesc_Inv(const D3D11_TEXTURE3D_DESC* pDesc) +{ + Texture3DDesc desc; + desc.Width = pDesc->Width; + desc.Height = pDesc->Height; + desc.Depth = pDesc->Depth; + desc.MipLevels = pDesc->MipLevels; + desc.Format = _ConvertFormat_Inv(pDesc->Format); + desc.Usage = _ConvertUsage_Inv(pDesc->Usage); + desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); + + return desc; +} // Local Helpers: @@ -1595,10 +1653,41 @@ HRESULT GraphicsDevice_DX11::CreateBuffer(const GPUBufferDesc *pDesc, const Subr return hr; } -HRESULT GraphicsDevice_DX11::CreateTexture1D() +HRESULT GraphicsDevice_DX11::CreateTexture1D(const Texture1DDesc* pDesc, const SubresourceData *pInitialData, Texture1D **ppTexture1D) { - // TODO - return E_FAIL; + if ((*ppTexture1D) == nullptr) + { + (*ppTexture1D) = new Texture1D; + } + (*ppTexture1D)->desc = *pDesc; + + D3D11_TEXTURE1D_DESC desc = _ConvertTexture1DDesc(&(*ppTexture1D)->desc); + D3D11_SUBRESOURCE_DATA* data = _ConvertSubresourceData(pInitialData); + + HRESULT hr = S_OK; + + hr = device->CreateTexture1D(&desc, data, &((*ppTexture1D)->texture1D_DX11)); + assert(SUCCEEDED(hr) && "Texture1D creation failed!"); + if (FAILED(hr)) + return hr; + + CreateShaderResourceView(*ppTexture1D); + + if (desc.BindFlags & D3D11_BIND_UNORDERED_ACCESS) + { + assert((*ppTexture1D)->independentRTVArraySlices == false && "TextureArray UAV not implemented!"); + + D3D11_UNORDERED_ACCESS_VIEW_DESC uav_desc; + ZeroMemory(&uav_desc, sizeof(uav_desc)); + uav_desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE1D; + uav_desc.Texture2D.MipSlice = 0; + + hr = device->CreateUnorderedAccessView((*ppTexture1D)->texture1D_DX11, &uav_desc, &(*ppTexture1D)->unorderedAccessView_DX11); + + assert(SUCCEEDED(hr) && "UnorderedAccessView of the Texture1D could not be created!"); + } + + return hr; } HRESULT GraphicsDevice_DX11::CreateTexture2D(const Texture2DDesc* pDesc, const SubresourceData *pInitialData, Texture2D **ppTexture2D) { @@ -1637,6 +1726,8 @@ HRESULT GraphicsDevice_DX11::CreateTexture2D(const Texture2DDesc* pDesc, const S if (desc.BindFlags & D3D11_BIND_UNORDERED_ACCESS) { + assert((*ppTexture2D)->independentRTVArraySlices == false && "TextureArray UAV not implemented!"); + D3D11_UNORDERED_ACCESS_VIEW_DESC uav_desc; ZeroMemory(&uav_desc, sizeof(uav_desc)); uav_desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; @@ -1649,10 +1740,81 @@ HRESULT GraphicsDevice_DX11::CreateTexture2D(const Texture2DDesc* pDesc, const S return hr; } -HRESULT GraphicsDevice_DX11::CreateTexture3D() +HRESULT GraphicsDevice_DX11::CreateTexture3D(const Texture3DDesc* pDesc, const SubresourceData *pInitialData, Texture3D **ppTexture3D) { - // TODO - return E_FAIL; + if ((*ppTexture3D) == nullptr) + { + (*ppTexture3D) = new Texture3D; + } + (*ppTexture3D)->desc = *pDesc; + + D3D11_TEXTURE3D_DESC desc = _ConvertTexture3DDesc(&(*ppTexture3D)->desc); + D3D11_SUBRESOURCE_DATA* data = _ConvertSubresourceData(pInitialData); + + HRESULT hr = S_OK; + + hr = device->CreateTexture3D(&desc, data, &((*ppTexture3D)->texture3D_DX11)); + assert(SUCCEEDED(hr) && "Texture3D creation failed!"); + if (FAILED(hr)) + return hr; + + CreateShaderResourceView(*ppTexture3D); + CreateRenderTargetView(*ppTexture3D); + + + if (desc.BindFlags & D3D11_BIND_UNORDERED_ACCESS) + { + D3D11_UNORDERED_ACCESS_VIEW_DESC uav_desc; + ZeroMemory(&uav_desc, sizeof(uav_desc)); + uav_desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE3D; + uav_desc.Texture3D.MipSlice = 0; + uav_desc.Texture3D.FirstWSlice = 0; + uav_desc.Texture3D.WSize = desc.Depth; + + hr = device->CreateUnorderedAccessView((*ppTexture3D)->texture3D_DX11, &uav_desc, &(*ppTexture3D)->unorderedAccessView_DX11); + + assert(SUCCEEDED(hr) && "UnorderedAccessView of the Texture2D could not be created!"); + } + + return hr; +} +HRESULT GraphicsDevice_DX11::CreateShaderResourceView(Texture1D* pTexture) +{ + if (pTexture->shaderResourceView_DX11 != nullptr) + { + return E_FAIL; + } + + HRESULT hr = E_FAIL; + if (pTexture->desc.BindFlags & D3D11_BIND_SHADER_RESOURCE) + { + UINT arraySize = pTexture->desc.ArraySize; + + D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc; + ZeroMemory(&shaderResourceViewDesc, sizeof(shaderResourceViewDesc)); + shaderResourceViewDesc.Format = _ConvertFormat(pTexture->desc.Format); + + if (arraySize > 1) + { + shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; + shaderResourceViewDesc.Texture1DArray.FirstArraySlice = 0; + shaderResourceViewDesc.Texture1DArray.ArraySize = arraySize; + shaderResourceViewDesc.Texture1DArray.MostDetailedMip = 0; //from most detailed... + shaderResourceViewDesc.Texture1DArray.MipLevels = -1; //...to least detailed + } + else + { + shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; + shaderResourceViewDesc.Texture1D.MostDetailedMip = 0; //from most detailed... + shaderResourceViewDesc.Texture1D.MipLevels = -1; //...to least detailed + } + + hr = device->CreateShaderResourceView(pTexture->texture1D_DX11, &shaderResourceViewDesc, &pTexture->shaderResourceView_DX11); + + assert(SUCCEEDED(hr) && "ShaderResourceView Creation failed!"); + } + + return hr; } HRESULT GraphicsDevice_DX11::CreateShaderResourceView(Texture2D* pTexture) { @@ -1745,6 +1907,31 @@ HRESULT GraphicsDevice_DX11::CreateShaderResourceView(Texture2D* pTexture) return hr; } +HRESULT GraphicsDevice_DX11::CreateShaderResourceView(Texture3D* pTexture) +{ + if (pTexture->shaderResourceView_DX11 != nullptr) + { + return E_FAIL; + } + + HRESULT hr = E_FAIL; + if (pTexture->desc.BindFlags & D3D11_BIND_SHADER_RESOURCE) + { + + D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc; + ZeroMemory(&shaderResourceViewDesc, sizeof(shaderResourceViewDesc)); + shaderResourceViewDesc.Format = _ConvertFormat(pTexture->desc.Format); + shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + shaderResourceViewDesc.Texture3D.MostDetailedMip = 0; //from most detailed... + shaderResourceViewDesc.Texture3D.MipLevels = -1; //...to least detailed + + hr = device->CreateShaderResourceView(pTexture->texture3D_DX11, &shaderResourceViewDesc, &pTexture->shaderResourceView_DX11); + + assert(SUCCEEDED(hr) && "ShaderResourceView Creation failed!"); + } + + return hr; +} HRESULT GraphicsDevice_DX11::CreateRenderTargetView(Texture2D* pTexture) { if (!pTexture->renderTargetViews_DX11.empty()) @@ -1876,6 +2063,50 @@ HRESULT GraphicsDevice_DX11::CreateRenderTargetView(Texture2D* pTexture) return hr; } +HRESULT GraphicsDevice_DX11::CreateRenderTargetView(Texture3D* pTexture) +{ + if (!pTexture->renderTargetViews_DX11.empty()) + { + return E_FAIL; + } + + HRESULT hr = E_FAIL; + if (pTexture->desc.BindFlags & D3D11_BIND_RENDER_TARGET) + { + + D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc; + ZeroMemory(&renderTargetViewDesc, sizeof(renderTargetViewDesc)); + renderTargetViewDesc.Format = _ConvertFormat(pTexture->desc.Format); + + if (pTexture->independentRTVArraySlices) + { + for (UINT i = 0; i < pTexture->GetDesc().Depth; ++i) + { + renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; + renderTargetViewDesc.Texture3D.MipSlice = 0; + renderTargetViewDesc.Texture3D.FirstWSlice = i; + renderTargetViewDesc.Texture3D.WSize = 1; + + pTexture->renderTargetViews_DX11.push_back(nullptr); + hr = device->CreateRenderTargetView(pTexture->texture3D_DX11, &renderTargetViewDesc, &pTexture->renderTargetViews_DX11[i]); + } + } + else + { + renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; + renderTargetViewDesc.Texture3D.MipSlice = 0; + renderTargetViewDesc.Texture3D.FirstWSlice = 0; + renderTargetViewDesc.Texture3D.WSize = pTexture->GetDesc().Depth; + + pTexture->renderTargetViews_DX11.push_back(nullptr); + hr = device->CreateRenderTargetView(pTexture->texture3D_DX11, &renderTargetViewDesc, &pTexture->renderTargetViews_DX11[0]); + } + + assert(SUCCEEDED(hr) && "RenderTargetView Creation failed!"); + } + + return hr; +} HRESULT GraphicsDevice_DX11::CreateDepthStencilView(Texture2D* pTexture) { if (!pTexture->depthStencilViews_DX11.empty()) @@ -2279,20 +2510,20 @@ void GraphicsDevice_DX11::BindViewports(UINT NumViewports, const ViewPort *pView deviceContexts[threadID]->RSSetViewports(NumViewports, pd3dViewPorts); SAFE_DELETE_ARRAY(pd3dViewPorts); } -void GraphicsDevice_DX11::BindRenderTargets(UINT NumViews, Texture2D* const *ppRenderTargetViews, Texture2D* depthStencilTexture, GRAPHICSTHREAD threadID, UINT arrayIndex) +void GraphicsDevice_DX11::BindRenderTargets(UINT NumViews, Texture* const *ppRenderTargets, Texture2D* depthStencilTexture, GRAPHICSTHREAD threadID, UINT arrayIndex) { ID3D11RenderTargetView* renderTargetViews[8]; ZeroMemory(renderTargetViews, sizeof(renderTargetViews)); for (UINT i = 0; i < min(NumViews, 8); ++i) { - assert(ppRenderTargetViews[i]->renderTargetViews_DX11.size() > arrayIndex && "Invalid rendertarget arrayIndex!"); - renderTargetViews[i] = ppRenderTargetViews[i]->renderTargetViews_DX11[arrayIndex]; + assert(ppRenderTargets[i]->renderTargetViews_DX11.size() > arrayIndex && "Invalid rendertarget arrayIndex!"); + renderTargetViews[i] = ppRenderTargets[i]->renderTargetViews_DX11[arrayIndex]; } assert(depthStencilTexture == nullptr || depthStencilTexture->depthStencilViews_DX11.size() > arrayIndex && "Invalid depthstencil arrayIndex!"); ID3D11DepthStencilView* depthStencilView = (depthStencilTexture == nullptr ? nullptr : depthStencilTexture->depthStencilViews_DX11[arrayIndex]); deviceContexts[threadID]->OMSetRenderTargets(NumViews, renderTargetViews, depthStencilView); } -void GraphicsDevice_DX11::ClearRenderTarget(Texture2D* pTexture, const FLOAT ColorRGBA[4], GRAPHICSTHREAD threadID, UINT arrayIndex) +void GraphicsDevice_DX11::ClearRenderTarget(Texture* pTexture, const FLOAT ColorRGBA[4], GRAPHICSTHREAD threadID, UINT arrayIndex) { assert(pTexture->renderTargetViews_DX11.size() > arrayIndex && "Invalid rendertarget arrayIndex!"); deviceContexts[threadID]->ClearRenderTargetView(pTexture->renderTargetViews_DX11[arrayIndex], ColorRGBA); diff --git a/WickedEngine/wiGraphicsDevice_DX11.h b/WickedEngine/wiGraphicsDevice_DX11.h index c5030e650..672cf0ee2 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.h +++ b/WickedEngine/wiGraphicsDevice_DX11.h @@ -38,12 +38,9 @@ namespace wiGraphicsTypes ~GraphicsDevice_DX11(); virtual HRESULT CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *ppBuffer) override; - virtual HRESULT CreateTexture1D() override; + virtual HRESULT CreateTexture1D(const Texture1DDesc* pDesc, const SubresourceData *pInitialData, Texture1D **ppTexture1D) override; virtual HRESULT CreateTexture2D(const Texture2DDesc* pDesc, const SubresourceData *pInitialData, Texture2D **ppTexture2D) override; - virtual HRESULT CreateTexture3D() override; - virtual HRESULT CreateShaderResourceView(Texture2D* pTexture) override; - virtual HRESULT CreateRenderTargetView(Texture2D* pTexture) override; - virtual HRESULT CreateDepthStencilView(Texture2D* pTexture) override; + virtual HRESULT CreateTexture3D(const Texture3DDesc* pDesc, const SubresourceData *pInitialData, Texture3D **ppTexture3D) override; virtual HRESULT CreateInputLayout(const VertexLayoutDesc *pInputElementDescs, UINT NumElements, const void *pShaderBytecodeWithInputSignature, SIZE_T BytecodeLength, VertexLayout *pInputLayout) override; virtual HRESULT CreateVertexShader(const void *pShaderBytecode, SIZE_T BytecodeLength, ClassLinkage* pClassLinkage, VertexShader *pVertexShader) override; @@ -75,8 +72,8 @@ namespace wiGraphicsTypes ///////////////Thread-sensitive//////////////////////// virtual void BindViewports(UINT NumViewports, const ViewPort *pViewports, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; - virtual void BindRenderTargets(UINT NumViews, Texture2D* const *ppRenderTargetViews, Texture2D* depthStencilTexture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) override; - virtual void ClearRenderTarget(Texture2D* pTexture, const FLOAT ColorRGBA[4], GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) override; + virtual void BindRenderTargets(UINT NumViews, Texture* const *ppRenderTargets, Texture2D* depthStencilTexture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) override; + virtual void ClearRenderTarget(Texture* pTexture, const FLOAT ColorRGBA[4], GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) override; virtual void ClearDepthStencil(Texture2D* pTexture, UINT ClearFlags, FLOAT Depth, UINT8 Stencil, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE, UINT arrayIndex = 0) override; virtual void BindResourcePS(const GPUResource* resource, int slot, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; virtual void BindResourceVS(const GPUResource* resource, int slot, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; @@ -139,6 +136,14 @@ namespace wiGraphicsTypes virtual void EventBegin(const string& name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; virtual void EventEnd(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; virtual void SetMarker(const string& name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; + + private: + HRESULT CreateShaderResourceView(Texture1D* pTexture); + HRESULT CreateShaderResourceView(Texture2D* pTexture); + HRESULT CreateShaderResourceView(Texture3D* pTexture); + HRESULT CreateRenderTargetView(Texture2D* pTexture); + HRESULT CreateRenderTargetView(Texture3D* pTexture); + HRESULT CreateDepthStencilView(Texture2D* pTexture); }; } diff --git a/WickedEngine/wiGraphicsResource.cpp b/WickedEngine/wiGraphicsResource.cpp index 3a0e52795..b25fbed87 100644 --- a/WickedEngine/wiGraphicsResource.cpp +++ b/WickedEngine/wiGraphicsResource.cpp @@ -160,10 +160,6 @@ namespace wiGraphicsTypes { SAFE_RELEASE(x); } - for (auto& x : depthStencilViews_DX11) - { - SAFE_RELEASE(x); - } } void Texture::RequestIndepententRenderTargetArraySlices(bool value) { @@ -182,6 +178,15 @@ namespace wiGraphicsTypes return independentRTVCubemapFaces; } + Texture1D::Texture1D() :Texture() + { + SAFE_INIT(texture1D_DX11); + } + Texture1D::~Texture1D() + { + SAFE_RELEASE(texture1D_DX11); + } + Texture2D::Texture2D() :Texture() { SAFE_INIT(texture2D_DX11); @@ -189,6 +194,19 @@ namespace wiGraphicsTypes Texture2D::~Texture2D() { SAFE_RELEASE(texture2D_DX11); + for (auto& x : depthStencilViews_DX11) + { + SAFE_RELEASE(x); + } + } + + Texture3D::Texture3D() :Texture() + { + SAFE_INIT(texture3D_DX11); + } + Texture3D::~Texture3D() + { + SAFE_RELEASE(texture3D_DX11); } GPUQuery::GPUQuery() diff --git a/WickedEngine/wiGraphicsResource.h b/WickedEngine/wiGraphicsResource.h index 1eb1cc78a..353a0a755 100644 --- a/WickedEngine/wiGraphicsResource.h +++ b/WickedEngine/wiGraphicsResource.h @@ -21,7 +21,9 @@ interface ID3D11RasterizerState; interface ID3D11ClassLinkage; interface ID3D11RenderTargetView; interface ID3D11DepthStencilView; +interface ID3D11Texture1D; interface ID3D11Texture2D; +interface ID3D11Texture3D; interface ID3D11Query; interface ID3D11Predicate; @@ -230,7 +232,6 @@ namespace wiGraphicsTypes friend class GraphicsDevice_DX11; private: vector renderTargetViews_DX11; - vector depthStencilViews_DX11; bool independentRTVArraySlices; bool independentRTVCubemapFaces; public: @@ -245,10 +246,24 @@ namespace wiGraphicsTypes bool IsIndepententRenderTargetCubemapFaces(); }; + class Texture1D : public Texture + { + friend class GraphicsDevice_DX11; + private: + ID3D11Texture1D* texture1D_DX11; + Texture1DDesc desc; + public: + Texture1D(); + virtual ~Texture1D(); + + Texture1DDesc GetDesc() const { return desc; } + }; + class Texture2D : public Texture { friend class GraphicsDevice_DX11; private: + vector depthStencilViews_DX11; ID3D11Texture2D* texture2D_DX11; Texture2DDesc desc; public: @@ -258,6 +273,19 @@ namespace wiGraphicsTypes Texture2DDesc GetDesc() const { return desc; } }; + class Texture3D : public Texture + { + friend class GraphicsDevice_DX11; + private: + ID3D11Texture3D* texture3D_DX11; + Texture3DDesc desc; + public: + Texture3D(); + virtual ~Texture3D(); + + Texture3DDesc GetDesc() const { return desc; } + }; + @@ -266,7 +294,7 @@ namespace wiGraphicsTypes friend class GraphicsDevice_DX11; private: vector resource_DX11; - vector active; + vector active; GPUQueryDesc desc; int async_frameshift; public: diff --git a/WickedEngine/wiProfiler.cpp b/WickedEngine/wiProfiler.cpp index e48d597f5..6c212b1df 100644 --- a/WickedEngine/wiProfiler.cpp +++ b/WickedEngine/wiProfiler.cpp @@ -10,13 +10,16 @@ void wiProfiler::BeginFrame() if (!ENABLED) return; + wiRenderer::GetDevice()->LOCK(); wiRenderer::GetDevice()->QueryBegin(&disjoint, GRAPHICSTHREAD_IMMEDIATE); + wiRenderer::GetDevice()->UNLOCK(); } void wiProfiler::EndFrame() { if (!ENABLED) return; + wiRenderer::GetDevice()->LOCK(); wiRenderer::GetDevice()->QueryEnd(&disjoint, GRAPHICSTHREAD_IMMEDIATE); while(!wiRenderer::GetDevice()->QueryRead(&disjoint, GRAPHICSTHREAD_IMMEDIATE)); @@ -43,6 +46,7 @@ void wiProfiler::EndFrame() } } } + wiRenderer::GetDevice()->UNLOCK(); } void wiProfiler::BeginRange(const std::string& name, PROFILER_DOMAIN domain, GRAPHICSTHREAD threadID) diff --git a/WickedEngine/wiRenderTarget.cpp b/WickedEngine/wiRenderTarget.cpp index 48c9f9c1e..cef7077bf 100644 --- a/WickedEngine/wiRenderTarget.cpp +++ b/WickedEngine/wiRenderTarget.cpp @@ -183,13 +183,13 @@ void wiRenderTarget::Deactivate(GRAPHICSTHREAD threadID) void wiRenderTarget::Set(GRAPHICSTHREAD threadID, bool disableColor) { wiRenderer::GetDevice()->BindViewports(1, &viewPort, threadID); - wiRenderer::GetDevice()->BindRenderTargets(disableColor ? 0 : numViews, disableColor ? nullptr : renderTargets.data(), (depth ? depth->GetTexture() : nullptr), threadID); + wiRenderer::GetDevice()->BindRenderTargets(disableColor ? 0 : numViews, disableColor ? nullptr : (Texture**)renderTargets.data(), (depth ? depth->GetTexture() : nullptr), threadID); resolvedMSAAUptodate = false; } void wiRenderTarget::Set(GRAPHICSTHREAD threadID, wiDepthTarget* getDepth, bool disableColor) { wiRenderer::GetDevice()->BindViewports(1, &viewPort, threadID); - wiRenderer::GetDevice()->BindRenderTargets(disableColor ? 0 : numViews, disableColor ? nullptr : renderTargets.data(), (getDepth ? getDepth->GetTexture() : nullptr), threadID); + wiRenderer::GetDevice()->BindRenderTargets(disableColor ? 0 : numViews, disableColor ? nullptr : (Texture**)renderTargets.data(), (getDepth ? getDepth->GetTexture() : nullptr), threadID); resolvedMSAAUptodate = false; } diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 906c85a56..b1486ede2 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -55,6 +55,7 @@ Texture2D* wiRenderer::enviroMap,*wiRenderer::colorGrading; float wiRenderer::GameSpeed=1,wiRenderer::overrideGameSpeed=1; bool wiRenderer::debugLightCulling = false; bool wiRenderer::occlusionCulling = true; +bool wiRenderer::voxelRadiance = false; int wiRenderer::visibleCount; wiRenderTarget wiRenderer::normalMapRT, wiRenderer::imagesRT, wiRenderer::imagesRTAdd; Camera *wiRenderer::cam = nullptr, *wiRenderer::refCam = nullptr, *wiRenderer::prevFrameCam = nullptr; @@ -770,6 +771,7 @@ void wiRenderer::LoadShaders() computeShaders[CSTYPE_TILEDLIGHTCULLING] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "lightCullingCS.cso", wiResourceManager::COMPUTESHADER)); computeShaders[CSTYPE_TILEDLIGHTCULLING_DEBUG] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "lightCullingCS_DEBUG.cso", wiResourceManager::COMPUTESHADER)); computeShaders[CSTYPE_RESOLVEMSAADEPTHSTENCIL] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "resolveMSAADepthStencilCS.cso", wiResourceManager::COMPUTESHADER)); + computeShaders[CSTYPE_VOXELRADIANCE] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelRadianceCS.cso", wiResourceManager::COMPUTESHADER)); hullShaders[HSTYPE_OBJECT] = static_cast(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectHS.cso", wiResourceManager::HULLSHADER)); @@ -1015,7 +1017,6 @@ void wiRenderer::SetUpStates() dsd.BackFace.StencilPassOp = STENCIL_OP_REPLACE; dsd.BackFace.StencilFailOp = STENCIL_OP_KEEP; dsd.BackFace.StencilDepthFailOp = STENCIL_OP_KEEP; - // Create the depth stencil state. GetDevice()->CreateDepthStencilState(&dsd, depthStencils[DSSTYPE_DEFAULT]); @@ -1033,7 +1034,6 @@ void wiRenderer::SetUpStates() dsd.BackFace.StencilPassOp = STENCIL_OP_KEEP; dsd.BackFace.StencilFailOp = STENCIL_OP_KEEP; dsd.BackFace.StencilDepthFailOp = STENCIL_OP_KEEP; - // Create the depth stencil state. GetDevice()->CreateDepthStencilState(&dsd, depthStencils[DSSTYPE_DIRLIGHT]); @@ -1051,12 +1051,12 @@ void wiRenderer::SetUpStates() dsd.BackFace.StencilPassOp = STENCIL_OP_KEEP; dsd.BackFace.StencilFailOp = STENCIL_OP_KEEP; dsd.BackFace.StencilDepthFailOp = STENCIL_OP_KEEP; - // Create the depth stencil state. GetDevice()->CreateDepthStencilState(&dsd, depthStencils[DSSTYPE_LIGHT]); dsd.DepthEnable = false; dsd.StencilEnable = true; + dsd.DepthFunc = COMPARISON_LESS_EQUAL; dsd.StencilReadMask = 0xFF; dsd.StencilWriteMask = 0xFF; dsd.FrontFace.StencilFunc = COMPARISON_EQUAL; @@ -1551,6 +1551,12 @@ void wiRenderer::UpdatePerFrameData() } void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID) { + //if(GetDevice()->GetFrameCount() % 30 == 0) + { + VoxelizeScene(threadID); + ComputeVoxelRadiance(threadID); + } + UpdateWorldCB(threadID); // only commits when parameters are changed UpdateFrameCB(threadID); @@ -1747,7 +1753,7 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID) lightArray[lightCounter].coneAngleCos = cosf(lightArray[lightCounter].coneAngle); lightArray[lightCounter].directionWS = l->GetDirection(); XMStoreFloat3(&lightArray[lightCounter].directionVS, XMVector3TransformNormal(XMLoadFloat3(&lightArray[lightCounter].directionWS), viewMatrix)); - if (l->shadow && l->shadowMap_index >= 0) + if (l->shadow && l->shadowMap_index >= 0 && !l->shadowCam_spotLight.empty()) { lightArray[lightCounter].shadowMatrix[0] = l->shadowCam_spotLight[0].getVP(); } @@ -1783,7 +1789,6 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID) { x->UpdateRenderData(threadID); } - } void wiRenderer::OcclusionCulling_Render(GRAPHICSTHREAD threadID) { @@ -3834,6 +3839,100 @@ void wiRenderer::RefreshEnvProbes(GRAPHICSTHREAD threadID) GetDevice()->EventEnd(); } +static float voxelRadianceScale = 0; // 0 is disabled +void wiRenderer::VoxelizeScene(GRAPHICSTHREAD threadID) +{ + if (!GetVoxelRadianceEnabled()) + { + voxelRadianceScale = 0; + return; + } + + GetDevice()->EventBegin("Voxelize Scene", threadID); + wiProfiler::GetInstance().BeginRange("Voxelize Scene", wiProfiler::DOMAIN_GPU, threadID); + + static const int res = 32; + static const float scale = 2.0f; + voxelRadianceScale = 1.0f / (res * scale); + if (textures[TEXTYPE_3D_VOXELSCENE] == nullptr) + { + Texture3DDesc desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Width = res; + desc.Height = res; + desc.Depth = res; + desc.MipLevels = 1; + desc.Format = FORMAT_R8G8B8A8_UNORM; + desc.BindFlags = BIND_RENDER_TARGET | BIND_SHADER_RESOURCE; + desc.Usage = USAGE_DEFAULT; + desc.CPUAccessFlags = 0; + 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)); + } + + CulledList culledObjects; + CulledCollection culledRenderer; + + AABB bbox; + XMFLOAT3 extents = XMFLOAT3(res * scale, res * scale, res * scale); + XMFLOAT3 center = XMFLOAT3(floorf(cam->translation.x), floorf(cam->translation.y), floorf(cam->translation.z)); + bbox.createFromHalfWidth(center, extents); + if (spTree != nullptr) + { + spTree->getVisible(bbox, culledObjects); + + for (Cullable* object : culledObjects) + { + culledRenderer[((Object*)object)->mesh].push_front((Object*)object); + } + + ViewPort VP; + VP.TopLeftX = 0; + VP.TopLeftY = 0; + VP.Width = (float)res; + VP.Height = (float)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) + { + 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 * scale * 2, -extents.z + (i + 1) * scale * 2); + XMStoreFloat4x4(&cam->Projection, projection); + XMStoreFloat4x4(&cam->VP, XMMatrixMultiply(view, projection)); + + UpdateCameraCB(cam, threadID); + + RenderMeshes(cam->translation, culledRenderer, SHADERTYPE_TEXTURE, RENDERTYPE_OPAQUE, threadID); + } + + + *cam = savedCam; + UpdateCameraCB(cam, threadID); + } + + wiProfiler::GetInstance().EndRange(threadID); + GetDevice()->EventEnd(); +} + void wiRenderer::ComputeTiledLightCulling(GRAPHICSTHREAD threadID) { wiProfiler::GetInstance().BeginRange("Tiled Light Culling", wiProfiler::DOMAIN_GPU, threadID); @@ -4028,6 +4127,61 @@ void wiRenderer::ResolveMSAADepthBuffer(Texture2D* dst, Texture2D* src, GRAPHICS GetDevice()->EventEnd(); } +void wiRenderer::ComputeVoxelRadiance(GRAPHICSTHREAD threadID) +{ + if (!GetVoxelRadianceEnabled()) + { + return; + } + + if (textures[TEXTYPE_3D_VOXELSCENE] == nullptr) + { + assert(0); + return; + } + + GetDevice()->EventBegin("Compute Voxel Radiance", threadID); + wiProfiler::GetInstance().BeginRange("Compute Voxel Radiance", wiProfiler::DOMAIN_GPU, threadID); + + + if (textures[TEXTYPE_3D_VOXELRADIANCE] == nullptr) + { + Texture3DDesc desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Width = ((Texture3D*)textures[TEXTYPE_3D_VOXELSCENE])->GetDesc().Width; + desc.Height = ((Texture3D*)textures[TEXTYPE_3D_VOXELSCENE])->GetDesc().Height; + desc.Depth = ((Texture3D*)textures[TEXTYPE_3D_VOXELSCENE])->GetDesc().Depth; + desc.MipLevels = 1; + desc.Format = FORMAT_R8G8B8A8_UNORM; + desc.BindFlags = BIND_UNORDERED_ACCESS | BIND_SHADER_RESOURCE; + desc.Usage = USAGE_DEFAULT; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + textures[TEXTYPE_3D_VOXELRADIANCE] = new Texture3D; + HRESULT hr = GetDevice()->CreateTexture3D(&desc, nullptr, (Texture3D**)&textures[TEXTYPE_3D_VOXELRADIANCE]); + assert(SUCCEEDED(hr)); + } + + GetDevice()->BindRenderTargets(0, nullptr, nullptr, threadID); + GetDevice()->BindResourceCS(textures[TEXTYPE_3D_VOXELSCENE], 0, threadID); + GetDevice()->BindUnorderedAccessResourceCS(textures[TEXTYPE_3D_VOXELRADIANCE], 0, threadID); + + Texture3DDesc desc = ((Texture3D*)textures[TEXTYPE_3D_VOXELRADIANCE])->GetDesc(); + + GetDevice()->BindCS(computeShaders[CSTYPE_VOXELRADIANCE], threadID); + GetDevice()->Dispatch((UINT)ceilf(desc.Width / 4.f), (UINT)ceilf(desc.Height / 4.f), (UINT)ceilf(desc.Depth / 4.f), threadID); + GetDevice()->BindCS(nullptr, threadID); + + + GetDevice()->UnBindResources(0, 1, threadID); + GetDevice()->UnBindUnorderedAccessResources(0, 1, threadID); + + GetDevice()->BindResourcePS(textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELRADIANCE, threadID); + + wiProfiler::GetInstance().EndRange(threadID); + GetDevice()->EventEnd(); +} void wiRenderer::ManageDecalAtlas(GRAPHICSTHREAD threadID) { @@ -4117,6 +4271,7 @@ void wiRenderer::UpdateWorldCB(GRAPHICSTHREAD threadID) value.mHorizon = world.horizon; value.mZenith = world.zenith; value.mScreenWidthHeight = XMFLOAT2((float)GetDevice()->GetScreenWidth(), (float)GetDevice()->GetScreenHeight()); + value.mVoxelRadianceScale = voxelRadianceScale; if (memcmp(&prevcb[threadID], &value, sizeof(WorldCB)) != 0) { @@ -4132,7 +4287,7 @@ void wiRenderer::UpdateFrameCB(GRAPHICSTHREAD threadID) cb.mWindTime = wind.time; cb.mWindRandomness = wind.randomness; cb.mWindWaveSize = wind.waveSize; - cb.mWindDirection = wind.direction; + cb.mWindDirection = wind.direction; cb.mSunLightArrayIndex = GetSunArrayIndex(); auto camera = getCamera(); @@ -4764,7 +4919,6 @@ void wiRenderer::CreateImpostor(Mesh* mesh) const XMFLOAT3 extents = bbox.getHalfWidth(); if (!mesh->impostorTarget.IsInitialized()) { - // TODO: Validate MRT format mismatch??? (Seems to work on Nvidia GT525M) mesh->impostorTarget.Initialize(res * 6, res, true, FORMAT_R8G8B8A8_UNORM, 0); mesh->impostorTarget.Add(FORMAT_R8G8B8A8_UNORM); // normal mesh->impostorTarget.Add(FORMAT_R8_UNORM); // roughness diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index eadbf5086..a05434f28 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -91,7 +91,7 @@ public: XMFLOAT3 mAmbient; float pad2; XMFLOAT3 mFog; float pad3; XMFLOAT2 mScreenWidthHeight; - float pad4; + float mVoxelRadianceScale; float pad5; CB_SETBINDSLOT(CBSLOT_RENDERER_WORLD) @@ -293,6 +293,7 @@ protected: static bool debugLightCulling; static bool occlusionCulling; + static bool voxelRadiance; public: static string SHADERPATH; @@ -333,6 +334,8 @@ public: static bool GetDebugLightCulling() { return debugLightCulling; } static void SetOcclusionCullingEnabled(bool enabled) { occlusionCulling = enabled; } static bool GetOcclusionCullingEnabled() { return occlusionCulling; } + static void SetVoxelRadianceEnabled(bool enabled) { voxelRadiance = enabled; } + static bool GetVoxelRadianceEnabled() { return voxelRadiance; } static bool IsRequestedReflectionRendering() { return requestReflectionRendering; } static wiGraphicsTypes::Texture2D* GetColorGrading(){return colorGrading;}; static void SetColorGrading(wiGraphicsTypes::Texture2D* tex){colorGrading=tex;}; @@ -411,9 +414,11 @@ public: static void DrawLensFlares(GRAPHICSTHREAD threadID); static void DrawDecals(Camera* camera, GRAPHICSTHREAD threadID); static void RefreshEnvProbes(GRAPHICSTHREAD threadID); + static void VoxelizeScene(GRAPHICSTHREAD threadID); static void ComputeTiledLightCulling(GRAPHICSTHREAD threadID); static void ResolveMSAADepthBuffer(wiGraphicsTypes::Texture2D* dst, wiGraphicsTypes::Texture2D* src, GRAPHICSTHREAD threadID); + static void ComputeVoxelRadiance(GRAPHICSTHREAD threadID); static void ManageDecalAtlas(GRAPHICSTHREAD threadID); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index b767e075a..b00fcaed9 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -5,9 +5,9 @@ namespace wiVersion // main engine core const int major = 0; // minor features, major updates - const int minor = 9; + const int minor = 10; // minor bug fixes, alterations, refactors, updates - const int revision = 70; + const int revision = 0; long GetVersion()