我想逐个像素地在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后立即为您提供屏幕截图
答案 0 :(得分:2)
如果您真的想要操纵每个像素,您可能只需在OpenGL中使用一个全屏四边形并在每帧中更新其纹理。
答案 1 :(得分:1)
您可以使用glTexImage2D从像素位图数组中创建纹理。