Я хотел бы сделать изображение в OpenGL ES, пиксель за пикселем.Я хочу сделать это таким образом, потому что я планирую перемещать эти пиксели с течением времени, чтобы создать различный эффект.
Из соображений производительности и дизайна я решил использовать только каждый второй пиксель в обоих направлениях (таким образом, уменьшив их число до одногочетверть)
У меня есть только очень базовое понимание opengl, поэтому я, вероятно, упускаю некоторые ключевые знания для достижения этого.
Каков наилучший способ достичь этого?Должен ли я действительно сделать это попиксельно?Или я могу как-то создать текстуру из массива пикселей?
Я бы хотел, чтобы эта работа работала на максимально возможном количестве устройств (поэтому решение OpenGL ES 1.1 предпочтительнее, но если это невозможно илиэто было бы очень неудобно или медленно, можно использовать 2.0)
Я пытался сделать это, используя VBO со смешанными результатами.Я не уверен, что сделал это правильно, потому что есть некоторые проблемы (и это очень медленно).Вот мой код:
Инициализация:
glGenBuffers(1, &pointsVBO);
glBindBuffer(GL_ARRAY_BUFFER, pointsVBO);
glBufferData(GL_ARRAY_BUFFER, 160*240*sizeof(Vertex), 0, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
Рендеринг:
- (void)renderPoints:(ImagePixel**)imagePixels {
int count = 160 * 240;
for(int i = 0; i < count; ++i) {
vertices[i].v[0] = imagePixels[i]->positionX;
vertices[i].v[1] = imagePixels[i]->positionY;
vertices[i].color[0] = imagePixels[i]->red;
vertices[i].color[1] = imagePixels[i]->green;
vertices[i].color[2] = imagePixels[i]->blue;
vertices[i].color[3] = 1;
}
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), vertices[0].v);
glColorPointer(4, GL_FLOAT, sizeof(Vertex), vertices[0].color);
// update vbo
GLvoid *vbo_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
memcpy(vbo_buffer, vertices, count * sizeof(Vertex));
glUnmapBufferOES(GL_ARRAY_BUFFER);
// draw contents of vbo
glDrawArrays(GL_POINTS, 0, count);
}
Структура вершины:
typedef struct Vertex
{
float v[2];
float color[4];
} Vertex;
массив imagePixels заполненданные из изображения.
Когда я делаю это, я получаю большую часть своего изображения, но мне не хватает нескольких последних строк, и я вижу несколько случайных пикселей по всему экрану.Возможно ли, что я достиг определенного предела в drawArrays, который использует только часть данных?
Вторая проблема заключается в том, что точки во второй половине столбцов не выровнены должным образом.Я предполагаю, что это вызвано ошибками округления в float math при вычислении позиции во время самого рендеринга (все предоставленные координаты кратны 2).Есть ли способ, как это предотвратить?Мне нужно, чтобы все точки были выровнены в правильной сетке.
Я предоставлю вам скриншот, как только я верну свой iphone