|
@@ -34,7 +34,7 @@ void brdfKernel(){
|
|
float NdotH = max(H.z, 0.0);
|
|
float NdotH = max(H.z, 0.0);
|
|
float VdotH = max(dot(V, H), 0.0);
|
|
float VdotH = max(dot(V, H), 0.0);
|
|
if(NdotL > 0.0){
|
|
if(NdotL > 0.0){
|
|
- float G = GeometrySmith(N, V, L, m_Roughness);
|
|
|
|
|
|
+ float G = GeometrySmith(N, V, L, m_Roughness*m_Roughness);
|
|
float G_Vis = (G * VdotH) / (NdotH * NdotV);
|
|
float G_Vis = (G * VdotH) / (NdotH * NdotV);
|
|
float Fc = pow(1.0 - VdotH, 5.0);
|
|
float Fc = pow(1.0 - VdotH, 5.0);
|
|
A += (1.0 - Fc) * G_Vis;
|
|
A += (1.0 - Fc) * G_Vis;
|
|
@@ -75,9 +75,7 @@ void prefilteredEnvKernel(){
|
|
vec3 R = N;
|
|
vec3 R = N;
|
|
vec3 V = R;
|
|
vec3 V = R;
|
|
|
|
|
|
- // float a2 = m_Roughness;
|
|
|
|
- float a2 = m_Roughness * m_Roughness; // jme impl, why?
|
|
|
|
- a2 *= a2;
|
|
|
|
|
|
+ float a2 = m_Roughness * m_Roughness;
|
|
|
|
|
|
const uint SAMPLE_COUNT = 1024u;
|
|
const uint SAMPLE_COUNT = 1024u;
|
|
float totalWeight = 0.0;
|
|
float totalWeight = 0.0;
|
|
@@ -85,16 +83,25 @@ void prefilteredEnvKernel(){
|
|
for(uint i = 0u; i < SAMPLE_COUNT; ++i) {
|
|
for(uint i = 0u; i < SAMPLE_COUNT; ++i) {
|
|
vec4 Xi = Hammersley(i, SAMPLE_COUNT);
|
|
vec4 Xi = Hammersley(i, SAMPLE_COUNT);
|
|
vec3 H = ImportanceSampleGGX(Xi, a2, N);
|
|
vec3 H = ImportanceSampleGGX(Xi, a2, N);
|
|
- float VoH = dot(V,H);
|
|
|
|
|
|
+ float VoH = max(dot(V, H), 0.0);
|
|
vec3 L = normalize(2.0 * VoH * H - V);
|
|
vec3 L = normalize(2.0 * VoH * H - V);
|
|
float NdotL = max(dot(N, L), 0.0);
|
|
float NdotL = max(dot(N, L), 0.0);
|
|
if(NdotL > 0.0) {
|
|
if(NdotL > 0.0) {
|
|
|
|
+ vec3 sampleColor = texture(m_EnvMap, L).rgb;
|
|
|
|
+
|
|
|
|
+ float luminance = dot(sampleColor, vec3(0.2126, 0.7152, 0.0722));
|
|
|
|
+ if (luminance > 64.0) { // TODO use average?
|
|
|
|
+ sampleColor *= 64.0/luminance;
|
|
|
|
+ }
|
|
|
|
+
|
|
// TODO: use mipmap
|
|
// TODO: use mipmap
|
|
- prefilteredColor += texture(m_EnvMap, L).rgb * NdotL;
|
|
|
|
|
|
+ prefilteredColor += sampleColor * NdotL;
|
|
totalWeight += NdotL;
|
|
totalWeight += NdotL;
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
- prefilteredColor = prefilteredColor / totalWeight;
|
|
|
|
|
|
+
|
|
|
|
+ if(totalWeight > 0.001) prefilteredColor /= totalWeight;
|
|
outFragColor = vec4(prefilteredColor, 1.0);
|
|
outFragColor = vec4(prefilteredColor, 1.0);
|
|
}
|
|
}
|
|
|
|
|