Визуализация в текстуру OpenGL ES 2.0 - PullRequest
1 голос
/ 01 октября 2011

Я пытаюсь использовать аппаратно оптимизированную 2D-библиотеку для увеличения (без интерполяции) изображения.Сейчас я

  1. Загрузка исходного изображения
  2. Создание копии исходного изображения
  3. Использование библиотеки 2D для «увеличения» копии
  4. Создание текстур с использованием glTexImage2D из изображений
  5. Применение их к нарисованным мною прямоугольникам

Я не могу загрузить изображения (пока), но здесь есть ссылка на скриншот.http://img.photobucket.com/albums/v336/prankstar008/zoom.png

Я хотел бы увеличивать и уменьшать изображение справа на определенную величину каждый кадр, и вместо того, чтобы снижать производительность, используя glTexImage2D каждый раз, я хотел бы визуализировать текстуру,Мои вопросы

  1. Является ли это допустимым приложением рендеринга к текстуре?Для пояснения, библиотека 2D берет указатель на буфер, заполненный необработанными данными RGB (A), и возвращает указатель на новые данные с примененной операцией 2D.
  2. Я думаю, что большая часть моей путаницы связана сс тем, как текстуры взаимодействуют с шейдерами.Может кто-нибудь объяснить самый простой способ наложения текстуры на поверхность в GLES2?У меня, очевидно, что-то работает, и я могу опубликовать фрагменты кода при необходимости.
  3. Также для пояснения, хотя я не уверен, что это важно, это работает на Android.

Спасибо.

1 Ответ

2 голосов
/ 20 января 2012

1) Нет, это не так.Если вы просто хотите увеличивать и уменьшать изображение (без использования библиотеки масштабирования), то рендеринг с другой текстурой будет пустой тратой времени.Вы можете увеличивать масштаб прямо в своем виде.

2) Шейдеры - это программы, которые способны вычислять и преобразовывать координаты (что обычно делается в вершинных шейдерах) и могут использовать эти координаты для чтения из текстуры (чтоможет быть сделано только во фрагментном шейдере)1009 *

Что вы можете сделать, это включить параметр масштабирования (так называемый равномерный) в вершинный шейдер:

precision mediump float;

uniform float zoom; // zoom
uniform matrix4 modelviewProjectionMatrix; // input transformation matrix

attribute vec3 position;
attribute vec2 texcoord; // input coordinates of each vertex

varying vec2 _texcoord; // output coordinate for fragment shader

void main()
{
    gl_Position = modelviewProjectionMatrix * vec4(position, 1.0); // transform position
    _texcoord = (texcoord - .5) * zoom + .5; // zoom texcoord
}

В фрагментном шейдере нет изменений.Это просто вычисляет различные координаты для него, и вот как это просто.Чтобы установить масштаб, вам необходимо:

int zoomLocation = glGetUniformLocation(yourProgram, "zoom");
// this is done in init, where you call glGetUniformLocation(yourProgram, "modelviewProjectionMatrix")
// also, zoomLocation is not local variable, it needs to be stored somewhere to be used later when drawing

glUniform1f(zoomLocation, 1 + .5f * (float)Math.sin(System.nanotime() * 1e-8f));
// this will set zoom that will animatically zoom in and out of the texture (must be called after glUseProgram(yourProgram))

Теперь это приведет к увеличению или уменьшению обеих текстур.Чтобы это исправить (я полагаю, вы хотите, чтобы только правильная текстура масштабировалась), вам нужно:

// draw the second quad

glUniform1f(zoomLocation, 1);
// this will set no zoom (1:1 scale)

// draw the first quad

Надеюсь, это поможет ...

...