Materials - 基础视差原理

很久之前的学习笔记,整理归档;

首先,基础的视差是一个求实际面和虚拟面的UV差值的问题,利用UV偏移,在实际面,按照以虚拟面偏移后的UV坐标进行Texture取样;

先用最简单的代码来理解这一过程:

float3 rayStep = viewDir * -1;
//对传入的Tex取样
float4 inputTex = Texture2DSample(texObject,
texObjectSampler,uv);

//开始循环检测inputTex中的像素,每循环一次,就偏移取样一次;注意i++的逻辑是循环结束之后进行的;
for(int i = 0; i < step; i++)
{
     //当像素满足特定条件的时候(rgb都有>0.1的值),则该像素直接返回特定颜色
    if(inputTex.r > 0.1 && inputTex.g > 0.1 &&
 inputTex.b > 0.1)
     {
       return float3(i,0,0);
     }
     //当像素不满足特定条件的时候,则按方向再次偏移UV取样 
    uv += rayStep * 0.15;
    inputTex = Texture2DSample(texObject, texObjectSampler, uv.xy);
}

return inputTex;

以上代码的思路就是利用For循环对同一个Tex偏移取样,偏移取样之前对初始取样结果中像素的像素做颜色检测,只要是(近乎)有颜色信息的则替换为特定颜色的像素;

Step决定了偏移取样的次数,只循环一次的时候(这里把if判断中的return改为了只返回固定的红色,来方便观察):

正常的运行代码,可见在循环第一次的时候,把第一次取样的结果的白色像素部分替换成了黑色(return (0,0,0)),然后剩下的其它像素偏移取样:

 

继续循环第二次的时候,对以上的结果再次进行像素检测,白色像素部分满足if中的判断,被替换为(1,0,0)颜色,剩下的像素再次利用取样Tex进行偏移;可见每次迭代,都是对上次取样结果的像素检测和再次偏移,在表现上相当于不断的把Tex按照viewDir的反方向推移;在循环2次的情况下:

假如再次循环,其中红色像素部分并不会被if中的逻辑替换,因为其为(1,0,0)的红色,不满足if的条件(rgb都有>0.1的值),所以会被一直保留为红色;

由于第一次循环的时候白色像素被替代为黑色,所以反而有了遮挡下层的效果;以此类推,多次循环上次取样结果中的白色像素都会被替换,最下方的一层也总是Tex偏移取样的白色:

以上即为偏移取样的方法;下面是相关节点:

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DoomGT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值