Skip to content

Commit f21ca6a

Browse files
stop reconstructing V in raygen (And stop using the depth buffer)
1 parent b9d03d4 commit f21ca6a

File tree

4 files changed

+24
-42
lines changed

4 files changed

+24
-42
lines changed

examples_tests/22.RaytracedAO/Renderer.cpp

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,8 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, scene::I
5151
m_optixManager(), m_cudaStream(nullptr), m_optixContext(),
5252
#endif
5353
m_prevView(), m_sceneBound(FLT_MAX,FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX),
54-
m_maxRaysPerDispatch(0), m_framesDispatched(0u),
55-
m_staticViewData{{0.f,0.f,0.f},0u,{0.f,0.f},{0.f,0.f},{0u,0u},0u,0u},
56-
m_raytraceCommonData{core::matrix3x4SIMD(),vec3(),0,0,0},
54+
m_maxRaysPerDispatch(0), m_framesDispatched(0u), m_rcpPixelSize{0.f,0.f},
55+
m_staticViewData{{0.f,0.f,0.f},0u,{0u,0u},0u,0u}, m_raytraceCommonData{vec3(),0.f,0u,0u,0u,0u,0u},
5756
m_indirectDrawBuffers{nullptr},m_cullPushConstants{core::matrix4SIMD(),1.f,0u,0u,0u},m_cullWorkGroups(0u),
5857
m_raygenWorkGroups{0u,0u},m_visibilityBuffer(nullptr),m_colorBuffer(nullptr)
5958
{
@@ -151,11 +150,10 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, scene::I
151150
auto sampler = m_driver->createGPUSampler(samplerParams);
152151
{
153152

154-
constexpr auto raygenDescriptorCount = 2u;
153+
constexpr auto raygenDescriptorCount = 1u;
155154
IGPUDescriptorSetLayout::SBinding bindings[raygenDescriptorCount];
156155
fillIotaDescriptorBindingDeclarations(bindings,ISpecializedShader::ESS_COMPUTE,raygenDescriptorCount,EDT_COMBINED_IMAGE_SAMPLER);
157156
bindings[0].samplers = &sampler;
158-
bindings[1].samplers = &sampler;
159157

160158
m_raygenDSLayout = m_driver->createGPUDescriptorSetLayout(bindings,bindings+raygenDescriptorCount);
161159
}
@@ -661,7 +659,7 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
661659
{
662660
deinit();
663661

664-
core::smart_refctd_ptr<IGPUImageView> depthBuffer,visibilityBuffer;
662+
core::smart_refctd_ptr<IGPUImageView> visibilityBuffer;
665663
// set up Descriptor Sets
666664
{
667665
// captures m_globalBackendDataDS, creates m_indirectDrawBuffers, sets up m_mdiDrawCalls ranges
@@ -685,8 +683,7 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
685683
assert(film.cropOffsetY == 0);
686684
m_staticViewData.imageDimensions = {static_cast<uint32_t>(film.cropWidth),static_cast<uint32_t>(film.cropHeight)};
687685
}
688-
m_staticViewData.rcpPixelSize = { 2.f/float(m_staticViewData.imageDimensions.x),-2.f/float(m_staticViewData.imageDimensions.y) };
689-
m_staticViewData.rcpHalfPixelSize = { 1.f/float(m_staticViewData.imageDimensions.x)-1.f,1.f-1.f/float(m_staticViewData.imageDimensions.y) };
686+
m_rcpPixelSize = { 2.f/float(m_staticViewData.imageDimensions.x),-2.f/float(m_staticViewData.imageDimensions.y) };
690687
}
691688

692689
// figure out dispatch sizes
@@ -933,12 +930,10 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
933930
m_driver->updateDescriptorSets(7u,writes,0u,nullptr);
934931
// set up m_raygenDS
935932
{
936-
depthBuffer = createScreenSizedTexture(EF_D32_SFLOAT);
937-
setImageInfo(infos+0,asset::EIL_SHADER_READ_ONLY_OPTIMAL,core::smart_refctd_ptr(depthBuffer));
938933
visibilityBuffer = createScreenSizedTexture(EF_R32G32B32A32_UINT);
939-
setImageInfo(infos+1,asset::EIL_SHADER_READ_ONLY_OPTIMAL,core::smart_refctd_ptr(visibilityBuffer));
934+
setImageInfo(infos+0,asset::EIL_SHADER_READ_ONLY_OPTIMAL,core::smart_refctd_ptr(visibilityBuffer));
940935

941-
setDstSetAndDescTypesOnWrites(m_raygenDS.get(),writes,infos,{EDT_COMBINED_IMAGE_SAMPLER,EDT_COMBINED_IMAGE_SAMPLER});
936+
setDstSetAndDescTypesOnWrites(m_raygenDS.get(),writes,infos,{EDT_COMBINED_IMAGE_SAMPLER});
942937
}
943938
m_driver->updateDescriptorSets(descriptorUpdateCounts[2],writes,0u,nullptr);
944939
// set up m_closestHitDS
@@ -971,7 +966,7 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
971966

972967

973968
m_visibilityBuffer = m_driver->addFrameBuffer();
974-
m_visibilityBuffer->attach(EFAP_DEPTH_ATTACHMENT,std::move(depthBuffer));
969+
m_visibilityBuffer->attach(EFAP_DEPTH_ATTACHMENT,createScreenSizedTexture(EF_D32_SFLOAT));
975970
m_visibilityBuffer->attach(EFAP_COLOR_ATTACHMENT0,std::move(visibilityBuffer));
976971

977972
m_colorBuffer = m_driver->addFrameBuffer();
@@ -1102,8 +1097,9 @@ void Renderer::deinit()
11021097
m_indirectDrawBuffers[1] = m_indirectDrawBuffers[0] = nullptr;
11031098
m_indexBuffer = nullptr;
11041099

1105-
m_raytraceCommonData = {core::matrix3x4SIMD(),vec3(),0,0,0,0u};
1106-
m_staticViewData = {{0.f,0.f,0.f},0u,{0.f,0.f},{0.f,0.f},{0u,0u},0u,0u};
1100+
m_raytraceCommonData = {vec3(),0,0,0,0u};
1101+
m_staticViewData = {{0.f,0.f,0.f},0u,{0u,0u},0u,0u};
1102+
m_rcpPixelSize = {0.f,0.f};
11071103
m_framesDispatched = 0u;
11081104
m_maxRaysPerDispatch = 0u;
11091105
std::fill_n(m_prevView.pointer(),12u,0.f);
@@ -1182,8 +1178,8 @@ void Renderer::render(nbl::ITimer* timer)
11821178
const float truncated = sample[0]*0.99999f+0.00001f;
11831179
const float r = sqrtf(-2.f*logf(truncated))*stddev;
11841180
core::matrix4SIMD jitterMatrix;
1185-
jitterMatrix.rows[0][3] = cosPhi*r*m_staticViewData.rcpPixelSize.x;
1186-
jitterMatrix.rows[1][3] = sinPhi*r*m_staticViewData.rcpPixelSize.y;
1181+
jitterMatrix.rows[0][3] = cosPhi*r*m_rcpPixelSize.x;
1182+
jitterMatrix.rows[1][3] = sinPhi*r*m_rcpPixelSize.y;
11871183
return core::concatenateBFollowedByA(jitterMatrix,core::concatenateBFollowedByA(camera->getProjectionMatrix(),m_prevView));
11881184
}(m_framesDispatched++);
11891185
m_raytraceCommonData.rcpFramesDispatched = 1.f/float(m_framesDispatched);
@@ -1229,12 +1225,10 @@ void Renderer::render(nbl::ITimer* timer)
12291225
m_cullPushConstants.currentCommandBufferIx ^= 0x01u;
12301226

