Skip to content

Commit 21a256a

Browse files
greatly improve world position reconstruction from depth buffer
1 parent 8b3baeb commit 21a256a

File tree

8 files changed

+26
-59
lines changed

8 files changed

+26
-59
lines changed

examples_tests/22.RaytracedAO/common.glsl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
{
2020
float x,y,z;
2121
};
22+
#define vec4 nbl::core::vectorSIMDf
2223
#define mat4 nbl::core::matrix4SIMD
2324
#define mat4x3 nbl::core::matrix3x4SIMD
2425
#endif

examples_tests/22.RaytracedAO/dirty_source/ExtraCrap.cpp

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, scene::I
5252
#endif
5353
rrShapeCache(), rrInstances(), m_sceneBound(FLT_MAX,FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX),
5454
m_maxRaysPerDispatch(0), m_staticViewData{{0.f,0.f,0.f},0u,{0.f,0.f},{0.f,0.f},{0u,0u},0u,0u},
55-
m_raytraceCommonData{core::matrix3x4SIMD(),{},0u,0.f,0u,0u,0.f},
55+
m_raytraceCommonData{core::matrix4SIMD(),core::matrix3x4SIMD(),0,0,0},
5656
m_indirectDrawBuffers{nullptr},m_cullPushConstants{core::matrix4SIMD(),1.f,0u,0u,0u},m_cullWorkGroups(0u),
5757
m_raygenWorkGroups{0u,0u},m_resolveWorkGroups{0u,0u},
5858
m_visibilityBuffer(nullptr),tmpTonemapBuffer(nullptr),m_colorBuffer(nullptr)
@@ -619,8 +619,8 @@ void Renderer::init(const SAssetBundle& meshes,
619619
assert(film.cropOffsetY == 0);
620620
m_staticViewData.imageDimensions = {static_cast<uint32_t>(film.cropWidth),static_cast<uint32_t>(film.cropHeight)};
621621
}
622-
m_staticViewData.rcpPixelSize = { 1.f/float(m_staticViewData.imageDimensions.x),1.f/float(m_staticViewData.imageDimensions.y) };
623-
m_staticViewData.rcpHalfPixelSize = { 0.5f/float(m_staticViewData.imageDimensions.x),0.5f/float(m_staticViewData.imageDimensions.y) };
622+
m_staticViewData.rcpPixelSize = { 2.f/float(m_staticViewData.imageDimensions.x),-2.f/float(m_staticViewData.imageDimensions.y) };
623+
m_staticViewData.rcpHalfPixelSize = { 1.f/float(m_staticViewData.imageDimensions.x)-1.f,1.f-1.f/float(m_staticViewData.imageDimensions.y) };
624624
}
625625

626626
// figure out dispatch sizes
@@ -990,7 +990,7 @@ void Renderer::deinit()
990990
m_mdiDrawCalls.clear();
991991
m_indirectDrawBuffers[1] = m_indirectDrawBuffers[0] = nullptr;
992992

993-
m_raytraceCommonData = {core::matrix3x4SIMD(),{},0u,0.f,0u,0u,0.f};
993+
m_raytraceCommonData = {core::matrix4SIMD(),core::matrix3x4SIMD(),0,0,0};
994994
m_staticViewData = {{0.f,0.f,0.f},0u,{0.f,0.f},{0.f,0.f},{0u,0u},0u,0u};
995995
m_maxRaysPerDispatch = 0u;
996996
m_sceneBound = core::aabbox3df(FLT_MAX, FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX);
@@ -1062,24 +1062,10 @@ void Renderer::render(nbl::ITimer* timer)
10621062
m_cullPushConstants.currentCommandBufferIx ^= 0x01u;
10631063

10641064
// prepare camera data for raytracing
1065+
currentViewProj.getInverseTransform(m_raytraceCommonData.inverseMVP);
10651066
const auto cameraPosition = core::vectorSIMDf().set(camera->getAbsolutePosition());
1066-
{
1067-
auto frustum = camera->getViewFrustum();
1068-
core::matrix4SIMD fromCorners;
1069-
fromCorners[0] = cameraPosition-frustum->getFarLeftDown();
1070-
fromCorners[1] = cameraPosition-frustum->getFarRightDown()-fromCorners[0];
1071-
fromCorners[2] = cameraPosition-frustum->getFarLeftUp();
1072-
fromCorners[3] = cameraPosition-frustum->getFarRightUp()-fromCorners[2];
1073-
m_raytraceCommonData.frustumCornersToCamera = core::transpose(fromCorners).extractSub3x4();
1074-
}
1075-
m_raytraceCommonData.cameraPosition.x = cameraPosition.x;
1076-
m_raytraceCommonData.cameraPosition.y = cameraPosition.y;
1077-
m_raytraceCommonData.cameraPosition.z = cameraPosition.z;
1078-
{
1079-
auto projMat = camera->getProjectionMatrix();
1080-
auto* row = projMat.rows;
1081-
m_raytraceCommonData.depthLinearizationConstant = -double(row[3][2])/(double(row[3][2])-double(row[2][2]));
1082-
}
1067+
for (auto i=0u; i<3u; i++)
1068+
m_raytraceCommonData.ndcToV.rows[i] = m_raytraceCommonData.inverseMVP.rows[3]*cameraPosition[i]-m_raytraceCommonData.inverseMVP.rows[i];
10831069
}
10841070

