【问题标题】:GLSL - PBR Shader - Diffuse IBL component failing to renderGLSL - PBR 着色器 - 漫反射 IBL 组件无法渲染
【发布时间】:2023-03-18 19:52:01
【问题描述】:

我已经编写了一个部分基于 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 乘以 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);

或者您可以梦想的上述任何组合。 它周围的所有其他变量都可以正常工作和输出。只有当使用该特定变量执行操作时才会出错。我真的无法理解为什么不这样做,并且在网上找到的答案很少。

【问题讨论】:

  • 无论你在片段着色器中改变什么,球体都不能完全消失......所以这可能意味着片段着色器编译失败并且引擎甚至没有渲染它们,所以你应该检查你的日志着色器编译错误。唯一可能导致球体消失的其他事情是顶点着色器中的更改或片段着色器中的 alpha 设置为 0(如果球体使用混合)或丢弃;片段着色器中的操作。你能展示你正在使用的完整的顶点和片段着色器吗?

标签: opengl glsl rendering


【解决方案1】:

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

从您展示的示例来看,这肯定是albedo 的问题,而不是irradiance。

【讨论】:

    【解决方案2】:

    我解决了这个问题,你必须在加载纹理时添加这个代码:

    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);
    

    它工作正常,但在本节中,您必须同时使用两者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多