Добавьте эффект Fisheye к изображениям во время выполнения, используя OpenGL ES - PullRequest
3 голосов
/ 17 мая 2011

Моя ситуация такова, что я получаю разные изображения с сервера на клиент iPhone.

Мне нужно добавить эффект «Рыбий глаз» к этим изображениям.

Что такое моя галлюцинация?что я могу построить купольный объект, а затем прикрепить к нему изображения, когда они придут ко мне.

, если кто-нибудь может дать мне указатели в правильном направлении, я буду благодарен.

Ответы [ 2 ]

10 голосов
/ 17 мая 2011

Вы пытались посмотреть пример кода Пола Бурка для 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

Нажмите кнопку воспроизведения и перетащите мышь в область рендеринга. Объектив центрирован на указателе мыши.

1 голос
/ 27 июля 2011

status = MagickImplodeImage (magick_wand, -3);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...