Вы пытались посмотреть пример кода Пола Бурка для OpenGL ? Я не знаю, совместимо ли это с OpenGL-ES. Обратите внимание на отзывы об использовании «glCopyTexSubImage2D вместо медленных glReadPixels».
AFAICT, Пол Бурк делает, по сути, то, что вы сказали, создавая искаженную сетку (ваш «объект купола») для наложения изображения.
Согласно этот вопрос , это хороший подход.
Изменено:
Или, поскольку iPhone OpenGL-ES поддерживает шейдеры (по крайней мере, в некоторых версиях), вы можете получить лучшую производительность, используя технику искажения плоскости, такую как this . Вам просто нужно изменить формулы для uv.x
и uv.y
. Тогда вам не нужно беспокоиться о разбиении изображения на сетку из маленьких полигонов ... у вас будет одно-пиксельное разрешение бесплатно. : -)
Хм ... может быть, вам нужно определить, какой эффект "рыбий глаз" вы ищете. Кажется, есть больше чем один .
См. Также этот вопрос .
Обновлено снова:
Вот некоторый код GLSL, который я написал для создания эффекта линзы в шейдере. Я считаю, что это полусферическая линза "рыбий глаз". Он работает под управлением WebGL, в котором используется OpenGL ES, поэтому его следует адаптировать для 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);
}
Чтобы проверить это, вставьте его в ShaderToy в браузере с поддержкой WebGL. Установите для ввода 0 текстуру, например http://www.iquilezles.org/apps/shadertoy/presets/tex0.jpg или http://www.iquilezles.org/apps/shadertoy/presets/tex4.jpg
Нажмите кнопку воспроизведения и перетащите мышь в область рендеринга. Объектив центрирован на указателе мыши.