GraphicsLab Project之光照贴图烘焙(二) - Radiosity Normal Mapping

作者:i_dovelemon 日期:2018-05-30 来源:CSDN 主题:Radiosity Normal Mapping, Tangent Space 引言前面一篇文章,我们讲述了如何通过Radiosity算法,实现旧式的光照贴图烘焙。正如前面我们讲述的,最终我们希望实现的是Source引擎中带有凹凸效果的烘焙(题图对比)。 我们知道,Normal Map...
摘要由CSDN通过智能技术生成

作者:i_dovelemon
日期:2018-05-30
来源:CSDN
主题:Radiosity Normal Mapping, Tangent Space


Radiosity Normal Mapping


引言



前面一篇文章,我们讲述了如何通过Radiosity算法,实现旧式的光照贴图烘焙。正如前面我们讲述的,最终我们希望实现的是Source引擎中带有凹凸效果的烘焙(题图对比)。

我们知道,Normal Mapping是一种增添表面细节的方法。旧式的光照贴图丢失了这种细节。原因是普通的Normal Mapping,需要光照方向,但是对于烘焙的贴图来说没有固定的光照方向,所以丢失了凹凸的信息。为此,Valve在Half Life 2中提出了Radiosity Normal Mapping的改进方法,以此来增加烘焙贴图的表面细节。


Radiosity Normal Mapping



在传统的光照贴图烘焙中,我们保存的是每一个patch的法线所朝向的半个立方体范围内的入射光照的结果。Valve将此种方法进行了扩展,他们实验出了一组正交基,如图所示:


这里写图片描述


与旧式不同的是,需要计算以这三个切空间正交基为法线的patch的颜色。也就是说,相对于以前只保存一个颜色的光照贴图,现在需要保存这三个法线方向的光照颜色。

当我们获取了这样的光照贴图之后,在实际使用的时候,只要简单的获取对应的法线贴图中的法线数据与三个基向量做点积,并以此为权重进行光照贴图的混合,如图所示:

这里写图片描述


整个过程并没有多复杂,通过这样的方式就能够近似的模拟带有Normal Maping的效果了。


实现



实现中也没有什么特别的地方,只要注意Valve给出的向量实际是patch法线所在的切空间,所以我们在进行光照贴图计算的时候,需要将这三个正交基变换到世界坐标来,如下代码所示:

void PrepareLightPatch() {
    memset(m_Patch, 0, sizeof(m_Patch));

    // Calculate uv for every patch
    for (int32_t h = 0; h < kLightMapHeight; h++) {
        for (int32_t w = 0; w < kLightMapWidth; w++) {
            m_Patch[h][w].uv = math::Vector((w + 0.5f) * 1.0f / kLightMapWidth, (kLightMapHeight - h - 0.5f) * 1.0f / kLightMapHeight, 0.0f);
        }
    }

    // Collect all faces
    struct Face {
        struct {
            math::Vector uv;
            math::Vector pos;
            math::Vector normal;
            math::Vector tangent;
            math::Vector binormal;
        } vertex[3];
    };
    std::vector<Face> faces;
    faces.clear();

    scene::ModelEffectParam effectParam;
    scene::ModelMaterialParam materialParam;
    float* vertexBuf = NULL;
  
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值