mirror of
https://github.com/JoeyDeVries/LearnOpenGL.git
synced 2026-01-02 04:37:54 +08:00
PBR IBL irradiance tutorials.
This commit is contained in:
3354
resources/textures/hdr/newport_loft.hdr
Normal file
3354
resources/textures/hdr/newport_loft.hdr
Normal file
File diff suppressed because one or more lines are too long
@@ -51,7 +51,7 @@ int main()
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
glfwWindowHint(GLFW_SAMPLES, 32);
|
||||
glfwWindowHint(GLFW_SAMPLES, 4);
|
||||
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
||||
|
||||
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr); // Windowed
|
||||
|
||||
@@ -64,7 +64,6 @@ void main()
|
||||
{
|
||||
vec3 N = normalize(Normal);
|
||||
vec3 V = normalize(camPos - WorldPos);
|
||||
vec3 R = reflect(-V, N);
|
||||
|
||||
// calculate reflectance at normal incidence; if dia-electric (like plastic) use F0
|
||||
// of 0.04 and if it's a metal, use their albedo color as F0 (metallic workflow)
|
||||
@@ -88,7 +87,7 @@ void main()
|
||||
vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
|
||||
|
||||
vec3 nominator = NDF * G * F;
|
||||
float denominator = 4 * max(dot(V, N), 0.0) * max(dot(L, N), 0.0) + 0.001; // 0.001 to prevent divide by zero.
|
||||
float denominator = 4 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.001; // 0.001 to prevent divide by zero.
|
||||
vec3 brdf = nominator / denominator;
|
||||
|
||||
// kS is equal to Fresnel
|
||||
|
||||
@@ -91,7 +91,6 @@ void main()
|
||||
|
||||
vec3 N = getNormalFromMap();
|
||||
vec3 V = normalize(camPos - WorldPos);
|
||||
vec3 R = reflect(-V, N);
|
||||
|
||||
// calculate reflectance at normal incidence; if dia-electric (like plastic) use F0
|
||||
// of 0.04 and if it's a metal, use their albedo color as F0 (metallic workflow)
|
||||
@@ -114,7 +113,11 @@ void main()
|
||||
float G = GeometrySmith(N, V, L, roughness);
|
||||
vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
|
||||
|
||||
// kS is equal to Fresnel
|
||||
vec3 nominator = NDF * G * F;
|
||||
float denominator = 4 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.001; // 0.001 to prevent divide by zero.
|
||||
vec3 brdf = nominator / denominator;
|
||||
|
||||
// kS is equal to Fresnel
|
||||
vec3 kS = F;
|
||||
// for energy conservation, the diffuse and specular light can't
|
||||
// be above 1.0 (unless the surface emits light); to preserve this
|
||||
@@ -125,15 +128,11 @@ void main()
|
||||
// have no diffuse light).
|
||||
kD *= 1.0 - metallic;
|
||||
|
||||
vec3 nominator = NDF * G * F;
|
||||
float denominator = 4 * max(dot(V, N), 0.0) * max(dot(L, N), 0.0) + 0.001; // 0.001 to prevent divide by zero.
|
||||
vec3 brdf = nominator / denominator;
|
||||
|
||||
// scale light by NdotL
|
||||
float NdotL = max(dot(N, L), 0.0);
|
||||
|
||||
// add to outgoing radiance Lo
|
||||
Lo += (kD * albedo / PI + brdf) * radiance * NdotL; // note that we already multiplied the BRDF by the Fresnel (kS) so we won't multiply by kS again
|
||||
Lo += (kD * albedo / PI + brdf) * radiance * NdotL; // note that we already multiplied the BRDF by the Fresnel (kS) so we won't multiply by kS again
|
||||
}
|
||||
|
||||
// ambient lighting (note that the next IBL tutorial will replace
|
||||
|
||||
@@ -7,7 +7,6 @@ uniform samplerCube environmentMap;
|
||||
void main()
|
||||
{
|
||||
vec3 envColor = texture(environmentMap, WorldPos).rgb;
|
||||
// envColor *= vec3(1.0, 0.0, 0.0);
|
||||
|
||||
// HDR tonemap and gamma correct
|
||||
envColor = envColor / (envColor + vec3(1.0));
|
||||
|
||||
@@ -91,7 +91,11 @@ void main()
|
||||
float G = GeometrySmith(N, V, L, roughness);
|
||||
vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
|
||||
|
||||
// kS is equal to Fresnel
|
||||
vec3 nominator = NDF * G * F;
|
||||
float denominator = 4 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.001; // 0.001 to prevent divide by zero.
|
||||
vec3 brdf = nominator / denominator;
|
||||
|
||||
// kS is equal to Fresnel
|
||||
vec3 kS = F;
|
||||
// for energy conservation, the diffuse and specular light can't
|
||||
// be above 1.0 (unless the surface emits light); to preserve this
|
||||
@@ -102,18 +106,14 @@ void main()
|
||||
// have no diffuse light).
|
||||
kD *= 1.0 - metallic;
|
||||
|
||||
vec3 nominator = NDF * G * F;
|
||||
float denominator = 4 * max(dot(V, N), 0.0) * max(dot(L, N), 0.0) + 0.001; // 0.001 to prevent divide by zero.
|
||||
vec3 brdf = nominator / denominator;
|
||||
|
||||
// scale light by NdotL
|
||||
float NdotL = max(dot(N, L), 0.0);
|
||||
|
||||
// add to outgoing radiance Lo
|
||||
Lo += (kD * albedo / PI + brdf) * radiance * NdotL; // note that we already multiplied the BRDF by the Fresnel (kS) so we won't multiply by kS again
|
||||
Lo += (kD * albedo / PI + brdf) * radiance * NdotL; // note that we already multiplied the BRDF by the Fresnel (kS) so we won't multiply by kS again
|
||||
}
|
||||
|
||||
vec3 ambient = vec3(0.002);
|
||||
vec3 ambient = vec3(0.03) * albedo * ao;
|
||||
|
||||
vec3 color = ambient + Lo;
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ int main()
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
glfwWindowHint(GLFW_SAMPLES, 4);
|
||||
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
||||
|
||||
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr); // Windowed
|
||||
@@ -269,11 +270,11 @@ int main()
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, envCubemap);
|
||||
renderCube();
|
||||
|
||||
//equirectangularToCubemapShader.Use();
|
||||
//glUniformMatrix4fv(glGetUniformLocation(equirectangularToCubemapShader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view));
|
||||
//glActiveTexture(GL_TEXTURE0);
|
||||
//glBindTexture(GL_TEXTURE_2D, hdrTexture);
|
||||
//renderCube();
|
||||
/* equirectangularToCubemapShader.Use();
|
||||
glUniformMatrix4fv(glGetUniformLocation(equirectangularToCubemapShader.Program, "view"), 1, GL_FALSE, glm::value_ptr(view));
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, hdrTexture);
|
||||
renderCube();*/
|
||||
|
||||
|
||||
// Swap the buffers
|
||||
|
||||
@@ -62,11 +62,6 @@ vec3 fresnelSchlick(float cosTheta, vec3 F0)
|
||||
return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
|
||||
}
|
||||
// ----------------------------------------------------------------------------
|
||||
vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness)
|
||||
{
|
||||
return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cosTheta, 5.0);
|
||||
}
|
||||
// ----------------------------------------------------------------------------
|
||||
void main()
|
||||
{
|
||||
vec3 N = Normal;
|
||||
@@ -94,6 +89,10 @@ void main()
|
||||
float G = GeometrySmith(N, V, L, roughness);
|
||||
vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
|
||||
|
||||
vec3 nominator = NDF * G * F;
|
||||
float denominator = 4 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.001; // 0.001 to prevent divide by zero.
|
||||
vec3 brdf = nominator / denominator;
|
||||
|
||||
// kS is equal to Fresnel
|
||||
vec3 kS = F;
|
||||
// for energy conservation, the diffuse and specular light can't
|
||||
@@ -105,10 +104,6 @@ void main()
|
||||
// have no diffuse light).
|
||||
kD *= 1.0 - metallic;
|
||||
|
||||
vec3 nominator = NDF * G * F;
|
||||
float denominator = 4 * max(dot(V, N), 0.0) * max(dot(L, N), 0.0) + 0.001; // 0.001 to prevent divide by zero.
|
||||
vec3 brdf = nominator / denominator;
|
||||
|
||||
// scale light by NdotL
|
||||
float NdotL = max(dot(N, L), 0.0);
|
||||
|
||||
@@ -117,7 +112,7 @@ void main()
|
||||
}
|
||||
|
||||
// ambient lighting (we now use IBL as the ambient term)
|
||||
vec3 kS = fresnelSchlickRoughness(max(dot(N, V), 0.0), F0, roughness);
|
||||
vec3 kS = fresnelSchlick(max(dot(N, V), 0.0), F0);
|
||||
vec3 kD = 1.0 - kS;
|
||||
kD *= 1.0 - metallic;
|
||||
vec3 irradiance = texture(irradianceMap, N).rgb;
|
||||
@@ -132,6 +127,5 @@ void main()
|
||||
// gamma correct
|
||||
color = pow(color, vec3(1.0/2.2));
|
||||
|
||||
FragColor = vec4(color, 1.0);
|
||||
// FragColor = vec4(N * 0.5 + 0.5, 1.0);
|
||||
FragColor = vec4(color , 1.0);
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ int main()
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
glfwWindowHint(GLFW_SAMPLES, 4);
|
||||
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
||||
|
||||
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr); // Windowed
|
||||
|
||||
Reference in New Issue
Block a user