GLSL - PBR着色器 - 漫反射IBL组件无法渲染

时间:2017-04-21 00:31:14

标签: opengl glsl rendering

我已经部署了一个基于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);

或者您可以梦想的任何上述组合。 它周围的所有其他变量都能正常工作和输出。只有在使用该特定变量执行操作时才会出现问题。我实际上无法理解为什么不在网上找到答案。

1 个答案:

答案 0 :(得分:2)

由于albedo未定义,类型错误等,很可能着色器编译失败。您在着色器中定义了uniform vec3 albedo;或等效物?

根据您展示的示例,albedo而非irradiance确实存在问题。