很久之前的学习笔记,整理归档;
首先,基础的视差是一个求实际面和虚拟面的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偏移取样的白色:
以上即为偏移取样的方法;下面是相关节点: