QT with OpenGL(IBL-漫反射辐照)

结果展示

请添加图片描述

因为只引入了漫反射辐照,没有引入镜面反射,故只有Kd量有效。
当物体金属度越高时,或越接近90度视角时,kd量越小。
因此金属度越高,漫反射量越少,在图像中表现的越暗。

横坐标粗糙度只对镜面反射的反射范围有关,与漫反射无关,故横坐标方向的7个圆形并无变化。

不同环境的漫反射辐照对比

可以看出第一幅图球的颜色偏黄暗,第二份图偏亮蓝。(额!应该可看出来吧!)
在这里插入图片描述
在这里插入图片描述
下面把球的颜色设为(0.5,0.5,0.5,1.0)后,可以看出差别了吧
在这里插入图片描述

在这里插入图片描述

实现思路

输入值:

//像素颜色
//in vec2 TexCoords;
//uniform sampler2D albedo;
uniform vec3 albedo;//使用单一常量代替颜色

//世界坐标,用于计算光线角度和视口角度
in vec3 WorldPos;
//实现方向,用于计算视口角度
uniform vec3 camPos;
//像素法线
in vec3 Normal;

//材质参数
uniform float metallic;
uniform float roughness;

// IBL
uniform samplerCube irradianceMap;

计算值:

	vec3 N = Normal;
    vec3 V = normalize(camPos - WorldPos);//视口方向
    vec3 R = reflect(-V, N);//反射方向
    vec3 F0 = vec3(0.04);
    F0 = mix(F0, albedo, metallic);//基础反射率
    
    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 * diffuse) * ao;//漫反射衰减(漫反射率 * 环境光遮蔽【这里为1.0】)
	
	vec3 color = ambient + Lo;

关于Kd*(1-metallic)的理解

引用:关于PBR的一点思考

在这里插入图片描述

教材解释:

将kD乘以逆金属度,这样只有非金属才有漫射光,如果部分金属(纯金属没有漫射光),则为线性混合。

个人理解:

计算得到的 k s = F ks = F ks=F 为向视口方向反射的反射率,而光线射入后,不仅向视口方向反射,也会向非视口方向反射。
所以 k d = 1 − k s kd =1 - ks kd=1ks 并不是折射率,而是折射率和其他方向反射率的和

如果为非金属,漫反射较强, F F F 较小,其他方向的反射率也较小,可一定程度上看作折射率的一部分。故 k d kd kd 可看作 1 − k s 1-ks 1ks
如果为金属,漫反射较弱,F较大,其他方向的F对渲染也有较大比重,则不能将它看作漫反射。 k d = 1 − k s kd = 1 - ks kd=1ks就会错误。
但是计算 k d = 1 − ∫ π f r e s n e l ( d o t ( n o r m ( V + L ) , V ) ) d V kd = 1 - \int_{\pi }^{ } fresnel(dot(norm(V+L),V)) dV kd=1πfresnel(dot(norm(V+L),V))dV
计算量较大。且 k d ≈ 0 kd\approx 0 kd0。因此引入metallic优化计算。
k d = ( 1 − k s ) ∗ ( 1 − m e t a l l i c ) kd = (1 - ks)*(1-metallic) kd=(1ks)(1metallic)
m e t a l l i c (金属度) metallic(金属度) metallic(金属度) 较低时, k d ≈ 1 − k s kd \approx 1 - ks kd1ks
m e t a l l i c (金属度) metallic(金属度) metallic(金属度) 较高时, k d ≈ 0 kd \approx 0 kd0

( 1 − m e t a l l i c ) (1-metallic) (1metallic)相当于剔除了(除了视口方向)其他方向的反射率。

漫反射辐照计算

通过获取法线方向的辐照度贴图颜色值来确定入射环境光。
而不是通过一个特定的环境光颜色值来确定。

这样可以做到物体渲染根据环境的变换而变换,达到更真实的效果。

vec3 irradiance = texture(irradianceMap, N).rgb;//入射环境光
vec3 diffuse      = irradiance * albedo;//漫反射颜色
vec3 ambient = (kD * diffuse) * ao;//漫反射衰减(漫反射率 * 环境光遮蔽【这里为1.0】)

下一节将加入环境光镜面反射。使得金属的性质被显现出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elsa的迷弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值