Skip to content

Commit

Permalink
feat(cloud-picture): edit bsdf glsl(draft v2)
Browse files Browse the repository at this point in the history
  • Loading branch information
yyc-git committed Oct 14, 2020
1 parent 3bc8cca commit 40eedc3
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 101 deletions.
149 changes: 81 additions & 68 deletions src/run/cloud_picture/domain_layer/domain/shader/ray_tracing/bsdf.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,22 @@ float _geometrySmith(float NdotV, float NdotL, float roughness) {

float pow5(float v) { return v * v * v * v * v; }

vec3 _evalDiffuseBRDF(vec3 cdiff, vec3 F) {
vec3 _evalDiffuseBRDF(float NdotL, float NdotV, vec3 baseColor, float metallic,
vec3 f0, vec3 F) {
if (NdotL <= 0.0 || NdotV <= 0.0)
return vec3(0.0);

vec3 black = vec3(0.0);
vec3 cdiff = mix(baseColor * (1.0 - max(f0.r, f0.g, f0.b)), black, metallic);

return (1.0 - max(F.r, F.g, F.b)) * cdiff / PI;
}

vec3 _evalSpecularBRDF(float D, float G, vec3 F, float epsilon, float NdotL,
float NdotV) {
vec3 _evalSpecularBRDF(float NdotL, float NdotV, float D, float G, vec3 F,
float epsilon, float NdotL, float NdotV) {
if (NdotL <= 0.0 || NdotV <= 0.0)
return vec3(0.0);

// Microfacet specular = D * G * F / (4 * NdotL * NdotV)
vec3 nominator = D * G * F;
float denominator = 4.0 * NdotV * NdotL + epsilon;
Expand All @@ -131,45 +141,38 @@ vec3 _affectByLight(float NdotL, vec3 radiance) {
vec3 _evalRefractionBTDF(float NdotV, float NdotL, float NdotH, float VdotH,
vec3 H, vec3 L, vec3 V, float D, float G, vec3 F,
float epsilon, float etaIn, float etaOut) {

float term1 = VdotH * LdotH / (NdotV * NdotL);
vec3 term2 = etaOut * etaOut * (1 - F) * G * D;
// term1 = 1;
// term2 = 1;
float term3 =
(etaIn * VdotH + etaOut * LdotH) * (etaIn * VdotH + etaOut * LdotH) +
epsilon;
// term3 = 1;

return term1 * term2 / term3;
}

void _evalForBRDF(in vec3 L, in vec3 N, in vec3 V, in vec3 f0, in float f90,
in ShadingData shading, out float NdotH, out float VdotH,
out vec3 F, out float NDF, out vec3 cdiff) {
out vec3 F, out float NDF) {
vec3 H = normalize(V + L);

NdotH = abs(dot(N, H));
VdotH = max(dot(H, V), 0.0);

F = _fresnelSchlick(VdotH, f0, f90);

vec3 black = vec3(0.0);
cdiff = mix(shading.baseColor * (1.0 - max(f0.r, f0.g, f0.b)), black,
shading.metallic);

NDF = _distributionGGX(NdotH, shading.roughness);
}

vec3 computeHForRefractionBTDF() {
vec3 computeHForFresnel() {
_importanceSampleGGX(rnd(seed), rnd(seed), N, roughness, epsilon)
}

void _evalForRefractionBTDF(inout seed, in vec3 L, in vec3 N, in vec3 V,
in vec3 f0, in float f90, in ShadingData shading,
out float NdotH, out float VdotH, out vec3 F,
out float NDF, out float etaIn, out float etaOut) {
vec3 H = _importanceSampleGGX(rnd(seed), rnd(seed), N, roughness, epsilon);
void _evalForFresnel(inout seed, in vec3 L, in vec3 N, in vec3 V, in vec3 f0,
in float f90, in ShadingData shading, out float NdotH,
out float VdotH, out vec3 F, out float NDF,
out float etaIn, out float etaOut) {
vec3 H =
_importanceSampleGGX(rnd(seed), rnd(seed), N, shading.roughness, epsilon);

NdotH = abs(dot(N, H));
VdotH = max(dot(H, V), 0.0);
Expand All @@ -183,9 +186,10 @@ void _evalForRefractionBTDF(inout seed, in vec3 L, in vec3 N, in vec3 V,
}

vec3 _eval(inout uint seed, in vec3 L, in vec3 N, in vec3 V, in float epsilon,
in ShadingData shading, out vec3 NdotHForBRDF, out vec3 VdotHForBRDF,
out vec3 NDFForBRDF, out vec3 NdotHForRefractionBTDF,
out vec3 VdotHForRefractionBTDF, out vec3 NDFForRefractionBTDF) {
in ShadingData shading, out float NdotHForBRDF,
out float VdotHForBRDF, out vec3 NDFForBRDF,
out float NdotHForFresnel, out float VdotHForFresnel,
out vec3 NDFForFresnel) {
const float NdotL = abs(dot(L, N));
const float NdotV = abs(dot(N, V));

Expand All @@ -201,60 +205,60 @@ vec3 _eval(inout uint seed, in vec3 L, in vec3 N, in vec3 V, in float epsilon,

float G = _geometrySmith(NdotV, NdotL, shading.roughness);

vec3 NdotHForBRDF;
vec3 VdotHForBRDF;
// float NdotHForBRDF;
// float VdotHForBRDF;
vec3 FForBRDF;
vec3 NDFForBRDF;
vec3 cdiff;

// vec3 NDFForBRDF;
_evalForBRDF(L, N, V, f0, f90, shading, NdotHForBRDF, VdotHForBRDF, FForBRDF,
NDFForBRDF, cdiff);
NDFForBRDF);

vec3 NdotHForRefractionBTDF;
vec3 VdotHForRefractionBTDF;
vec3 FForRefractionBTDF;
vec3 NDFForRefractionBTDF;
// float NdotHForFresnel;
// float VdotHForFresnel;
vec3 FForFresnel;
// vec3 NDFForFresnel;
float etaIn;
float etaOut;
_evalForRefractionBTDF(seed, L, N, V, f0, f90, shading,
NdotHForRefractionBTDF, VdotHForRefractionBTDF,
FForRefractionBTDF, NDFForRefractionBTDF, etaIn,
etaOut);

vec3 radiance = (1.0 - shading.transmission) * _evalDiffuseBRDF(cdiff, F) +

shading.transmission *
_evalRefractionBTDF(
NdotV, NdotL, NdotHForRefractionBTDF,
VdotHForRefractionBTDF, L, V, NDFForRefractionBTDF, G,
FForRefractionBTDF, epsilon, etaIn, etaOut) +
_evalSpecularBRDF(NDF, G, F, epsilon, NdotL, NdotV);
_evalForFresnel(seed, L, N, V, f0, f90, shading, NdotHForFresnel,
VdotHForFresnel, FForFresnel, NDFForFresnel, etaIn, etaOut);

vec3 radiance =
(1.0 - shading.transmission) *
(_evalDiffuseBRDF(NdotL, NdotV, shading.baseColor, shading.metallic,
f0, FForBRDF) +
_evalSpecularBRDF(NdotL, NdotV, NDFForBRDF, G, FForBRDF, epsilon,
NdotL, NdotV)) +

shading.transmission *
(_evalRefractionBTDF(NdotV, NdotL, NdotHForFresnel, VdotHForFresnel,
L, V, NDFForFresnel, G, FForFresnel, epsilon,
etaIn, etaOut) +
_evalSpecularBRDF(NdotL, NdotV, NDFForFresnel, G, FForFresnel,
epsilon, NdotL, NdotV));

return _affectByLight(NdotL, radiance);
}

vec3 eval(inout uint seed, in vec3 L, in vec3 N, in vec3 V, in float epsilon,
in ShadingData shading) {
vec3 NdotHForBRDF;
vec3 VdotHForBRDF;
float NdotHForBRDF;
float VdotHForBRDF;
vec3 NDFForBRDF;

vec3 NdotHForRefractionBTDF;
vec3 VdotHForRefractionBTDF;
vec3 NDFForRefractionBTDF;
float NdotHForFresnel;
float VdotHForFresnel;
vec3 NDFForFresnel;

return _eval(seed, L, N, V, epsilon, shading, NdotHForBRDF, VdotHForBRDF,
NDFForBRDF, NdotHForRefractionBTDF, VdotHForRefractionBTDF,
NDFForRefractionBTDF);
NDFForBRDF, NdotHForFresnel, VdotHForFresnel, NDFForFresnel);
}

vec3 eval(inout uint seed, in vec3 L, in vec3 N, in vec3 V, in float epsilon,
in ShadingData shading, out vec3 NdotHForBRDF, out vec3 VdotHForBRDF,
out vec3 NDFForBRDF, out vec3 NdotHForRefractionBTDF,
out vec3 VdotHForRefractionBTDF, out vec3 NDFForRefractionBTDF) {
in ShadingData shading, out float NdotHForBRDF,
out float VdotHForBRDF, out vec3 NDFForBRDF,
out float NdotHForFresnel, out float VdotHForFresnel,
out vec3 NDFForFresnel) {
return _eval(seed, L, N, V, epsilon, shading, NdotHForBRDF, VdotHForBRDF,
NDFForBRDF, NdotHForRefractionBTDF, VdotHForRefractionBTDF,
NDFForRefractionBTDF);
NDFForBRDF, NdotHForFresnel, VdotHForFresnel, NDFForFresnel);
}

// return the roation matrix
Expand Down Expand Up @@ -361,23 +365,32 @@ vec3 sample(inout uint seed, in const vec3 V, in const vec3 N, in float epsilon,
}
}

float _cosinSamplingPDF(float NdotL) { return NdotL / PI; }
float _cosinSamplePDF(float NdotL) { return NdotL / PI; }

vec3 _importanceSampleGGXPDF(float NDF, float NdotH, float VdotH) {
// ImportanceSampleGGX pdf
// pdf = D * NoH / (4 * VoH)
return NDF * NdotH / (4 * VdotH);
}

float computePdf(const float NdotL, vec3 NdotHForBRDF, vec3 VdotHForBRDF,
vec3 NDFForBRDF, vec3 NdotHForRefractionBTDF,
vec3 VdotHForRefractionBTDF, vec3 NDFForRefractionBTDF,
in ShadingData shading) {
return (1.0 - shading.transmission) * (1.0 - shading.specularLobeProb) *
_cosinSamplingPDF(NdotL) +
shading.transmission * (1.0 - shading.bsdfSpecularLobeProb) *
_importanceSampleGGXPDF(NDFForRefractionBTDF,
NdotHForRefractionBTDF,
VdotHForRefractionBTDF) +
_importanceSampleGGXPDF(NDFForBRDF, NdNDFForBRDF, VdotHForBRDF);
float computePdf(const float NdotL, float NdotHForBRDF, float VdotHForBRDF,
vec3 NDFForBRDF, float NdotHForFresnel, float VdotHForFresnel,
vec3 NDFForFresnel, in ShadingData shading) {
return (1.0 - shading.transmission) *
((1.0 - shading.specularLobeProb) * _cosinSamplePDF(NdotL) +
shading.specularLobeProb *
_importanceSampleGGXPDF(NDFForBRDF, NdotHForBRDF,
VdotHForBRDF)) +
shading.transmission *
/*! ((1.0 - shading.bsdfSpecularLobeProb) *
_importanceSampleGGXPDF(NDFForFresnel,
NdotHForFresnel,
VdotHForFresnel) +
shading.bsdfSpecularLobeProb *
_importanceSampleGGXPDF(NDFForFresnel,
NdotHForFresnel,
VdotHForFresnel));
*/
_importanceSampleGGXPDF(NDFForFresnel, NdotHForFresnel,
VdotHForFresnel);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
vec3 computeDirectLight(float tMin, vec3 worldPosition, vec3 worldNormal,
vec3 V, ShadingData shading,
vec3 computeDirectLight(inout float seed, float epsilon, float tMin,
vec3 worldPosition, vec3 worldNormal, vec3 V,
ShadingData shading,

accelerationStructureEXT topLevelAS) {
uint lightIndexToSample = 0;
Expand Down Expand Up @@ -30,14 +31,7 @@ vec3 computeDirectLight(float tMin, vec3 worldPosition, vec3 worldNormal,

const vec3 L = lightDir;

const vec3 H = normalize(V + L);

const float NdotH = max(0.0, dot(N, H));
const float NdotL = max(0.0, dot(L, N));
const float HdotL = max(0.0, dot(H, L));
const float NdotV = max(0.0, dot(N, V));

vec3 f = eval(NdotL, NdotV, NdotH, HdotL, shading);
vec3 f = eval(seed, L, N, V, epsilon, shading);

/*! not consider light pdf! because its pdf === 1.0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,28 @@
void computeIndirectLight( in vec3 V,
void computeIndirectLight(inout uint seed, in float epsilon, in vec3 V,
in vec3 bsdfDir,

vec3 worldNormal,
in ShadingData shading,
inout vec3 throughput,
inout float t
) {
in vec3 worldNormal, in ShadingData shading,
inout vec3 throughput, inout float t) {
const vec3 N = worldNormal;
const vec3 L = bsdfDir;
const vec3 H = normalize(V + L);

const float NdotH = abs(dot(N, H));
const float NdotL = abs(dot(L, N));
const float HdotL = abs(dot(H, L));
const float NdotV = abs(dot(N, V));

float NdotHForBRDF;
float VdotHForBRDF;
vec3 NDFForBRDF;
float NdotHForFresnel;
float VdotHForFresnel;
vec3 NDFForFresnel;
vec3 f = eval(seed, L, N, V, epsilon, shading, NdotHForBRDF, VdotHForBRDF,
NDFForBRDF, NdotHForFresnel, VdotHForFresnel, NDFForFresnel);

const float pdf = computeDiffuseAndSpecularPdf(NdotH, NdotL, HdotL, shading);
const float pdf =
computePdf(NdotL, NdotHForBRDF, VdotHForBRDF, NDFForBRDF, NdotHForFresnel,
VdotHForFresnel, NDFForFresnel, shading);

if (pdf > 0.0) {
throughput *= eval(NdotL, NdotV, NdotH, HdotL, shading) / pdf;
throughput *= f / pdf;
} else {
t = -1.0;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,29 +45,27 @@ void main() {

float outsideIOR = 1.0;

float bsdfSpecularLobeProb = computeBSDFSpecularLobeProb(
gl_WorldRayDirectionEXT, data.worldNormal, outsideIOR, data.materialIOR);

ShadingData shading = buildShadingData(
data.materialDiffuse, data.materialSpecularColor, data.materialEmission,
data.materialMetalness, data.materialRoughness, data.materialSpecular,
data.materialTransmission, data.materialIOR, outsideIOR,
computeSpecularLobeProb(data.materialDiffuse, data.materialSpecular,
data.materialMetalness),
bsdfSpecularLobeProb,
computeBSDFSpecularLobeProb(gl_WorldRayDirectionEXT, data.worldNormal,
outsideIOR, data.materialIOR),
isFromOutside(gl_WorldRayDirectionEXT, data.worldNormal));

radiance += shading.emission * throughput;

radiance += computeDirectLight(tMin, data.worldPosition, data.worldNormal,
data.V, shading, topLevelAS) *
throughput;
radiance +=
computeDirectLight(seed, EPSILON, tMin, data.worldPosition,
data.worldNormal, data.V, shading, topLevelAS) *
throughput;

const vec3 bsdfDir =
disneySample(seed, data.V, data.worldNormal, EPSILON, shading);
const vec3 bsdfDir = sample(seed, data.V, data.worldNormal, EPSILON, shading);

computeIndirectLight(data.V, bsdfDir, data.worldNormal, shading, throughput,
t);
computeIndirectLight(seed, EPSILON, data.V, bsdfDir, data.worldNormal,
shading, throughput, t);

prd.radiance = radiance;
prd.t = t;
Expand Down

0 comments on commit 40eedc3

Please sign in to comment.