[英]GLSL - PBR Shader - Diffuse IBL component failing to render
我整理了一个部分基于 learnopengl.com 的程序。
当使用 irradianceMap 计算环境分量时,失败的部分是在 PBR 着色器的片段着色器中。 我已经验证 map 以及所有其他贴图已正确发送到着色器。
在没有 IBL 的情况下运行时,场景如下所示:
但是当使用 IBL 运行时,它看起来像这样:
如您所见,带有 PBR 着色器的球体消失了。
导致问题的部分如下:
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;
vec3 diffuse = irradiance * albedo;
vec3 ambient = kD * vec3(diffuse) * ao;
colour = ambient +Lo;
具体来说,问题在于辐照度变量,当我对它执行正常操作时,它工作正常,例如,如果我将它乘以 0.01,它会像预期的那样显着变暗。 但是,当我将反照率变量与辐照度相加或相乘时,它会失败,没有任何东西是 output。我已经尝试了 1000 种不同的组合和变量,我只是不明白为什么它不允许这个变量与其他变量组合。 我不明白为什么将 irradiance.r 乘以 albedo.r 以某种方式产生任何结果。 即使两者都为 0,结果也会是黑色,而不是球体完全消失。
这例如有效:
vec3 irradiance = texture(irradianceMap, N).rgb;
colour = irradiance;
以及这个:
vec3 irradiance = texture(irradianceMap, N).rgb;
colour = irradiance*0.01;
但这失败了:
vec3 irradiance = texture(irradianceMap, N).rgb;
colour = irradiance*albedo;
以及这个:
vec3 irradiance = texture(irradianceMap, N).rgb;
colour = vec3(irradiance.r,albedo.g,albedo.b);
或者您可以想到的上述任何组合。 它周围的所有其他变量都有效,并且 output 正确。 只有当使用该特定变量执行操作时,才会出现 go 错误。 我真的无法理解为什么不这样做,并且在网上找到的答案很少。
由于albedo
未定义,类型错误等,最有可能的着色器编译失败uniform vec3 albedo;
或在着色器中定义的等效项?
从您显示的示例来看, albedo
当然是问题,而不是irradiance
。
我解决了这个问题,你必须在加载纹理时添加这段代码:
shader.setInt("albedoMap", 0);
shader.setInt("normalMap", 1);
shader.setInt("metallicMap", 2);
shader.setInt("roughnessMap", 3);
shader.setInt("aoMap", 4);
shader.setInt("irradianceMap", 5);
这是我之前所做的:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, albedoMap);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, normalMap);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, metallicMap);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, roughnessMap);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, aoMap);
glActiveTexture(GL_TEXTURE5);
glBindTexture(GL_TEXTURE_CUBE_MAP, irradianceMap);
它工作正常,但在本节中,您必须同时使用两者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.