我想在 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 学的舍入误差引起的(提供的坐标都是 2 的倍数)。有什么办法可以防止这种情况发生吗?我需要所有点在适当的网格中对齐。
我一拿到我的iphone就给你截图
最佳答案
如果您真的想操纵每个像素,您可能应该只在 OpenGL 中使用一个全屏四边形并在每一帧更新其纹理。
关于iphone - 渲染大量点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8196323/