我已经编写了一个部分基于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种不同的组合和变量,我就是不明白为什么它不允许这个变量与其他变量组合。我不明白为什么把irradiance.r乘以refldo.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);或者以上的任何组合,你都可以想象得到。它周围的所有其他变量都可以正常工作和输出。只有当使用该特定变量执行操作时,事情才会出错。我真的无法理解为什么不这样做,而且我在网上几乎找不到答案。
发布于 2017-04-21 22:44:39
很可能是由于albedo未定义、类型错误等原因导致着色器编译失败。您是否在着色器中定义了uniform vec3 albedo;或等效项?
从您所展示的示例来看,这显然是albedo而不是irradiance的问题。
发布于 2021-09-29 04:26:42
我解决了这个问题,当你加载纹理时,你必须添加这个代码:
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);它工作得很好,但在本节中,您必须同时使用这两种方法。
https://stackoverflow.com/questions/43532018
复制相似问题