我的情况是我从服务器收到不同的图像到iPhone客户端。
我需要做的是为这些图像添加鱼眼效果。
我的幻觉是我可以建造一个圆顶物体,然后在它们来到我身边时将图像附加到它上面。
如果有人能给我指向正确方向的任何指示,我将感激不尽。
答案 0 :(得分:10)
您是否尝试过查看Paul Bourke's example code for OpenGL?我不知道它是否与OpenGL-ES兼容。请注意有关使用“glCopyTexSubImage2D而不是执行慢速glReadPixels”的反馈。
AFAICT,Paul Bourke基本上就是按照你的说法做的,创建一个扭曲的网格(你的“圆顶对象”)来打印图像。 根据{{3}},这是一个很好的方法。
<强>更新强>
或者,由于iPhone的OpenGL-ES支持着色器(至少在某些版本中),因此使用this question等平面失真技术可以获得更好的性能。您只需更改uv.x
和uv.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);
}
要对此进行测试,请将其粘贴到支持WebGL的浏览器中的this question。将输入0设置为ShaderToy或http://www.iquilezles.org/apps/shadertoy/presets/tex0.jpg
等纹理单击播放按钮,然后在渲染区域上拖动鼠标。镜头以鼠标指针为中心。
答案 1 :(得分:1)
status = MagickImplodeImage(magick_wand,-3);