OpenGL ES рекомендовал способ отображения фонового изображения - PullRequest
4 голосов
/ 17 февраля 2010

Каков рекомендуемый способ отображения фонового изображения в приложении OpenGL ES.

  1. Добавлен ли UIImage для просмотра иерархии под glview?
  2. изображение, нарисованное в подпрограмме рисования OpenGL из текстуры в памяти?

Существуют ли какие-либо соображения относительно производительности / памяти, которые необходимо учитывать?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Мне нравится загружать текстуру, используя класс Apple Texture2D. Создайте квад (два треугольника, шесть вершин), который отображается в углах экрана. Затем вы сопоставляете координаты текстуры с вершинами, передаете это glDrawArrays и идете. На самом деле у меня есть класс, который берет кадр в координатах CG, преобразует его в координаты OpenGL и затем рисует изображение в кадре.

Допустим, у вас есть такая структура:

struct {
  GLfloat x;             // OpenGL X Coordinate
  GLfloat y;             // OpenGL Y Coordinate
  GLfloat z;             // OpenGL Z Coordinate
  GLfloat s;             // Texture S Coordinate
  Glfloat t;             // Texture T Coordinate
} vertexData;

И массив данных вершин, подобный этому:

struct vertexData verts[6];

И у вас есть объект Texture2D:

 texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:image] filter:filter pixelFormat:pixelFormat];

Итак, теперь вам нужно заполнить массив вершин. Предполагая, что 3D, x range [-1, 1] и y range [-1, 1], origin для z, вы бы инициализировали свои вершины следующим образом:

verts[0].x = verts[1].x = verts[5].x = -1.0;
verts[2].x = verts[3].x = verts[4].x = 1.0;

verts[0].y = verts[2].y = verts[4].y = 1.0;
verts[1].y = verts[3].y = verts[5].y = -1.0;

verts[0].z = verts[1].z = verts[2].z = 0.0;
verts[3].z = verts[4].z = verts[5].z = 0.0;

verts[0].s = verts[1].s = verts[5].s = tlxf;
verts[2].s = verts[3].s = verts[4].s = trxf;

verts[0].t = verts[2].t = verts[4].t = ttyf;
verts[1].t = verts[3].t = verts[5].t = tbyf;

Наконец, вам нужно нарисовать:

glBindTexture(GL_TEXTURE_2D, texture.name);
glVertexPointer(3, GL_FLOAT, sizeof(struct vertexData), &verts[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(struct vertexData), &verts[0].s);
glDrawArrays(GL_TRIANGLES, 0, 6);

Я опускаю любые подробности о настройке OpenGL. Я полагаю, вы сделали это, если вы зашли так далеко.

При работе в OpenGL нужно учитывать массу ограничений производительности и памяти, но я бы не советовал слишком беспокоиться о них. Как только он заработает, профилируйте его с помощью инструмента OpenGL, чтобы увидеть, есть ли какие-либо проблемы с производительностью, а затем устраните их.

У Apple действительно хороший документ, описывающий лучшие практики, а также есть несколько полезных вопросов по SO. Я уверен, что вы сможете их искать, как только узнаете, с чем вы столкнулись (если что).

1 голос
/ 17 февраля 2010

glDrawTexOES лучший выбор.

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