voxel gi secondary bounce fix

This commit is contained in:
Turanszki Janos
2021-07-12 17:32:26 +02:00
parent a8669498b5
commit 9d4c08ba44
7 changed files with 16 additions and 46 deletions
+3 -5
View File
@@ -18,7 +18,7 @@ struct PSInput
void main(PSInput input)
{
float3 N = input.N;
float3 N = normalize(input.N);
float3 P = input.P;
float3 diff = (P - g_xFrame_VoxelRadianceDataCenter) * g_xFrame_VoxelRadianceDataRes_rcp * g_xFrame_VoxelRadianceDataSize_rcp;
@@ -51,8 +51,6 @@ void main(PSInput input)
emissiveColor *= emissiveMap;
}
N = normalize(N);
#ifdef TERRAIN
color = 0;
@@ -318,8 +316,8 @@ void main(PSInput input)
color.rgb += emissiveColor.rgb * emissiveColor.a;
uint color_encoded = EncodeColor(color);
uint normal_encoded = EncodeNormal(N);
uint color_encoded = PackVoxelColor(color);
uint normal_encoded = pack_unitvector(N);
// output:
uint3 writecoord = floor(uvw * g_xFrame_VoxelRadianceDataRes);
@@ -2,6 +2,10 @@
#define WI_VOXEL_CONERACING_HF
#include "globals.hlsli"
#ifndef VOXEL_INITIAL_OFFSET
#define VOXEL_INITIAL_OFFSET 2
#endif // VOXEL_INITIAL_OFFSET
// voxels: 3D Texture containing voxel scene with direct diffuse lighting (or direct + secondary indirect bounce)
// P: world-space position of receiving surface
// N: world-space normal vector of receiving surface
@@ -15,7 +19,7 @@ inline float4 ConeTrace(in Texture3D<float4> voxels, in float3 P, in float3 N, i
// We need to offset the cone start position to avoid sampling its own voxel (self-occlusion):
// Unfortunately, it will result in disconnection between nearby surfaces :(
float dist = g_xFrame_VoxelRadianceDataSize; // offset by cone dir so that first sample of all cones are not the same
float3 startPos = P + N * g_xFrame_VoxelRadianceDataSize * 2 * SQRT2; // sqrt2 is diagonal voxel half-extent
float3 startPos = P + N * g_xFrame_VoxelRadianceDataSize * VOXEL_INITIAL_OFFSET * SQRT2; // sqrt2 is diagonal voxel half-extent
// We will break off the loop if the sampling distance is too far for performance reasons:
while (dist < g_xFrame_VoxelRadianceMaxDistance && alpha < 1)
+2 -33
View File
@@ -11,7 +11,7 @@ static const float __hdrRange = 10.0f;
// Encode HDR color to a 32 bit uint
// Alpha is 1 bit + 7 bit HDR remapping
uint EncodeColor(in float4 color)
uint PackVoxelColor(in float4 color)
{
// normalize color to LDR
float hdr = length(color.rgb);
@@ -30,7 +30,7 @@ uint EncodeColor(in float4 color)
}
// Decode 32 bit uint into HDR color with 1 bit alpha
float4 DecodeColor(in uint colorMask)
float4 UnpackVoxelColor(in uint colorMask)
{
float hdr;
float4 color;
@@ -50,35 +50,4 @@ float4 DecodeColor(in uint colorMask)
return color;
}
// Encode specified normal (normalized) into an unsigned integer. Each axis of
// the normal is encoded into 9 bits (1 for the sign/ 8 for the value).
uint EncodeNormal(in float3 normal)
{
int3 iNormal = int3(normalize(normal)*255.0f);
uint3 iNormalSigns;
iNormalSigns.x = (iNormal.x >> 5) & 0x04000000;
iNormalSigns.y = (iNormal.y >> 14) & 0x00020000;
iNormalSigns.z = (iNormal.z >> 23) & 0x00000100;
iNormal = abs(iNormal);
uint normalMask = iNormalSigns.x | (iNormal.x << 18) | iNormalSigns.y | (iNormal.y << 9) | iNormalSigns.z | iNormal.z;
return normalMask;
}
// Decode specified mask into a float3 normal (normalized).
float3 DecodeNormal(in uint normalMask)
{
int3 iNormal;
iNormal.x = (normalMask >> 18) & 0x000000ff;
iNormal.y = (normalMask >> 9) & 0x000000ff;
iNormal.z = normalMask & 0x000000ff;
int3 iNormalSigns;
iNormalSigns.x = (normalMask >> 25) & 0x00000002;
iNormalSigns.y = (normalMask >> 16) & 0x00000002;
iNormalSigns.z = (normalMask >> 7) & 0x00000002;
iNormalSigns = 1 - iNormalSigns;
float3 normal = float3(iNormal) / 255.0f;
normal *= iNormalSigns;
return normalize(normal);
}
#endif // WI_VOXEL_HF
@@ -1,3 +1,4 @@
#define VOXEL_INITIAL_OFFSET 4
#include "globals.hlsli"
#include "voxelHF.hlsli"
#include "voxelConeTracingHF.hlsli"
@@ -6,8 +7,6 @@ TEXTURE3D(input_emission, float4, 0);
STRUCTUREDBUFFER(input_voxelscene, VoxelType, 1);
RWTEXTURE3D(output, float4, 0);
[numthreads(8, 8, 8)]
void main( uint3 DTid : SV_DispatchThreadID )
{
@@ -17,7 +16,7 @@ void main( uint3 DTid : SV_DispatchThreadID )
if (emission.a > 0)
{
float3 N = DecodeNormal(input_voxelscene[DTid.x].normalMask);
float3 N = unpack_unitvector(input_voxelscene[DTid.x].normalMask);
float3 P = ((float3)writecoord + 0.5f) * g_xFrame_VoxelRadianceDataRes_rcp;
P = P * 2 - 1;
@@ -9,7 +9,7 @@ void main( uint3 DTid : SV_DispatchThreadID )
{
VoxelType voxel = input_output[DTid.x];
const float4 color = DecodeColor(voxel.colorMask);
const float4 color = UnpackVoxelColor(voxel.colorMask);
const uint3 writecoord = unflatten3D(DTid.x, g_xFrame_VoxelRadianceDataRes);
@@ -41,4 +41,4 @@ void main( uint3 DTid : SV_DispatchThreadID )
// delete emission data, but keep normals (no need to delete, we will only read normal values of filled voxels)
input_output[DTid.x].colorMask = 0;
}
}
+1 -1
View File
@@ -6290,7 +6290,7 @@ void DrawDebugWorld(
device->BindPipelineState(&PSO_debug[DEBUGRENDERING_VOXEL], cmd);
device->BindResource(VS, &textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELRADIANCE, cmd);
device->BindResource(VS, GetVoxelRadianceSecondaryBounceEnabled() ? &textures[TEXTYPE_3D_VOXELRADIANCE_HELPER] : &textures[TEXTYPE_3D_VOXELRADIANCE], TEXSLOT_VOXELRADIANCE, cmd);
MiscCB sb;
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wiVersion
// minor features, major updates, breaking compatibility changes
const int minor = 56;
// minor bug fixes, alterations, refactors, updates
const int revision = 68;
const int revision = 69;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);