3

我想在 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我得到:

在此处输入图像描述 这个很接近但不是正确的解决方案(用 oculus 测试)

所以这不是程序的错……半径函数是问题所在。

在这里您可以尝试一下:http: //jsfiddle.net/s175ozts/2/

为什么原始功能不起作用?

谢谢 :)

4

2 回答 2

4

在尝试了很多东西之后......我终于得到了解决方案。诀窍是首先对 r 进行归一化,然后将桶函数与原始 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/

结果:在此处输入图像描述

于 2015-01-25T13:51:54.783 回答
1

Cracker0dks@:我在玩你的小提琴,并对其进行了显着优化:

http://jsfiddle.net/mqau9ytv/2/

/*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 临时数组。

并不是说在这种情况下它很重要,但它仍然是有用的东西。

于 2015-09-22T04:06:44.527 回答