12311227
// prepare camera data for raytracing
1232-
core::matrix4SIMD inverseMVP;
1233-
modifiedViewProj.getInverseTransform(inverseMVP);
12341228
const auto cameraPosition = core::vectorSIMDf().set(camera->getAbsolutePosition());
1235-
for (auto i=0u; i<3u; i++)
1236-
m_raytraceCommonData.ndcToV.rows[i] = inverseMVP.rows[3]*cameraPosition[i]-inverseMVP.rows[i];
1237-
//m_raytraceCommonData.camPos = ;
1229+
m_raytraceCommonData.camPos.x = cameraPosition.x;
1230+
m_raytraceCommonData.camPos.y = cameraPosition.y;
1231+
m_raytraceCommonData.camPos.z = cameraPosition.z;
12381232
}
12391233
// path trace
12401234
m_raytraceCommonData.depth = 0u;

examples_tests/22.RaytracedAO/Renderer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ class Renderer : public nbl::core::IReferenceCounted, public nbl::core::Interfac
123123
nbl::core::aabbox3df m_sceneBound;
124124
uint32_t m_maxRaysPerDispatch;
125125
uint32_t m_framesDispatched;
126+
vec2 m_rcpPixelSize;
126127
StaticViewData_t m_staticViewData;
127128
RaytraceShaderCommonData_t m_raytraceCommonData;
128129

