Skip to content

Commit a1938f1

Browse files
author
devsh
committed
add options for recomputing origin at higher precision than from barycentics
1 parent 63cdca6 commit a1938f1

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

22.RaytracedAO/raygen.comp

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void main()
4444
const int triangleIDBitcount = findMSB(MAX_TRIANGLES_IN_BATCH-1)+1;
4545
const uint triangleID = bitfieldExtract(visBuffer[0],31-triangleIDBitcount,triangleIDBitcount);
4646
const uint batchInstanceGUID = bitfieldExtract(visBuffer[0],0,31-triangleIDBitcount);
47-
const vec2 compactBary = unpackUnorm2x16(visBuffer[1]);
47+
//const vec2 compactBary = unpackUnorm2x16(visBuffer[1]);
4848
#ifdef TEX_PREFETCH_STREAM
4949
// TODO: separate pipeline and separate out the barycentric derivative FBO attachment, only write if need to, only fetch if `needs_texture_prefetch`
5050
const mat2 dBarydScreen = mat2(unpackHalf2x16(visBuffer[2]),unpackHalf2x16(visBuffer[3]));
@@ -58,29 +58,52 @@ void main()
5858
const vec3 lastVxPos = load_positions(batchInstanceData,indices);
5959
if (!bool(batchInstanceData.determinantSignBit&0x80000000u))
6060
normalizedG = -normalizedG;
61-
const bool frontfacing = dot(normalizedV,normalizedG)>=0.f;
61+
const float VdotG = dot(normalizedV,normalizedG);
62+
const bool frontfacing = VdotG>=0.f;
6263

63-
// get material while waiting for indices
64+
// get material
6465
const nbl_glsl_MC_oriented_material_t material = nbl_glsl_MC_material_data_t_getOriented(batchInstanceData.material,frontfacing);
6566
contrib.color = contrib.albedo = nbl_glsl_MC_oriented_material_t_getEmissive(material,normalizedV);
6667

6768
// little optimization for non-twosided materials
6869
if (material.genchoice_count!=0u)
6970
{
70-
// get initial scramble key while waiting for vertex positions
71+
// get initial scramble key
7172
const nbl_glsl_xoroshiro64star_state_t scramble_start_state = texelFetch(scramblebuf,ivec2(outPixelLocation),0).rg;
7273

74+
vec3 origin;
75+
#if RECOMPUTE_BARY
76+
// we know the ray will intersect the triangle
77+
vec2 compactBary;
78+
{
79+
// reversed order of arguments for each cross cause V is negative
80+
const vec3 ray_cross_e2 = cross(dPdBary[1],normalizedV);
81+
const float detRcp = 1.f/dot(dPdBary[0],ray_cross_e2);
82+
// assert(!isinf(detRcp));
83+
const vec3 s = (pc.cummon.viewDirReconFactors[3]-lastVxPos)*detRcp;
84+
const float u = dot(s,ray_cross_e2);
85+
// assert(0.f<=u && u<=1.f)
86+
const vec3 s_cross_e1 = cross(s,dPdBary[0]);
87+
const float v = -dot(normalizedV,s_cross_e1);
88+
// assert(0.f<=v && v<=1.f)
89+
compactBary = vec2(u,v);
90+
//
91+
const float t = dot(dPdBary[1],s_cross_e1);
92+
//assert(t>0.f);
93+
origin = pc.cummon.viewDirReconFactors[3]-normalizedV*t;
94+
}
95+
#else
96+
const vec2 compactBary = unpackUnorm2x16(visBuffer[1]);
97+
#endif
98+
origin = dPdBary*compactBary+lastVxPos;
99+
73100
//
74101
normalizedN = load_normal_and_prefetch_textures(
75102
batchInstanceData,indices,compactBary,material
76103
#ifdef TEX_PREFETCH_STREAM
77104
,dBarydScreen
78105
#endif
79106
);
80-
81-
const vec3 origin = dPdBary*compactBary+lastVxPos;
82-
// does this buy us any precision? (answer run CI!)
83-
//normalizedV = normalize(pc.cummon.viewDirReconFactors[3]-origin);
84107

85108
// generate rays
86109
const uint vertex_depth = 1u;

22.RaytracedAO/raytraceCommon.glsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,8 +536,7 @@ uint generate_next_rays(
536536

537537
// the 1.03125f adjusts for the fact that the normal might be too short (inversesqrt precision)
538538
const float inversesqrt_precision = 1.03125f;
539-
// TODO: investigate why we can't use `normalizedN` here
540-
const vec3 ray_offset_vector = normalize(cross(dPdBary[0],dPdBary[1]))*inversesqrt_precision;
539+
const vec3 ray_offset_vector = normalizedG*inversesqrt_precision;
541540
float origin_offset = nbl_glsl_numeric_limits_float_epsilon(120u); // I pulled the constants out of my @$$
542541
origin_offset += dot(abs(ray_offset_vector),abs(origin))*nbl_glsl_numeric_limits_float_epsilon(128u);
543542

@@ -551,6 +550,7 @@ uint generate_next_rays(
551550
//const vec3 geomNormal = cross(dPdBary[0],dPdBary[1]);
552551
//float ray_offset = ?;
553552
//ray_offset = nbl_glsl_ieee754_next_ulp_away_from_zero(ray_offset);
553+
554554
const vec3 ray_offset = ray_offset_vector*origin_offset;
555555
const vec3 ray_origin[2] = {origin+ray_offset,origin-ray_offset};
556556
uint offset = 0u;

0 commit comments

Comments
 (0)