使用OpenGL ES在运行时为图像添加鱼眼效果

Zoi*_*erg 3 iphone graphics opengl-es

我的情况是我从服务器收到不同的图像到iPhone客户端.

我需要做的是为这些图像添加鱼眼效果.

我的幻觉是什么,我可以建立一个圆顶物体,然后当他们来到我身边时附上图像.

如果有人能给我任何指向正确方向的指示,我将感激不尽.

Lar*_*rsH 10

您是否尝试过查看Paul Bourke的OpenGL示例代码?我不知道它是否与OpenGL-ES兼容.请注意有关使用"glCopyTexSubImage2D而不是执行慢速glReadPixels"的反馈.

AFAICT,Paul Bourke基本上就是按照你的说法做的,创建一个扭曲的网格(你的"圆顶对象")来打印图像.根据这个问题,这是一个很好的方法.

更新:

或者,由于iPhone的OpenGL-ES支持着色器(至少在某些版本),你可以使用像一个平面变形技术获得更好的性能.你只需要改变的公式uv.xuv.y.那么你不必担心将图像分解成小多边形网格......你可以免费获得单像素分辨率.:-)

嗯...也许你需要定义你正在寻找什么样的"鱼眼"效果.似乎有不止一个.

另见这个问题.

再次更新:

这是我写的一些GLSL代码,用于在着色器中执行镜头效果.我相信它是一个半球形鱼眼镜头.它运行在使用OpenGL ES的WebGL下,因此它应该适用于iPhone.

#ifdef GL_ES
precision highp float;
#endif

uniform vec2 resolution;
uniform vec4 mouse;
uniform sampler2D tex0;

// lens
void main(void)
{
    vec2 p = gl_FragCoord.xy / resolution.xy;
    vec2 m = mouse.xy / resolution.xy;
    float lensSize = 0.4;

    vec2 d = p - m;
    float r = sqrt(dot(d, d)); // distance of pixel from mouse

    vec2 uv;
    if (r >= lensSize) {
        uv = p;
    } else {
        // Thanks to Paul Bourke for these formulas; see
        // http://paulbourke.net/miscellaneous/lenscorrection/
        // and .../lenscorrection/lens.c
        // Choose one formula to uncomment:
        // SQUAREXY:
        // uv = m + vec2(d.x * abs(d.x), d.y * abs(d.y));
        // SQUARER:
        uv = m + d * r; // a.k.a. m + normalize(d) * r * r
        // SINER:
        // uv = m + normalize(d) * sin(r * 3.14159 * 0.5);
        // ASINR:
        // uv = m + normalize(d) * asin(r) / (3.14159 * 0.5);
    }

    vec3 col = texture2D(tex0, vec2(uv.x, -uv.y)).xyz;

    gl_FragColor = vec4(col, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

要对此进行测试,在支持WebGL的浏览器中将其粘贴到ShaderToy中.将输入0设置为纹理,如http://www.iquilezles.org/apps/shadertoy/presets/tex0.jpghttp://www.iquilezles.org/apps/shadertoy/presets/tex4.jpg

单击播放按钮,然后在渲染区域上拖动鼠标.镜头以鼠标指针为中心.