首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenGL ES在运行时为图像添加鱼眼效果

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

Stack Overflow用户
提问于 2011-05-17 20:33:37
回答 2查看 7.6K关注 0票数 3

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

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

我的幻觉是,我可以建立一个圆顶对象,然后当它们来到我身边时将图像附加到它上。

如果有人能给我任何正确方向的指点,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-18 01:09:11

你试过看Paul Bourke's example code for OpenGL吗?我不知道它是否兼容OpenGL-ES。注意关于使用"glCopyTexSubImage2D而不是做一个慢的glReadPixels“的反馈。

AFAICT,Paul Bourke基本上是在做你所说的,创建一个扭曲的网格(你的“圆顶对象”)来放置图像。根据this question的说法,这是一个很好的方法。

更新:

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

嗯..。也许你需要定义你在寻找什么样的“鱼眼”效果。看起来有more than one

另请参见this question

再次更新:

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

代码语言:javascript
复制
#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);
}

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

单击播放按钮,然后在渲染区域中拖动鼠标。镜头位于鼠标指针的中心。

票数 10
EN

Stack Overflow用户

发布于 2011-07-27 13:00:03

status=MagickImplodeImage(magick_wand,-3);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6030814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档