美文网首页
NormalMap原理

NormalMap原理

作者: ShiweyYan | 来源:发表于2015-05-19 23:28 被阅读0次

    NormalMap就是法线映射,简单的讲就是通过读取一张存储着发现信息的纹理来计算光照(而不通过顶点法线的插值),这样可以明显增强图像的真实感。

    NormalMap的实现原理很简单,就是用一张纹理存储法线信息,这样shader就可以得到每个像素的法线信息,通过计算光照,在视觉上产生凹凸不平的效果(当然这也就是说,在没有光照的情况下是看不出立体感的o.o)

    但说到具体实现上,就要注意了,直接从纹理中采样得到的信息是不能直接作为法线使用的,因为纹理中所存的法线信息是和纹理坐标一样,是存在于切线空间的数据。所以要想使用这里的法线数据,就必须把它变换到世界空间(因为光照是在这个空间中计算的)。

    //----------------------------------------------------
    // 将法线贴图的采样值转换到世界空间.
    //----------------------------------------------------
    float3 NormalSampleToWorldSpace(float3 normalMapSample, float3 unitNormalW, float3 tangentW)
    {                         //从纹理中采样到的法线//    //变化到世界坐标系的顶点法线//    //变换到世界坐标系中的切线//
        // 将每个分量从[0,1]解压到[-1,1].
        float3 normalT = 2.0f*normalMapSample - 1.0f;
    
        // 创建TBN基.
        float3 N = unitNormalW;
        float3 T = normalize(tangentW - dot(tangentW, N)*N);
        float3 B = cross(N, T);
    
        float3x3 TBN = float3x3(T, B, N);
    
        // 从切线空间转换到世界空间.
        float3 bumpedNormalW = mul(normalT, TBN);
    
        return bumpedNormalW;
    }
    

    这里有一点需要注意:参数中的 unitNormalW 不是由顶点法线×世界变化矩阵而来的因为,因为不等比的缩放等操作会使得法线变形,所以这里是由 顶点法线×逆转置世界变化矩阵 而得来的。

    示例示例

    相关文章

      网友评论

          本文标题:NormalMap原理

          本文链接:https://www.haomeiwen.com/subject/kkplqttx.html