我已经部署了一个基于learnopengl.com的程序
使用irradianceMap计算环境组件时,失败的部分位于PBR着色器的片段着色器中。我已经验证了地图正确地发送到着色器,以及所有其他地图。
在没有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,它会像预期的那样显着变暗。然而,当我添加或乘以例如具有辐照度的反照率变量时,它会失败,并且不会输出任何内容。我已经尝试了1000种不同的组合和变量,我根本无法理解为什么它不允许这个变量与其他变量结合。我不知道为什么乘以反射率来反射。反射率。某种程度上什么也没产生。即使两者都是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);
或者您可以梦想的任何上述组合。 它周围的所有其他变量都能正常工作和输出。只有在使用该特定变量执行操作时才会出现问题。我实际上无法理解为什么不在网上找到答案。
答案 0 :(得分:2)
由于albedo
未定义,类型错误等,很可能着色器编译失败。您在着色器中定义了uniform vec3 albedo;
或等效物?
根据您展示的示例,albedo
而非irradiance
确实存在问题。