Skip to content

Commit 82d4d95

Browse files
make sure visibility buffer and raytrace agree
1 parent 8af185e commit 82d4d95

File tree

3 files changed

+31
-26
lines changed

3 files changed

+31
-26
lines changed

examples_tests/22.RaytracedAO/dirty_source/ExtraCrap.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,27 +1026,29 @@ void Renderer::render(nbl::ITimer* timer)
10261026

10271027
// flip MDI buffers
10281028
m_cullPushConstants.currentCommandBufferIx ^= 0x01u;
1029-
}
10301029

1031-
// generate rays ( TODO: move the camera part)
1032-
{
1030+
// prepare camera data for raytracing
10331031
const auto cameraPosition = core::vectorSIMDf().set(camera->getAbsolutePosition());
10341032
{
10351033
auto frustum = camera->getViewFrustum();
1036-
core::matrix4SIMD corners;
1037-
corners[0] = frustum->getFarLeftDown()-cameraPosition;
1038-
corners[1] = frustum->getFarRightDown()-cameraPosition-corners[0];
1039-
corners[2] = frustum->getFarLeftUp()-cameraPosition;
1040-
corners[3] = frustum->getFarRightUp()-cameraPosition-corners[2];
1041-
m_raytraceCommonData.frustumCorners = core::transpose(corners).extractSub3x4();
1034+
core::matrix4SIMD fromCorners;
1035+
fromCorners[0] = cameraPosition-frustum->getFarLeftDown();
1036+
fromCorners[1] = cameraPosition-frustum->getFarRightDown()-fromCorners[0];
1037+
fromCorners[2] = cameraPosition-frustum->getFarLeftUp();
1038+
fromCorners[3] = cameraPosition-frustum->getFarRightUp()-fromCorners[2];
1039+
m_raytraceCommonData.frustumCornersToCamera = core::transpose(fromCorners).extractSub3x4();
10421040
}
10431041
camera->getViewMatrix().getSub3x3InverseTranspose(m_raytraceCommonData.normalMatrixAndCameraPos);
10441042
m_raytraceCommonData.normalMatrixAndCameraPos.setTranslation(cameraPosition);
10451043
{
10461044
auto projMat = camera->getProjectionMatrix();
10471045
auto* row = projMat.rows;
1048-
m_raytraceCommonData.depthLinearizationConstant = -row[3][2]/(row[3][2]-row[2][2]);
1046+
m_raytraceCommonData.depthLinearizationConstant = -double(row[3][2])/(double(row[3][2])-double(row[2][2]));
10491047
}
1048+
}
1049+
1050+
// generate rays ( TODO: move the camera part)
1051+
{
10501052
m_raytraceCommonData.framesDispatched++;
10511053
m_raytraceCommonData.rcpFramesDispatched = 1.f/float(m_raytraceCommonData.framesDispatched);
10521054

examples_tests/22.RaytracedAO/raygen.comp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ float linearizeZBufferVal(in float nonLinearZBufferVal)
7676
return 1.0/(pc.cummon.depthLinearizationConstant*nonLinearZBufferVal+1.0);
7777
}
7878

