渲染量巨大

时间:2011-11-19 18:41:02

标签: iphone ios opengl-es

我想逐个像素地在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中达到某个限制?

第二个问题是,列的后半部分中的点未正确对齐。我猜这是由渲染本身计算位置时浮点数学中的舍入误差引起的(提供的坐标都是2的倍数)。有什么方法可以防止这种情况吗?我需要在适当的网格中对齐所有点。

我会在收回iphone后立即为您提供屏幕截图

2 个答案:

答案 0 :(得分:2)

如果您真的想要操纵每个像素,您可能只需在OpenGL中使用一个全屏四边形并在每帧中更新其纹理。

答案 1 :(得分:1)

您可以使用glTexImage2D从像素位图数组中创建纹理。