首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL - PBR着色器-无法渲染漫反射IBL组件

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

Stack Overflow用户
提问于 2017-04-21 08:31:14
回答 2查看 735关注 0票数 0

我已经编写了一个部分基于learnopengl.com的程序。

使用irradianceMap计算环境光组件时,失败的部分在PBR着色器的片段着色器中。我已经验证了贴图是否正确发送到着色器,以及所有其他贴图。

在没有IBL的情况下运行时,场景如下所示:

但是当使用IBL运行时,它看起来是这样的:

如您所见,带有PBR着色器的球体将消失。

导致问题的部分如下:

代码语言:javascript
复制
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,结果也会是黑色,而不是球体完全消失。

例如,这是可行的:

代码语言:javascript
复制
vec3 irradiance = texture(irradianceMap, N).rgb;

colour = irradiance;

还有这个:

代码语言:javascript
复制
vec3 irradiance = texture(irradianceMap, N).rgb;

colour = irradiance*0.01;

但这失败了:

代码语言:javascript
复制
vec3 irradiance = texture(irradianceMap, N).rgb;

colour = irradiance*albedo;

还有这个:

代码语言:javascript
复制
vec3 irradiance = texture(irradianceMap, N).rgb;

colour = vec3(irradiance.r,albedo.g,albedo.b);

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

EN

回答 2

Stack Overflow用户

发布于 2017-04-21 22:44:39

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

从您所展示的示例来看,这显然是albedo而不是irradiance的问题。

票数 3
EN

Stack Overflow用户

发布于 2021-09-29 04:26:42

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

代码语言:javascript
复制
shader.setInt("albedoMap", 0);
shader.setInt("normalMap", 1);
shader.setInt("metallicMap", 2);
shader.setInt("roughnessMap", 3);
shader.setInt("aoMap", 4);
shader.setInt("irradianceMap", 5);

下面是我之前所做的:

代码语言:javascript
复制
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);

它工作得很好,但在本节中,您必须同时使用这两种方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43532018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档