BUMP图改进

凹凸贴图映射技术是对物体表面贴图进行变化然后再进行光照计算的一种技术。例如给法线分量添加噪音,或者在一个保存扰动值的纹理图中进行查找。这是一种提升物体真实感的有效方法,但却不需要额外的提升物体的几何复杂度。这种方式在提升物体的表面细节或者表面的不规则性方面有显著效果。

凹凸贴图映射技术的种类主要是:法线映射、视差映射、浮雕映射。

法线映射:切线空间与世界空间下获取凹凸纹理

视差映射:法线映射虽然能展示较为逼真的模型表面细节,但毕竟法线映射只能改变法线进而改变光照,并不能让模型表面产生让人信服的遮挡效果,所以我们引入视差映射。Parallax Mapping中文为视差映射,是种类似于法线映射的技术,但是原理不同,关似法线贴图,它是用以提高模
型表面细节并赋予其遮挡关系的技术,并可以和法线贴图一起使用提供令人信服的逼真的效果

视差映射同样引进一张新的贴图——高度图。高度图一般是作为顶点位移来使用的,但模型要包含大量的三角形才能获得比较不错的效果,否则看起来会成块状。所以在有限的三角面上表示逼真的令人信服的效果,这就是视差映射技术。视差映射的核心是改变纹理坐标,这时需要一张存储模型信息的高度图, 利用模型表面高度信息来对纹理进行偏移。下图后两张使用了视差映射,可以看出突出的砖块会遮挡凹进的缝隙。

视差映射主要是让平面看起来立体,和法线贴图一样是欺骗眼睛的做法。(只改变纹路,不增加三角形)。我们制作的模型在一个三角面即切线空间下,所有点都位于切线和副切线组成的平面内(右图水平0.0点),但实际物体要有更多的丰富细节。如右图当计算我们当前视角的片元A时,真正应该计算的点是视线与物体表面的实际交点,即B点。计算B点,我们就需要知道AB两点在平面上uv偏差。根据高度图以及切线空间下的视角方向,近似的求解偏移量。视角方向(N) ,A点的高度值来近似的求解,并可以通过一个缩放值(scale) 来控制。

o.uv2.xy = TRANSFORM_TEX(v.uv, _HeightMap);
//视差映射 计算的偏移量D
float2 ParallaxMapping(float2 o.uv2.xy, real3 viewDirTS)
{
    float height = tex2D(_HeightMap, o.uv2.xy).r;
    float2 offuv = viewDirTS.xy / viewDirTS.z * height * _HeightScale;

    return offuv;
}

陡峭视差映射:视差映射往往是近似值,所以计算结果并不是准确的。在此基础上想获得更加准确的结果就需要陡峭视差映射,陡峭视差也是一个近似的解,但相比于普通视差映射要精确的多,效果表现上也更好。并且会对纹理坐标偏移进行合理性检查。陡峭视差映射的基本思想是将深度分为等距的若干层,然后从最顶端开始采样,并且每次沿着视角方向偏移一定的值, 若当前层的深度大于采样出的深度,则停止检查并返回最后的结果。但是由于分层过多,对性能的消耗大,不过效果好。

float2 SsteepParallaxMapping(float2 uv, real3 viewDirTS)
{
    float numLayers = 20.0;
    float layerHeight = 1.0 / numLayers;
    float currentLayerHeight = 0.0;
    float2 offlayerUV = viewDirTS.xy / viewDirTS.z * HeightScale;
    float2 Stepping = offlayerUV / numLayers ;
    float2 currentUV = uv;
    float2 AddUV = float2(0, 0);
    float currentHeightMapValue = tex2D(_HeightMap, currentUV + AddUV).r;

    for (int i = 0; i < numLayers; i++){
        if (currentLayerHeight > currentHeightMapValue)
            return AddUV;
        AddUV += Stepping;
        currentHeightMapValue = tex2D(_HeightMap, currentUV + AddUV).r;
        currentLayerHeight += layerHeight; 
    }
    return AddUV;
}

浮雕映射:浮雕映射,对比与视差映射,想要有更好更准确的表现效果,视差映射是不够的,使用更大的uv偏移,视差映射就会导致失真。于是引入浮雕映射,浮雕映射更容易提供更多的深度,还可以做自阴影以及闭塞效果。

ab使用视差映射,cd使用浮雕映射

浮雕映射一般采用射线步进,和二分查找来决定uv偏移量。第一种使用射线步进来查找可能的交点,为什么不直接用二分查找。因为直接用1二 分查找可能会漏掉较薄的区域导致结果不准确。所以第一步,使用射线步进来确定交点位于那个步进内。之后在该步进内使用二分查找,快速确定交点位置。最后返回结果,偏移贴图。
 

//浮雕贴图
            float2 ReliefMapping(float2 uv, real3 viewDirTS)
            {
                float2 offlayerUV = viewDirTS.xy / viewDirTS.z * _HeightScale;
                float RayNumber = 20;
                float layerHeight = 1.0 / RayNumber;
                float2 SteppingUV = offlayerUV / RayNumber;
                float offlayerUVL = length(offlayerUV);
                float currentLayerHeight = 0;
                
                float2 offuv= float2(0,0);
                for (int i = 0; i < RayNumber; i++)
                {
                    offuv += SteppingUV;

                    float currentHeight = tex2D(_HeightMap, uv + offuv).r;
                    currentLayerHeight += layerHeight;
                    if (currentHeight < currentLayerHeight)
                    {
                        break;
                    }
                }

                float2 T0 = uv-SteppingUV, T1 = uv + offuv;

                for (int j = 0;j<20;j++)
                {
                    float2 P0 = (T0 + T1) / 2;

                    float P0Height = tex2D(_HeightMap, P0).r;

                    float P0LayerHeight = length(P0) / offlayerUVL;

                    if (P0Height < P0LayerHeight)
                    {
                        T0 = P0;

                    }
                    else
                    {
                        T1= P0;
                    }

                }

                return (T0 + T1) / 2 - uv;
            }

参考视频:BUMP图改进

2.5 Bump Map 凹凸映射 · 语雀

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值