updated voxel radiance

This commit is contained in:
turanszkij
2017-03-05 16:23:58 +01:00
parent b27f4749fc
commit 089cedb3d3
8 changed files with 33 additions and 109 deletions
+1
View File
@@ -211,3 +211,4 @@ ModelManifest.xml
/WickedEngine/models/Sponza/temp
/WickedEngine/models/Sponza/nsight_profiler.cfg
/WickedEngine/models/Sponza/dirlight.wimf
/WickedEngine/models/Sponza/radiance.wimf
-10
View File
@@ -878,16 +878,6 @@
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Pixel</ShaderType>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Pixel</ShaderType>
</FxCompile>
<FxCompile Include="voxelRadianceCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">5.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">4.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">5.0</ShaderModel>
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">4.0</ShaderModel>
</FxCompile>
<FxCompile Include="voxelSceneCopyClearCS.hlsl">
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">5.0</ShaderModel>
@@ -513,9 +513,6 @@
<FxCompile Include="downsampleDepthBuffer4xPS.hlsl">
<Filter>PS</Filter>
</FxCompile>
<FxCompile Include="voxelRadianceCS.hlsl">
<Filter>CS</Filter>
</FxCompile>
<FxCompile Include="voxelVS.hlsl">
<Filter>VS</Filter>
</FxCompile>
+2 -2
View File
@@ -731,7 +731,7 @@ inline void VoxelRadiance(in float3 N, in float3 V, in float3 P, in float3 f0, i
float4 radiance = 0;
for (uint cone = 0; cone < numCones; ++cone)
{
float3 coneVec = normalize(N * 2 + CONES[cone]) / g_xWorld_VoxelRadianceDataRes * float3(1, -1, 1);
float3 coneVec = normalize(N + CONES[cone]) / g_xWorld_VoxelRadianceDataRes * float3(1, -1, 1);
float4 _radiance = 0;
float step = 0;
@@ -739,7 +739,7 @@ inline void VoxelRadiance(in float3 N, in float3 V, in float3 P, in float3 f0, i
for (uint i = 0; i < 8; ++i)
{
step++;
float mip = 0.8f * i;
float mip = 0.897f * i;
tc += coneVec;
+3 -2
View File
@@ -20,8 +20,9 @@ void main(float4 pos : SV_POSITION, float3 N : NORMAL, float2 tex : TEXCOORD, fl
float3 diffuse = 0;
uint lightCount = (uint)g_xColor.x;
for (uint i = 0; i < lightCount; ++i)
uint lightIndexStart = (uint)g_xColor.x;
uint lightCount = (uint)g_xColor.y;
for (uint i = lightIndexStart; i < lightCount; ++i)
{
LightArrayType light = LightArray[i];
-70
View File
@@ -1,70 +0,0 @@
#include "globals.hlsli"
#include "voxelHF.hlsli"
TEXTURE3D(input_emission, float4, 0);
//TEXTURE3D(input_normal, float4, 1);
RWTEXTURE3D(output, float4, 0);
groupshared float4 accumulation[4 * 4 * 4];
static const float3 SAMPLES[16] = {
float3(0.355512, -0.709318, -0.102371),
float3(0.534186, 0.71511, -0.115167),
float3(-0.87866, 0.157139, -0.115167),
float3(0.140679, -0.475516, -0.0639818),
float3(-0.0796121, 0.158842, -0.677075),
float3(-0.0759516, -0.101676, -0.483625),
float3(0.12493, -0.0223423, -0.483625),
float3(-0.0720074, 0.243395, -0.967251),
float3(-0.207641, 0.414286, 0.187755),
float3(-0.277332, -0.371262, 0.187755),
float3(0.63864, -0.114214, 0.262857),
float3(-0.184051, 0.622119, 0.262857),
float3(0.110007, -0.219486, 0.435574),
float3(0.235085, 0.314707, 0.696918),
float3(-0.290012, 0.0518654, 0.522688),
float3(0.0975089, -0.329594, 0.609803)
};
[numthreads(4, 4, 4)]
void main( uint3 DTid : SV_DispatchThreadID, uint GroupIndex : SV_GroupIndex )
{
float4 color = input_emission[DTid];
if (color.a > 0)
{
//float3 normal = input_normal[DTid];
output[DTid] = float4(color.rgb, 1);
}
else
{
output[DTid] = 0;
}
//float4 emittance = input_emittance[DTid];
//float3 normal = input_normal[DTid];
//output[DTid] = emittance;
////output[DTid] = float4(normal.rgb * 0.5f + 0.5f, emittance.a);
////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;
//// count++;
//// }
////}
////output[DTid] = occ / count;
}
-1
View File
@@ -226,7 +226,6 @@ enum CSTYPES
CSTYPE_TILEDLIGHTCULLING_DEBUG,
CSTYPE_RESOLVEMSAADEPTHSTENCIL,
CSTYPE_VOXELSCENECOPYCLEAR,
CSTYPE_VOXELRADIANCE,
CSTYPE_LAST
};
+27 -21
View File
@@ -781,7 +781,6 @@ void wiRenderer::LoadShaders()
computeShaders[CSTYPE_TILEDLIGHTCULLING_DEBUG] = static_cast<ComputeShader*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "lightCullingCS_DEBUG.cso", wiResourceManager::COMPUTESHADER));
computeShaders[CSTYPE_RESOLVEMSAADEPTHSTENCIL] = static_cast<ComputeShader*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "resolveMSAADepthStencilCS.cso", wiResourceManager::COMPUTESHADER));
computeShaders[CSTYPE_VOXELSCENECOPYCLEAR] = static_cast<ComputeShader*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelSceneCopyClearCS.cso", wiResourceManager::COMPUTESHADER));
computeShaders[CSTYPE_VOXELRADIANCE] = static_cast<ComputeShader*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "voxelRadianceCS.cso", wiResourceManager::COMPUTESHADER));
hullShaders[HSTYPE_OBJECT] = static_cast<HullShader*>(wiResourceManager::GetShaderManager()->add(SHADERPATH + "objectHS.cso", wiResourceManager::HULLSHADER));
@@ -1515,6 +1514,21 @@ void wiRenderer::UpdatePerFrameData()
{
Frustum frustum;
frustum.ConstructFrustum(min(camera->zFarP, GetScene().worldInfo.fogSEH.y), camera->Projection, camera->View);
for (Model* model : GetScene().models)
{
if (model->decals.empty())
continue;
for (Decal* decal : model->decals)
{
if ((decal->texture || decal->normal) && frustum.CheckBox(decal->bounds))
{
x.second.culledDecals.push_back(decal);
}
}
}
spTree_lights->getVisible(frustum, culling.culledLights, wiSPTree::SortType::SP_TREE_SORT_NONE);
if (GetVoxelRadianceEnabled())
@@ -1528,7 +1542,7 @@ void wiRenderer::UpdatePerFrameData()
// We wouldn't have to sort, but we need unique lights and that only works with sorted forward_list!
spTree_lights->Sort(camera->translation, culling.culledLights, wiSPTree::SortType::SP_TREE_SORT_BACK_TO_FRONT);
int i = 0;
int i = (int)x.second.culledDecals.size(); // Index the light array after the decals
int shadowCounter_2D = 0;
int shadowCounter_Cube = 0;
for (auto& c : culling.culledLights)
@@ -1588,20 +1602,6 @@ void wiRenderer::UpdatePerFrameData()
std::sort(culling.culledEmittedParticleSystems.begin(), culling.culledEmittedParticleSystems.end(), [&](const wiEmittedParticle* a, const wiEmittedParticle* b) {
return wiMath::DistanceSquared(camera->translation, a->bounding_box->getCenter()) > wiMath::DistanceSquared(camera->translation,b->bounding_box->getCenter());
});
for (Model* model : GetScene().models)
{
if (model->decals.empty())
continue;
for (Decal* decal : model->decals)
{
if ((decal->texture || decal->normal) && getCamera()->frustum.CheckBox(decal->bounds))
{
x.second.culledDecals.push_back(decal);
}
}
}
}
}
wiProfiler::GetInstance().EndRange(); // SPTree Culling
@@ -4012,8 +4012,12 @@ void wiRenderer::VoxelRadiance(GRAPHICSTHREAD threadID)
culledRenderer[((Object*)object)->mesh].push_front((Object*)object);
}
const FrameCulling& culling = frameCullings[getCamera()];
// Tell the voxelizer about the lights in the light array (exclude decals)
MiscCB cb;
cb.mColor.x = (float)frameCullings[getCamera()].culledLight_count;
cb.mColor.x = (float)culling.culledDecals.size();
cb.mColor.y = cb.mColor.x + (float)culling.culledLight_count;
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MISC], &cb, threadID);
ViewPort VP;
@@ -4033,21 +4037,23 @@ void wiRenderer::VoxelRadiance(GRAPHICSTHREAD threadID)
RenderMeshes(center, culledRenderer, SHADERTYPE_VOXELIZE, RENDERTYPE_OPAQUE, threadID);
// Copy the packed voxel scene data to a 3D texture, then delete the voxel scene data. The cone tracing will operate on the 3D texture
GetDevice()->BindRenderTargets(0, nullptr, nullptr, threadID);
GetDevice()->BindUnorderedAccessResourceCS(resourceBuffers[RBTYPE_VOXELSCENE], 0, threadID);
GetDevice()->BindUnorderedAccessResourceCS(textures[TEXTYPE_3D_VOXELRADIANCE], 1, threadID);
GetDevice()->BindCS(computeShaders[CSTYPE_VOXELSCENECOPYCLEAR], threadID);
GetDevice()->Dispatch((UINT)(voxelSceneData.res * voxelSceneData.res * voxelSceneData.res / 1024), 1, 1, threadID);
//GetDevice()->BindCS(computeShaders[CSTYPE_VOXELRADIANCE], threadID);
//GetDevice()->Dispatch((UINT)(voxelSceneData.res / 4), (UINT)(voxelSceneData.res / 4), (UINT)(voxelSceneData.res / 4), threadID);
GetDevice()->BindCS(nullptr, threadID);
GetDevice()->UnBindUnorderedAccessResources(0, 2, threadID);
// Pre-integrate the voxel texture by creating blurred mip levels:
GetDevice()->GenerateMips(textures[TEXTYPE_3D_VOXELRADIANCE], threadID);
}
GetDevice()->BindResourceVS(textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELRADIANCE, threadID);
if (voxelHelper)
{
GetDevice()->BindResourceVS(textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELRADIANCE, threadID);
}
GetDevice()->BindResourcePS(textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELRADIANCE, threadID);
wiProfiler::GetInstance().EndRange(threadID);