10851071
// generate rays

examples_tests/22.RaytracedAO/raygen.comp

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// for per pixel inputs
55
#include <nbl/builtin/glsl/utils/normal_decode.glsl>
66
#include <nbl/builtin/glsl/random/xoroshiro.glsl>
7+
#include <nbl/builtin/glsl/utils/transform.glsl>
78

89
// rng
910
layout(set = 2, binding = 0) uniform usamplerBuffer sampleSequence;
@@ -29,21 +30,14 @@ vec3 nbl_glsl_MC_getNormalizedWorldSpaceN()
2930
return normalizedN;
3031
}
3132
vec3 worldPosition;
32-
vec3 nbl_glsl_MC_getWorldSpacePosition()
33-
{
34-
return worldPosition;
35-
}
3633
mat2x3 dPosdScreen = mat2x3(vec3(0.0),vec3(0.0)); // TODO
37-
mat2x3 nbl_glsl_MC_getdPos(in vec3 p)
34+
mat2x3 nbl_glsl_MC_getdPos()
3835
{
3936
return dPosdScreen;
4037
}
4138
#define _NBL_USER_PROVIDED_MATERIAL_COMPILER_GLSL_BACKEND_FUNCTIONS_
4239
#include <nbl/builtin/glsl/material_compiler/common.glsl>
4340

44-
//
45-
///
46-
4741

4842
// functions
4943
vec3 rand3d(in uint _sample, inout nbl_glsl_xoroshiro64star_state_t scramble_state)
@@ -53,20 +47,6 @@ vec3 rand3d(in uint _sample, inout nbl_glsl_xoroshiro64star_state_t scramble_sta
5347
return vec3(seqVal)*uintBitsToFloat(0x2f800004u);
5448
}
5549

56-
float linearizeZBufferVal(in float nonLinearZBufferVal)
57-
{
58-
// 1-(Ax+B)/(Cx) = y
59-
// (Ax+B)/(Cx) = 1-y
60-
// x = B/(C(1-y)-A)
61-
// x = B/(C-A-Cy)
62-
// get back original Z: `row[2][3]/(row[3][2]-row[2][2]-y*row[3][2]) = x`
63-
// max Z: `B/(C-A)`
64-
// positive [0,1] Z: `B/(C-A-Cy)/(B/(C-A))`
65-
// positive [0,1] Z: `(C-A)/(C-A-Cy)`
66-
// positive [0,1] Z: `D/(D-Cy)`
67-
return 1.0/(pc.cummon.depthLinearizationConstant*nonLinearZBufferVal+1.0);
68-
}
69-
7050
/*
7151
float maxAbs1(in float val)
7252
{
@@ -157,11 +137,12 @@ void main()
157137

158138
// unproject
159139
{
160-
const mat4x3 frustumCornersToCamera = pc.cummon.frustumCornersToCamera;
161-
const vec2 NDC = vec2(outputLocation)*staticViewData.rcpPixelSize+staticViewData.rcpHalfPixelSize;
140+
const vec3 NDC = vec3(vec2(outputLocation)*staticViewData.rcpPixelSize+staticViewData.rcpHalfPixelSize,1.0-revdepth);
162141

163-
const vec3 V = mix(frustumCornersToCamera[1]*NDC.x+frustumCornersToCamera[0],frustumCornersToCamera[3]*NDC.x+frustumCornersToCamera[2],NDC.yyy); // could maybe compute this more precisely
164-
worldPosition = pc.cummon.cameraPosition-V*linearizeZBufferVal(revdepth);
142+
vec4 tmp = nbl_glsl_pseudoMul4x4with3x1(pc.cummon.inverseMVP,NDC);
143+
worldPosition = tmp.xyz/tmp.w;
144+
145+
const vec3 V = nbl_glsl_pseudoMul3x4with3x1(pc.cummon.ndcToV,NDC);
165146
normalizedV = normalize(V);
166147
}
167148

@@ -179,7 +160,6 @@ void main()
179160

180161
//
181162
emissive = nbl_glsl_MC_oriented_material_t_getEmissive(material);
182-
emissive = vec3(float(objectID),float(triangleID),0.0);
183163

184164
// normally we'd use MeshPackerV2's vertex attribute data for this, but now we read from temporary GBuffer
185165
const vec3 normal = nbl_glsl_NormalDecode_signedSpherical(normalBuffer);
@@ -223,9 +203,9 @@ void main()
223203
{
224204
throughput.rgb /= float(staticViewData.samplesPerPixelPerDispatch);
225205

226-
const float tt = 1.0;
227-
rays[realOutputID].origin = pc.cummon.cameraPosition;//nbl_glsl_MC_getWorldSpacePosition()+nbl_glsl_MC_getNormalizedWorldSpaceV()*tt;//-direction*0.5*maxT;/*+newray.direction*err?; TODO */
228-
rays[realOutputID].maxT = FLT_MAX;//tt*2.0;
206+
const float tt = 1.0/1024.0;
207+
rays[realOutputID].origin = worldPosition+nbl_glsl_MC_getNormalizedWorldSpaceV()*tt;//-direction*0.5*maxT;/*+newray.direction*err?; TODO */
208+
rays[realOutputID].maxT = tt*2.0;
229209
rays[realOutputID].direction = -nbl_glsl_MC_getNormalizedWorldSpaceV();
230210
rays[realOutputID].mask = -1;
231211
rays[realOutputID]._active = 1;

