结果展示
因为只引入了漫反射辐照,没有引入镜面反射,故只有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=1−ks 并不是折射率,而是折射率和其他方向反射率的和。
如果为非金属,漫反射较强,
F
F
F 较小,其他方向的反射率也较小,可一定程度上看作折射率的一部分。故
k
d
kd
kd 可看作
1
−
k
s
1-ks
1−ks 。
如果为金属,漫反射较弱,F较大,其他方向的F对渲染也有较大比重,则不能将它看作漫反射。
k
d
=
1
−
k
s
kd = 1 - ks
kd=1−ks就会错误。
但是计算
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
kd≈0。因此引入metallic
优化计算。
k
d
=
(
1
−
k
s
)
∗
(
1
−
m
e
t
a
l
l
i
c
)
kd = (1 - ks)*(1-metallic)
kd=(1−ks)∗(1−metallic)
当
m
e
t
a
l
l
i
c
(金属度)
metallic(金属度)
metallic(金属度) 较低时,
k
d
≈
1
−
k
s
kd \approx 1 - ks
kd≈1−ks
当
m
e
t
a
l
l
i
c
(金属度)
metallic(金属度)
metallic(金属度) 较高时,
k
d
≈
0
kd \approx 0
kd≈0
( 1 − m e t a l l i c ) (1-metallic) (1−metallic)相当于剔除了(除了视口方向)其他方向的反射率。
漫反射辐照计算
通过获取法线方向的辐照度贴图颜色值来确定入射环境光。
而不是通过一个特定的环境光颜色值来确定。
这样可以做到物体渲染根据环境的变换而变换,达到更真实的效果。
vec3 irradiance = texture(irradianceMap, N).rgb;//入射环境光
vec3 diffuse = irradiance * albedo;//漫反射颜色
vec3 ambient = (kD * diffuse) * ao;//漫反射衰减(漫反射率 * 环境光遮蔽【这里为1.0】)
下一节将加入环境光镜面反射。使得金属的性质被显现出来。