Skip to content

Commit

Permalink
feat(cloud-picture): fix bsdf glsl(pass compile)
Browse files Browse the repository at this point in the history
  • Loading branch information
yyc-git committed Oct 14, 2020
1 parent 40eedc3 commit 04dc06c
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
// return vec2(saturateFloat(v.x), saturateFloat(v.y));
// }

float max(float f1, float f2, float f3) { return max(max(f1, f2), f3); }

uint getPixelIndex(vec2 uv, vec2 resolution) {
const ivec2 bufferCoord = ivec2(floor(uv * resolution));

Expand Down
155 changes: 74 additions & 81 deletions src/run/cloud_picture/domain_layer/domain/shader/ray_tracing/bsdf.glsl
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

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

/*!
while BTDF is not reciprocal(refer to
https://github.com/aceyan/Unity3D_PBR_Path_Tracer), we only consider eta, not
Expand Down Expand Up @@ -67,7 +69,7 @@ bool isFromOutside(vec3 rayDirection, vec3 N) {
}

vec3 _fresnelSchlick(float VdotH, vec3 f0, float f90) {
return f0 + (vec3(f90) - f0) * pow5(1.0 - VdotH);
return f0 + (vec3(f90) - f0) * _pow5(1.0 - VdotH);
}

float _distributionGGX(float NdotH, float roughness) {
Expand Down Expand Up @@ -99,8 +101,6 @@ float _geometrySmith(float NdotV, float NdotL, float roughness) {
return ggx1 * ggx2;
}

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

vec3 _evalDiffuseBRDF(float NdotL, float NdotV, vec3 baseColor, float metallic,
vec3 f0, vec3 F) {
if (NdotL <= 0.0 || NdotV <= 0.0)
Expand All @@ -113,7 +113,7 @@ vec3 _evalDiffuseBRDF(float NdotL, float NdotV, vec3 baseColor, float metallic,
}

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

Expand All @@ -139,8 +139,8 @@ 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 LdotH, 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;
float term3 =
Expand All @@ -163,19 +163,46 @@ void _evalForBRDF(in vec3 L, in vec3 N, in vec3 V, in vec3 f0, in float f90,
NDF = _distributionGGX(NdotH, shading.roughness);
}

vec3 computeHForFresnel() {
_importanceSampleGGX(rnd(seed), rnd(seed), N, roughness, epsilon)
// return the roation matrix
mat3x3 _buildTBN(vec3 N, in float epsilon) {
const vec3 U = abs(N.z) < (1.0 - epsilon) ? vec3(0, 0, 1) : vec3(1, 0, 0);
const vec3 T = normalize(cross(U, N));
const vec3 B = cross(N, T);

return mat3x3(T, B, N);
}

vec3 _importanceSampleGGX(float u1, float u2, vec3 N, float roughness,
float epsilon) {
float a = roughness * roughness;

float phi = 2.0 * PI * u1;
float cosTheta = sqrt((1.0 - u2) / (1.0 + (a * a - 1.0) * u2));
float sinTheta = sqrt(1.0 - cosTheta * cosTheta);

// from spherical coordinates to cartesian coordinates
vec3 H;
H.x = cos(phi) * sinTheta;
H.y = sin(phi) * sinTheta;
H.z = cosTheta;

vec3 halfVec = H * _buildTBN(N, epsilon);
halfVec = normalize(halfVec);

return halfVec;
}

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,
void _evalForFresnel(inout uint seed, in float epsilon, 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 float LdotH, 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);
LdotH = abs(dot(L, H));

F = _fresnelSchlick(VdotH, f0, f90);

Expand All @@ -187,15 +214,16 @@ void _evalForFresnel(inout seed, in vec3 L, in vec3 N, in vec3 V, in vec3 f0,

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

float dielectricSpecular = ((shading.ior - shading.outsideIOR) /
(shading.ior + shading.outsideIOR)) ^
2 * shading.specular;
float dielectricSpecular = pow((shading.ior - shading.outsideIOR) /
(shading.ior + shading.outsideIOR),
2) *
shading.specular;

vec3 dielectricSpecularF0 = vec3(dielectricSpecular) * shading.specularColor;
float dielectricSpecularF90 = shading.specular;
Expand All @@ -205,35 +233,30 @@ vec3 _eval(inout uint seed, in vec3 L, in vec3 N, in vec3 V, in float epsilon,

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

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

// float NdotHForFresnel;
// float VdotHForFresnel;
float LdotHDorFresnel;
vec3 FForFresnel;
// vec3 NDFForFresnel;
float etaIn;
float etaOut;
_evalForFresnel(seed, L, N, V, f0, f90, shading, NdotHForFresnel,
VdotHForFresnel, FForFresnel, NDFForFresnel, etaIn, etaOut);
_evalForFresnel(seed, epsilon, L, N, V, f0, f90, shading, NdotHForFresnel,
VdotHForFresnel, LdotHDorFresnel, 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)) +
_evalSpecularBRDF(NdotL, NdotV, NDFForBRDF, G, FForBRDF, epsilon)) +

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

return _affectByLight(NdotL, radiance);
}
Expand All @@ -242,55 +265,25 @@ vec3 eval(inout uint seed, in vec3 L, in vec3 N, in vec3 V, in float epsilon,
in ShadingData shading) {
float NdotHForBRDF;
float VdotHForBRDF;
vec3 NDFForBRDF;
float NDFForBRDF;

float NdotHForFresnel;
float VdotHForFresnel;
vec3 NDFForFresnel;
float NDFForFresnel;

return _eval(seed, L, N, V, epsilon, shading, NdotHForBRDF, VdotHForBRDF,
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 float NdotHForBRDF,
out float VdotHForBRDF, out vec3 NDFForBRDF,
out float NdotHForFresnel, out float VdotHForFresnel,
out vec3 NDFForFresnel) {
in ShadingData shading, out float NdotHForBRDF,
out float VdotHForBRDF, out float NDFForBRDF,
out float NdotHForFresnel, out float VdotHForFresnel,
out float NDFForFresnel) {
return _eval(seed, L, N, V, epsilon, shading, NdotHForBRDF, VdotHForBRDF,
NDFForBRDF, NdotHForFresnel, VdotHForFresnel, NDFForFresnel);
}

// return the roation matrix
mat3x3 _buildTBN(vec3 normal, in float epsilon) {
const vec3 U =
abs(normal.z) < (1.0 - epsilon) ? vec3(0, 0, 1) : vec3(1, 0, 0);
const vec3 T = normalize(cross(U, N));
const vec3 B = cross(N, T);

return mat3x3(T, B, N);
}

vec3 _importanceSampleGGX(float u1, float u2, vec3 N, float roughness,
float epsilon) {
float a = roughness * roughness;

float phi = 2.0 * PI * u1;
float cosTheta = sqrt((1.0 - u2) / (1.0 + (a * a - 1.0) * u2));
float sinTheta = sqrt(1.0 - cosTheta * cosTheta);

// from spherical coordinates to cartesian coordinates
vec3 H;
H.x = cos(phi) * sinTheta;
H.y = sin(phi) * sinTheta;
H.z = cosTheta;

vec3 halfVec = H * _buildTBN(N, epsilon);
halfVec = normalize(halfVec);

return halfVec;
}

vec3 _cosineSampleHemisphere(float u1, float u2) {
vec3 dir;
float r = sqrt(u1);
Expand All @@ -301,7 +294,7 @@ vec3 _cosineSampleHemisphere(float u1, float u2) {
return dir;
}

vec3 _sampleSpecularBRDF(float r1, float r2, vec3 N, float roughness,
vec3 _sampleSpecularBRDF(float r1, float r2, vec3 N, vec3 V, float roughness,
float epsilon) {
vec3 halfVec = _importanceSampleGGX(r1, r2, N, roughness, epsilon);

Expand All @@ -311,27 +304,27 @@ vec3 _sampleSpecularBRDF(float r1, float r2, vec3 N, float roughness,
return reflect(getRayDirectionFromV(V), halfVec);
}

vec3 _sampleRefractionBTDF(float r1, float r2, vec3 N, bool isFromOutside,
float roughness, float ior, float outsideIOR,
float epsilon) {
vec3 _sampleRefractionBTDF(float r1, float r2, vec3 N, vec3 V,
bool isFromOutside, float roughness, float ior,
float outsideIOR, float epsilon) {
vec3 halfVec = _importanceSampleGGX(r1, r2, N, roughness, epsilon);

float eta = isFromOutside ? outsideIOR / ior : ior / outsideIOR;

return normalize(refract(getRayDirectionFromV(V), halfVec, eta));
}

vec3 sample(inout uint seed, in const vec3 V, in const vec3 N, in float epsilon,
in ShadingData shading) {
if (rnd(seed) < 1.0 - transmission) {
vec3 sample_(inout uint seed, in vec3 V, in vec3 N, in float epsilon,
in ShadingData shading) {
if (rnd(seed) < 1.0 - shading.transmission) {
// BRDF

if (rnd(seed) < shading.specularLobeProb) {
// specular

// r2 /= shading.specularLobeProb;

return _sampleSpecularBRDF(rnd(seed), rnd(seed), N, shading.roughness,
return _sampleSpecularBRDF(rnd(seed), rnd(seed), N, V, shading.roughness,
epsilon);
}

Expand All @@ -350,7 +343,7 @@ vec3 sample(inout uint seed, in const vec3 V, in const vec3 N, in float epsilon,

// r2 /= shading.bsdfSpecularLobeProb;

return _sampleSpecularBRDF(rnd(seed), rnd(seed), N, shading.roughness,
return _sampleSpecularBRDF(rnd(seed), rnd(seed), N, V, shading.roughness,
epsilon);
}

Expand All @@ -359,23 +352,23 @@ vec3 sample(inout uint seed, in const vec3 V, in const vec3 N, in float epsilon,
// r2 -= shading.bsdfSpecularLobeProb;
// r2 /= (1.0 - shading.bsdfSpecularLobeProb);

return _sampleRefractionBTDF(rnd(seed), rnd(seed), N, shading.isFromOutside,
shading.roughness, shading.ior,
shading.outsideIOR, epsilon);
return _sampleRefractionBTDF(rnd(seed), rnd(seed), N, V,
shading.isFromOutside, shading.roughness,
shading.ior, shading.outsideIOR, epsilon);
}
}

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

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

float computePdf(const float NdotL, float NdotHForBRDF, float VdotHForBRDF,
vec3 NDFForBRDF, float NdotHForFresnel, float VdotHForFresnel,
vec3 NDFForFresnel, in ShadingData shading) {
float computePdf(float NdotL, float NdotHForBRDF, float VdotHForBRDF,
float NDFForBRDF, float NdotHForFresnel, float VdotHForFresnel,
float NDFForFresnel, ShadingData shading) {
return (1.0 - shading.transmission) *
((1.0 - shading.specularLobeProb) * _cosinSamplePDF(NdotL) +
shading.specularLobeProb *
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@

#define EPSILON 0.001
#define EPSILON 0.001

#define PI 3.141592653589793

#define TWO_PI 6.283185307179586
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
vec3 computeDirectLight(inout float seed, float epsilon, float tMin,

vec3 computeDirectLight(inout uint seed, float epsilon, float tMin,
vec3 worldPosition, vec3 worldNormal, vec3 V,
ShadingData shading,

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

void computeIndirectLight(inout uint seed, in float epsilon, in vec3 V,
in vec3 bsdfDir,

Expand All @@ -10,10 +11,10 @@ void computeIndirectLight(inout uint seed, in float epsilon, in vec3 V,

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ layout(location = 1) rayPayloadEXT bool isShadowed;

#include "ggx_direct.glsl"

layout(location = 0) rayPayloadInEXT hitPayload prd;

#include "ggx_indirect.glsl"

layout(location = 0) rayPayloadInEXT hitPayload prd;

layout(set = 0, binding = 0) uniform accelerationStructureEXT topLevelAS;

void main() {
Expand Down Expand Up @@ -62,7 +62,8 @@ void main() {
data.worldNormal, data.V, shading, topLevelAS) *
throughput;

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

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

0 comments on commit 04dc06c

Please sign in to comment.