examples_tests/22.RaytracedAO/raytraceCommon.glsl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,12 @@ struct StaticViewData_t
9494

9595
struct RaytraceShaderCommonData_t
9696
{
97-
mat4x3 frustumCornersToCamera;
98-
vec3 cameraPosition;
99-
uint padding;
100-
float depthLinearizationConstant;
97+
mat4 inverseMVP;
98+
mat4x3 ndcToV;
10199
uint samplesComputedPerPixel;
102100
uint framesDispatched;
103101
float rcpFramesDispatched;
102+
float padding0;
104103
};
105104

106105

examples_tests/22.RaytracedAO/resolve.comp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void main()
4040
else
4141
acc += color;
4242
storeAccumulation(acc,pixelCoord);
43-
acc = abs(acc);
43+
acc = abs(color);
4444
acc.rg /= vec2(32.0,1023.0);
4545
imageStore(framebuffer,pixelCoord,uvec4(nbl_glsl_encodeRGB10A2(vec4(acc,1.0)),0u,0u,0u));
4646
}

include/nbl/asset/CQuantNormalCache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ class CQuantNormalCache
322322
return cacheSize;
323323

324324
}
325+
return 0xdeadbeefBADC0FFEu;
325326
}
326327

327328
private:

src/nbl/asset/CShaderIntrospector.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -699,15 +699,15 @@ static void introspectStructType(spirv_cross::Compiler& _comp, impl::SShaderMemo
699699
}
700700
}
701701
else if (mtype.basetype != spirv_cross::SPIRType::Struct) // might have to ignore a few more types than structs
702-
member.arrayStride = core::max(0x1u<<core::findMSB(member.size),16u);
702+
member.arrayStride = core::max(0x1u<<core::findMSB(member.size),16u); // @Crisspl NOT TRUE FOR MATRICES!
703703

704704
if (mtype.basetype == spirv_cross::SPIRType::Struct) //recursive introspection done in DFS manner (and without recursive calls)
705705
_pushStack.push({member.members, mtype, member.offset});
706706
else
707707
{
708708
member.mtxRowCnt = mtype.vecsize;
709709
member.mtxColCnt = mtype.columns;
710-
if (member.mtxColCnt > 1u)
710+
if (member.mtxColCnt > 1u) // @Crisspl why are you checking columns to get stride? What about row major?
711711
member.mtxStride = _comp.type_struct_member_matrix_stride(_parentType, m);
712712
}
713713
}

src/nbl/ext/MitsubaLoader/CMitsubaLoader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1311,9 +1311,9 @@ SContext::tex_ass_type CMitsubaLoader::cacheTexture(SContext& ctx, uint32_t hier
13111311
_NBL_DEBUG_BREAK_IF(true); // TODO : replace whole texture?
13121312
break;
13131313
default:
1314-
return ISampler::ETC_REPEAT;
13151314
break;
13161315
}
1316+
return ISampler::ETC_REPEAT;
13171317
};
13181318
samplerParams.TextureWrapU = getWrapMode(tex->bitmap.wrapModeU);
13191319
samplerParams.TextureWrapV = getWrapMode(tex->bitmap.wrapModeV);

0 commit comments

Comments
 (0)