@@ -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;
0 commit comments