79-
8079
/*
8180
float maxAbs1(in float val)
8281
{
@@ -124,7 +123,7 @@ struct SamplingData_t
124123
bool gen_sample_ray(out float maxT, out vec3 direction, out vec3 throughput, in SamplingData_t samplingData)
125124
{
126125
maxT = FLT_MAX;
127-
direction = normalize(vec3(0.5,0.5,0.5));
126+
direction = -nbl_glsl_MC_getNormalizedWorldSpaceV();
128127
throughput = vec3(1.0);
129128
return true;
130129
}
@@ -232,20 +231,28 @@ void main()
232231

233232
// unproject
234233
{
235-
const mat4x3 frustumCorners = pc.cummon.frustumCorners;
234+
const mat4x3 frustumCornersToCamera = pc.cummon.frustumCornersToCamera;
236235
const vec2 NDC = vec2(outputLocation)*staticViewData.rcpPixelSize+staticViewData.rcpHalfPixelSize;
237-
238-
const vec3 viewDir = mix(frustumCorners[0]*NDC.x+frustumCorners[1],frustumCorners[2]*NDC.x+frustumCorners[3],NDC.yyy);
239-
worldPosition = viewDir*linearizeZBufferVal(revdepth)+pc.cummon.normalMatrixAndCameraPos[3];
240-
normalizedV = normalize(viewDir);
236+
237+
const vec3 V = mix(frustumCornersToCamera[1]*NDC.x+frustumCornersToCamera[0],frustumCornersToCamera[3]*NDC.x+frustumCornersToCamera[2],NDC.yyy); // could maybe compute this more precisely
238+
worldPosition = pc.cummon.normalMatrixAndCameraPos[3]-V*linearizeZBufferVal(revdepth);
239+
normalizedV = normalize(V);
241240
}
242241

243242
// decode vis buffer
244243
bool frontfacing;
244+
vec3 emissive;
245245
{
246246
frontfacing = visBuffer[0]<0x80000000u;
247247
const uint objectID = visBuffer[0]&0x7fffffffu;
248248
const uint triangleID = visBuffer[1];
249+
250+
//
251+
precomputed = nbl_glsl_MC_precomputeData(frontfacing);
252+
material = nbl_glsl_MC_material_data_t_getOriented(InstData.data[objectID].material,precomputed.frontface);
253+
254+
//
255+
emissive = vec3(float(objectID),float(triangleID),0.0);//nbl_glsl_MC_oriented_material_t_getEmissive(material);
249256
}
250257

251258
// normally we'd use MeshPackerV2's vertex attribute data for this, but now we read from temporary GBuffer
@@ -254,11 +261,6 @@ void main()
254261
}
255262

256263
//
257-
precomputed = nbl_glsl_MC_precomputeData(frontfacing);
258-
//material = nbl_glsl_MC_material_data_t_getOriented(InstData.data[objectID].material,precomputed.frontface);
259-
260-
//
261-
const vec3 emissive = vec3(0.0,1.0,0.0);//nbl_glsl_MC_oriented_material_t_getEmissive(material);
262264
vec3 acc;
263265
if (pc.cummon.rcpFramesDispatched<1.0)
264266
acc = fetchAccumulation(pixelCoord)+emissive/float(pc.cummon.framesDispatched-1u);
@@ -293,9 +295,10 @@ void main()
293295
{
294296
throughput /= float(staticViewData.samplesPerPixelPerDispatch);
295297

296-
rays[realOutputID].origin = nbl_glsl_MC_getWorldSpacePosition();/*+newray.direction*err?; TODO */
297-
rays[realOutputID].maxT = FLT_MAX;
298-
rays[realOutputID].direction = direction;
298+
const float tt = 1.0;
299+
rays[realOutputID].origin = nbl_glsl_MC_getWorldSpacePosition()+nbl_glsl_MC_getNormalizedWorldSpaceV()*tt;//-direction*0.5*maxT;/*+newray.direction*err?; TODO */
300+
rays[realOutputID].maxT = tt*2.0;
301+
rays[realOutputID].direction = -nbl_glsl_MC_getNormalizedWorldSpaceV()*tt;
299302
rays[realOutputID].mask = -1;
300303
rays[realOutputID]._active = 1;
301304
rays[realOutputID].backfaceCulling = int(packHalf2x16(throughput.ab));

examples_tests/22.RaytracedAO/raytraceCommon.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ struct StaticViewData_t
9494

9595
struct RaytraceShaderCommonData_t
9696
{
97-
mat4x3 frustumCorners;
97+
mat4x3 frustumCornersToCamera;
9898
mat4x3 normalMatrixAndCameraPos;
9999
float depthLinearizationConstant;
100100
uint samplesComputedPerPixel;

0 commit comments

Comments
 (0)