@@ -36,8 +36,12 @@ float DisneyPdf(in Ray ray, inout State state, in vec3 bsdfDir)
36
36
vec3 L = bsdfDir;
37
37
vec3 H = normalize (L + V);
38
38
39
+ // if (dot(N, L) < 0.0)
40
+ // return 1.0;
41
+
39
42
float NDotH = dot (N, H);
40
43
44
+ float specularAlpha = mix (0.1 , 0.001 , state.mat.roughness);
41
45
float clearcoatAlpha = mix (0.1 , 0.001 , state.mat.clearcoatGloss);
42
46
43
47
float diffuseRatio = 0.5 * (1.0 - state.mat.metallic);
@@ -47,15 +51,19 @@ float DisneyPdf(in Ray ray, inout State state, in vec3 bsdfDir)
47
51
float ax = max (0.001 , (state.mat.roughness * state.mat.roughness) / aspect);
48
52
float ay = max (0.001 , (state.mat.roughness * state.mat.roughness) * aspect);
49
53
50
- // calculate diffuse and specular pdfs and mix ratio
51
- float pdfGTR2 = GTR2_aniso(NDotH, dot (H, state.tangent), dot (H, state.bitangent), ax, ay) * NDotH;
54
+ // PDFs for brdf
55
+ float pdfGTR2_aniso = GTR2_aniso(NDotH, dot (H, state.tangent), dot (H, state.bitangent), ax, ay) * NDotH;
52
56
float pdfGTR1 = GTR1(NDotH, clearcoatAlpha) * NDotH;
53
57
float ratio = 1.0 / (1.0 + state.mat.clearcoat);
54
- float pdfSpec = mix (pdfGTR1, pdfGTR2 , ratio) / (4.0 * abs (dot (L, H)));
58
+ float pdfSpec = mix (pdfGTR1, pdfGTR2_aniso , ratio) / (4.0 * abs (dot (L, H)));
55
59
float pdfDiff = abs (dot (L, N)) * (1.0 / PI);
60
+ float brdfPdf = diffuseRatio * pdfDiff + specularRatio * pdfSpec;
61
+
62
+ // PDFs for bsdf
63
+ float pdfGTR2 = GTR2(NDotH, specularAlpha) * NDotH;
64
+ float bsdfPdf = pdfGTR2 / (4.0 * abs (dot (L, H)));
56
65
57
- // weigh pdfs according to ratios
58
- return diffuseRatio * pdfDiff + specularRatio * pdfSpec;
66
+ return brdfPdf;// mix(brdfPdf, bsdfPdf, state.mat.transmission);
59
67
}
60
68
61
69
// -----------------------------------------------------------------------
@@ -67,32 +75,47 @@ vec3 DisneySample(in Ray ray, inout State state)
67
75
68
76
vec3 dir;
69
77
70
- float probability = rand();
71
- float diffuseRatio = 0.5 * (1.0 - state.mat.metallic);
72
-
73
78
float r1 = rand();
74
79
float r2 = rand();
80
+ // float bsdfProb = rand();
75
81
76
- if (probability < diffuseRatio) // sample diffuse
77
- {
78
- dir = CosineSampleHemisphere(r1, r2);
79
- dir = state.tangent * dir.x + state.bitangent * dir.y + N * dir.z;
80
- }
81
- else
82
+ // BSDF
83
+ /* if (bsdfProb < state.mat.transmission)
82
84
{
83
- float a = max (0.001 , state.mat.roughness);
84
-
85
- float phi = r1 * 2.0 * PI;
85
+ float n1 = 1.0;
86
+ float n2 = state.mat.ior;
86
87
87
- float cosTheta = sqrt ((1.0 - r2) / (1.0 + (a* a - 1.0 ) * r2));
88
- float sinTheta = clamp (sqrt (1.0 - (cosTheta * cosTheta)), 0.0 , 1.0 );
89
- float sinPhi = sin (phi);
90
- float cosPhi = cos (phi);
88
+ float theta = abs(dot(-V, N));
89
+ float eta = dot(state.normal, state.ffnormal) > 0.0 ? (n1 / n2) : (n2 / n1);
90
+ float cos2t = 1.0 - eta * eta * (1.0 - theta * theta);
91
91
92
- vec3 H = vec3 (sinTheta * cosPhi, sinTheta * sinPhi, cosTheta );
92
+ vec3 H = ImportanceSampleGGX(state.mat.roughness, r1, r2 );
93
93
H = state.tangent * H.x + state.bitangent * H.y + N * H.z;
94
94
95
- dir = 2.0 * dot (V, H)* H - V;
95
+ float F = Fresnel(theta, n1, n2);
96
+
97
+ if (cos2t < 0.0 || rand() < F)
98
+ dir = normalize(reflect(-V, H));
99
+ else
100
+ dir = normalize(refract(-V, H, eta));
101
+ }
102
+ else*/
103
+ {
104
+ float probability = rand();
105
+ float diffuseRatio = 0.5 * (1.0 - state.mat.metallic);
106
+
107
+ if (probability < diffuseRatio)
108
+ {
109
+ vec3 H = CosineSampleHemisphere(r1, r2);
110
+ H = state.tangent * H.x + state.bitangent * H.y + N * H.z;
111
+ dir = H;
112
+ }
113
+ else
114
+ {
115
+ vec3 H = ImportanceSampleGGX(state.mat.roughness, r1, r2);
116
+ H = state.tangent * H.x + state.bitangent * H.y + N * H.z;
117
+ dir = reflect (- V, H);
118
+ }
96
119
}
97
120
return dir;
98
121
}
0 commit comments