OpenGL3.3_C++_Windows(35PBR_IBL漫反射部分)

PBR_IBL漫反射

  • IBL图像的光照(Image based lighting):非直接光源,它是一种更精确的环境光照输入格式,甚至也可以说是一种全局光照的粗略近似。
  • 目的:捕捉环境的全局光照和氛围,使物体更好地融入其环境。
  • 环境光照:获取每个wi光源辐射率,求辐照度:将周围环境整体视为一个大光源,通常使用环境立方体贴图 (Cubemap) ,每个纹素视为一个光源
  • 首先反射方程可以将BRDF部分分解为漫反射 kd 和镜面 ks两个部分:分解后位移常数项,一下介绍漫反射部分:
  • 首先计算辐照度部分:∫ΩLi(p, ωi) 
  • 辐照度图:根据环境贴图,预计算立方体贴图:对于一个采样方向(纹素)wi入射光,通过卷积,对半球 Ω离散采样取平均值,计算漫反射结果,存储在这个采样方向(纹素)wo中。从而我们可以直接从辐照度图采样

从 hdr文件提取,环境立方体贴图

等距柱状投影到立方体
const vec2 invAtan = vec2(0.1591, 0.3183);
vec2 SampleSphericalMap(vec3 v)
{
    vec2 uv = vec2(atan(v.z, v.x), asin(v.y));
    uv *= invAtan;
    uv += 0.5;
    return uv;
}
  • PBR (基于实际物理属性和测量)和 HDR 需要密切合作(高动态范围(High Dynamic Range)
  • 扩展名为 .hdr文件:存储了一张完整的环境立方体环境贴图,所有六个面数据都是浮点数,允许指定 0.0 到 1.0 范围之外的颜色值
  • 使用stb_image.h 加载.hd\r:将辐射度 HDR 图像直接加载为一个浮点数列表(每个通道32位,每个颜色 3 个通道),名为等距柱状投影贴图
  • 等距柱状投影到立方体:首先渲染立方体,再获得方向(局部坐标插值,三角学),再从贴图采样

计算环境立方体贴图

环境贴图
环境贴图
  • 创建新的帧缓冲,创建立方体贴图,以不同的view摄像机视角,渲染这个正方体6次,解绑帧缓冲,其中帧缓冲目的就是为了防止渲染正方体
  • 这样就有了环境立方体贴图:它是作为场景的光源,每个纹素都是一个光源

计算辐照度图(漫反射部分) 立方体贴图

  • 点的漫反射BRDF:点的漫反射颜色
  • 辐照度部分:从环境光离散采样,求积分,再求平均值,计算对每个点的辐照度、
  • //
  • 离散采样:
  • 因为dw立体角很难计算,使用球坐标 倾斜角θ和 航向角ϕ来代替立体角。
  • 其中θ取90度,ϕ取180度,cos代表n * wi部分,d代表微小的偏移量,dθdϕ代表球坐标的偏移量,sin是平衡当θ变大时,采样区域变小的贡献度,
  • 获取每次的采样方向:
  • 外层循环航向角,内层倾斜角,for中的d为偏移量,
for(float phi = 0.0; phi < 2.0 * PI; phi += sampleDelta)
{
    for(float theta = 0.0; theta < 0.5 * PI; theta += sampleDelta)
    {
        ……
    }
}
  • 首次是0,0,1为z轴方向,内部循环θ(0---90°),外部循环ϕ(0---360°),结束为0,0,1,整体为正z轴为轴心,以xy面看的话,右上(1/4圈向上绘制),左上(1/4圈向下绘制),左下(1/4圈向下绘制),右下(1/4圈向上绘制),
vec3 tangentSample = vec3(sin(theta) * cos(phi),  sin(theta) * sin(phi), cos(theta));
  • 获取公式的结果:
  • 计算所有的采样到的环境光总和再求平均值
  • //
辐照度图
  • 这里耽搁比较久,查bug的原因,设想了很多,最后才发现是hdr文件的问题,只能用了官方教程的
  • 开启帧缓冲,新的立方体贴图负责存储辐照度图,用新的PBR片段着色器,以不同的view摄像机视角,渲染6次,环境立方体贴图,对应存储到辐照度立方体贴图中,
  • 这样就有了辐照度立方体贴图:因此可以方便的直接从贴图采样,获取某个方向上受到的环境光照

为图元应用环境光照

应用了漫反射以及环境光的PBR球体

模拟:

  1. 大体的思路就是对一个立方体应用hdr贴图,渲染出立方体环境贴图,再对这个立方体应用立方体环境贴图,对每个点,从立方体环境贴图离散的采样半球wi,渲染出辐照度图,最后渲染场景,直接采样这个辐照度图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值