Hello,
I manged so far to implement NVIDIA's NDF-Filtering at a basic level (the paper can be found here). Here is my code so far:
//...
// project the half vector on the normal (?)
float3 hppWS = halfVector / dot(halfVector, geometricNormal)
float2 hpp = float2(dot(hppWS, wTangent), dot(hppWS, wBitangent));
// compute the pixel footprint
float2x2 dhduv = float2x2(ddx(hpp), ddy(hpp));
// compute the rectangular area of the pixel footprint
float2 rectFp = min((abs(dhduv[0]) + abs(dhduv[1])) * 0.5, 0.3);
// map the area to ggx roughness
float2 covMx = rectFp * rectFp * 2;
roughness = sqrt(roughness * roughness + covMx);
//...
Now I want combine this with LEAN mapping as state in Chapter 5.5 of the NDF paper.
But I struggle to understand what theses sections actually means in Code:
I suppose the first-order moments are the B coefficent of the LEAN map, however things like
float3 hppWS = halfVector / dot(halfVector, float3(lean_B, 0));
doesn't bring up anything usefull.
Next theres:
This simply means:
// M and B are the coefficents from the LEAN map
float2x2 sigma_mat = float2x2(
M.x - B.x * B.x, M.z - B.x * B.y,
M.z - B.x * B.y, M.y - B.y * B.y);
does it?
Finally:
This is the part confuses me the most: how am I suppose to convolute two matrices? I know the concept of convolution in terms of functions, not matrices. Should I multiple them? That didn't make any usefully output.
I hope someone can help with this maybe too specific question, I'm really despaired to make this work and i've spend too many hours of trial & error...
Cheers,
Julian
↧