examples_tests/22.RaytracedAO/raygen.comp

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ layout(local_size_x = WORKGROUP_DIM, local_size_y = WORKGROUP_DIM) in;
66

77
#include "raytraceCommon.glsl"
88

9-
layout(set = 3, binding = 0) uniform sampler2D depthbuf;
10-
layout(set = 3, binding = 1) uniform usampler2D frontFacingTriangleIDDrawID_unorm16Bary_dBarydScreenHalf2x2; // should it be called backfacing or frontfacing?
9+
layout(set = 3, binding = 0) uniform usampler2D frontFacingTriangleIDDrawID_unorm16Bary_dBarydScreenHalf2x2; // should it be called backfacing or frontfacing?
1110

1211
bool get_sample_job()
1312
{
@@ -22,28 +21,18 @@ vec3 unpack_barycentrics(in uint data)
2221

2322
void main()
2423
{
24+
bool hit = false;
2525
if (get_sample_job())
2626
{
2727
vec3 emissive = staticViewData.envmapBaseColor;
28-
29-
// basic reads
30-
const float revdepth = texelFetch(depthbuf,ivec2(gl_GlobalInvocationID.xy),0).r;
28+
29+
// vis buffer read
3130
const uvec2 outPixelLocation = gl_GlobalInvocationID.xy;
31+
const uvec4 visBuffer = texelFetch(frontFacingTriangleIDDrawID_unorm16Bary_dBarydScreenHalf2x2,ivec2(outPixelLocation),0);
3232

33-
const bool hit = revdepth>0.0;
33+
hit = visBuffer[0]!=0xffffffffu;
3434
if (hit)
3535
{
36-
// vis buffer read
37-
const uvec4 visBuffer = texelFetch(frontFacingTriangleIDDrawID_unorm16Bary_dBarydScreenHalf2x2,ivec2(outPixelLocation),0);
38-
39-
// unproject (TODO: redo)
40-
{
41-
const vec3 NDC = vec3(vec2(outPixelLocation)*staticViewData.rcpPixelSize+staticViewData.rcpHalfPixelSize,1.0-revdepth);
42-
43-
const vec3 V = nbl_glsl_pseudoMul3x4with3x1(pc.cummon.ndcToV,NDC);
44-
normalizedV = normalize(V);
45-
}
46-
4736
// vis buffer decode
4837
const bool frontfacing = !bool(visBuffer[0]&0x80000000u);
4938
const int triangleIDBitcount = findMSB(MAX_TRIANGLES_IN_BATCH-1)+1;
@@ -72,6 +61,7 @@ void main()
7261
);
7362

7463
const vec3 hitWorldPos = dPdBary*compactBary.xy+last_vx_pos;
64+
normalizedV = normalize(pc.cummon.camPos-hitWorldPos);
7565

7666
// generate rays
7767
const uint sampleID = bitfieldExtract(pc.cummon.samplesComputed_depth,0,16);

examples_tests/22.RaytracedAO/raytraceCommon.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,13 @@ struct StaticViewData_t
8282
{
8383
vec3 envmapBaseColor;
8484
uint lightCount;
85-
vec2 rcpPixelSize;
86-
vec2 rcpHalfPixelSize;
8785
uvec2 imageDimensions;
8886
uint samplesPerPixelPerDispatch;
8987
uint padding;
9088
};
9189

9290
struct RaytraceShaderCommonData_t
9391
{
94-
mat4x3 ndcToV;
9592
vec3 camPos;
9693
float rcpFramesDispatched;
9794
#ifdef __cplusplus

0 commit comments

Comments
 (0)