我想在javascript中为oculus rift实现桶形着色器。
根据此视频(http://youtu.be/B7qrgrrHry0?t=11m26s),桶形失真的半径函数为:
newr = 0.24*r^4+0.22*r^2+1
结果:
参考图像:着色器后:
如果我将函数更改为newr = r
,我会获得原始图像。
如果我将功能设置为:newr = 0.022*r^2
我得到:
这个是接近但不是正确的解决方案(用眼睛测试)
所以它不是程序的错...半径函数就是问题。
在这里你可以用小提琴来试试:http://jsfiddle.net/s175ozts/2/
为什么原始功能不起作用?
谢谢:)
答案 0 :(得分:4)
尝试了很多东西后......我终于得到了解决方案。 诀窍是首先将r归一化,然后将barrelfunction与原始r相乘
var sf = pr / rMax; //Scaling factor
var newR = pr*(0.24*Math.pow(sf,4)+0.22*Math.pow(sf,2)+1); //barrel distortion function
请参阅此处的小提琴:http://jsfiddle.net/s175ozts/4/
结果:
答案 1 :(得分:1)
Cracker0dks @:我正在玩你的小提琴,并对其进行了大幅优化:
/*int*/ var x_off = xmid-x;
/*int*/ var y_off = ymid-y;
/*int*/ var pr2 = x_off*x_off + y_off*y_off; //radius from pixel to pic mid, squared.
/*float*/ var sf2 = pr2 * rMax2_inv; // Scaling factor squared.
/*float*/ var scale = zoom *(0.24*sf2*sf2 + 0.22*sf2 + 1.0); //barrel distortion function
/*float*/ var new_x_off = scale * x_off;
/*float*/ var newx = xmid - new_x_off;
/*float*/ var new_y_off = scale * y_off;
/*float*/ var newy = ymid - new_y_off;
它可能会进一步优化,比如实际上不会产生一些变量,比如new_y_off或pix2D临时数组。
在这种情况下并不是很重要,但它仍然是有用的。