ray_tracing_gltf: Match samplingHemisphere to Ray Tracing Gems implementation and avoid generating directions perpendicular to +z; adjust comments on Lambertian PDF and match docs.
This commit is contained in:
parent
c436c46141
commit
80e00cae4e
3 changed files with 20 additions and 14 deletions
|
|
@ -452,8 +452,8 @@ struct hitPayload
|
||||||
|
|
||||||
This modification will recursively trace until the `depth`hits 10 (hardcoded) or hit an emissive element (light).
|
This modification will recursively trace until the `depth`hits 10 (hardcoded) or hit an emissive element (light).
|
||||||
|
|
||||||
The only information that we will keep from the shader, is the calculation of the hit state: position, normal. So
|
The only information that we will keep from the shader, is the calculation of the hit state: the position and normal. So
|
||||||
all code from `// Vector toward the light` to the end can be remove and be replaced by the following.
|
all code from `// Vector toward the light` to the end can be removed and be replaced by the following.
|
||||||
|
|
||||||
~~~~C
|
~~~~C
|
||||||
// https://en.wikipedia.org/wiki/Path_tracing
|
// https://en.wikipedia.org/wiki/Path_tracing
|
||||||
|
|
@ -467,12 +467,18 @@ all code from `// Vector toward the light` to the end can be remove and be repla
|
||||||
vec3 rayOrigin = world_position;
|
vec3 rayOrigin = world_position;
|
||||||
vec3 rayDirection = samplingHemisphere(prd.seed, tangent, bitangent, world_normal);
|
vec3 rayDirection = samplingHemisphere(prd.seed, tangent, bitangent, world_normal);
|
||||||
|
|
||||||
// Probability of the newRay (cosine distributed)
|
const float cos_theta = dot(rayDirection, world_normal);
|
||||||
const float p = 1 / M_PI;
|
// Probability density function of samplingHemisphere choosing this rayDirection
|
||||||
|
const float p = cos_theta / M_PI;
|
||||||
|
|
||||||
// Compute the BRDF for this ray (assuming Lambertian reflection)
|
// Compute the BRDF for this ray (assuming Lambertian reflection)
|
||||||
float cos_theta = dot(rayDirection, world_normal);
|
vec3 albedo = mat.pbrBaseColorFactor.xyz;
|
||||||
vec3 BRDF = mat.pbrBaseColorFactor.xyz / M_PI;
|
if(mat.pbrBaseColorTexture > -1)
|
||||||
|
{
|
||||||
|
uint txtId = mat.pbrBaseColorTexture;
|
||||||
|
albedo *= texture(texturesMap[nonuniformEXT(txtId)], texcoord0).xyz;
|
||||||
|
}
|
||||||
|
vec3 BRDF = albedo / M_PI;
|
||||||
|
|
||||||
// Recursively trace reflected light sources.
|
// Recursively trace reflected light sources.
|
||||||
if(prd.depth < 10)
|
if(prd.depth < 10)
|
||||||
|
|
|
||||||
|
|
@ -110,12 +110,11 @@ void main()
|
||||||
vec3 rayOrigin = world_position;
|
vec3 rayOrigin = world_position;
|
||||||
vec3 rayDirection = samplingHemisphere(prd.seed, tangent, bitangent, world_normal);
|
vec3 rayDirection = samplingHemisphere(prd.seed, tangent, bitangent, world_normal);
|
||||||
|
|
||||||
// Compute the BRDF for this ray (assuming Lambertian reflection)
|
const float cos_theta = dot(rayDirection, world_normal);
|
||||||
float cos_theta = dot(rayDirection, world_normal);
|
// Probability density function of samplingHemisphere choosing this rayDirection
|
||||||
|
|
||||||
// Probability of the newRay (cosine distributed)
|
|
||||||
const float p = cos_theta / M_PI;
|
const float p = cos_theta / M_PI;
|
||||||
|
|
||||||
|
// Compute the BRDF for this ray (assuming Lambertian reflection)
|
||||||
vec3 albedo = mat.pbrBaseColorFactor.xyz;
|
vec3 albedo = mat.pbrBaseColorFactor.xyz;
|
||||||
if(mat.pbrBaseColorTexture > -1)
|
if(mat.pbrBaseColorTexture > -1)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -57,16 +57,17 @@ float rnd(inout uint prev)
|
||||||
// Sampling
|
// Sampling
|
||||||
//-------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Randomly sampling around +Z
|
// Randomly samples from a cosine-weighted hemisphere oriented in the `z` direction.
|
||||||
|
// From Ray Tracing Gems section 16.6.1, "Cosine-Weighted Hemisphere Oriented to the Z-Axis"
|
||||||
vec3 samplingHemisphere(inout uint seed, in vec3 x, in vec3 y, in vec3 z)
|
vec3 samplingHemisphere(inout uint seed, in vec3 x, in vec3 y, in vec3 z)
|
||||||
{
|
{
|
||||||
#define M_PI 3.141592
|
#define M_PI 3.14159265
|
||||||
|
|
||||||
float r1 = rnd(seed);
|
float r1 = rnd(seed);
|
||||||
float r2 = rnd(seed);
|
float r2 = rnd(seed);
|
||||||
float sq = sqrt(1.0 - r2);
|
float sq = sqrt(r1);
|
||||||
|
|
||||||
vec3 direction = vec3(cos(2 * M_PI * r1) * sq, sin(2 * M_PI * r1) * sq, sqrt(r2));
|
vec3 direction = vec3(cos(2 * M_PI * r2) * sq, sin(2 * M_PI * r2) * sq, sqrt(1. - r1));
|
||||||
direction = direction.x * x + direction.y * y + direction.z * z;
|
direction = direction.x * x + direction.y * y + direction.z * z;
|
||||||
|
|
||||||
return direction;
|
return direction;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue