这篇文章主要讲用opengl如何实现鱼眼扭曲。用opengl实现鱼眼扭曲在顶点着色器和片段着色器中都可以实现,只是如果在顶点着色器中实现,需要大量的三角形;所以从性能的角度出发,一般在片段着色器中实现鱼眼。
在片段着色器中实现鱼眼的步骤如下:
(1): 设定纹理坐标(0.5, 0.5)为图片的中心点
(2): 在片段着色器中计算出当前纹理坐标和中心点纹理坐标之间的角度,步骤如下:
1. 用当前纹理坐标减去中心点纹理坐标,得到一个新的纹理坐标P
2. 将新的纹理坐标P的y值和x值,传入shader自带的atan函数,计算出角度
(3): 计算出当前纹理坐标和中心点纹理坐标之间的距离: radius = sqrt(p.x * p.x + p.y * p.y)
(4): 对radius的值适当调整,比如:radius = pow(radius, 0.9);
(5): 根据现有的radius,角度,使用三角形正弦和余弦公式,计算出一个新纹理坐标P,如下:
p.x = radius * cos(theta);
p.y = radius * sin(theta);
(6): 这个新的纹理坐标P还不能直接使用,需要对x值和y值分别加上0.5
以上是鱼眼扭曲的基本步骤,在我的github中有专门的demo, 地址:fishEye,有兴趣的同学可以参考下,希望对你有所帮助。
来源:oschina
链接:https://my.oschina.net/u/1273706/blog/3129313