Рендеринг огромного количества очков - PullRequest
0 голосов
/ 19 ноября 2011

Я хотел бы сделать изображение в 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

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Если вы действительно хотите манипулировать каждым пикселем, вам, вероятно, следует просто использовать один полноэкранный квад в OpenGL и обновлять его текстуру каждый кадр.

1 голос
/ 19 ноября 2011

Вы можете создать текстуру из растрового массива пикселей, используя glTexImage2D.

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