我有一个内存中的“位图”,它只是一个malloced Byte *
数组,包含一个简单RGB格式的像素数据(因此字节数组的大小是3 *像素数)。 / p>
我的应用只是一个视图控制器,其实例为GLKView
。我已经实现了它的代理:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
并按预期设置GLKView的背景颜色。
我现在要做的是将代码添加到glkView:drawInRect:
的此实现中,以便将我的“位图”呈现到此GLKView中。但我似乎无法找到任何简单的方法; OpenGL可以做的所有事情都让我感到不知所措,所有这些都比我在这里做的要复杂得多。
glReadPixels
似乎有点像我在这里,因为它似乎提供了一个指向缓冲区数据的指针。
编辑:显然这只能通过使用纹理来实现。我试图用这个示例代码实现这一点(注意我的“位图”这里是每个样本4个字节,与格式参数匹配):
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// raw data
int width = 30;
int height = 30;
int pixelCount = width * height;
int byteSize = pixelCount * 4;
GLubyte *textureData = (GLubyte *)malloc(byteSize);
for (int i = 0; i < byteSize; i++) {
textureData[i] = 255; // white
}
glEnable(GL_TEXTURE_2D);
GLuint textureID;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, textureData);
free(textureData);
}
... 但它无效。 glClear()
调用按预期工作,并将整个背景设置为红色;但如果我理解正确的纹理样本,下面的代码应该在角落里绘制一个30x30的白色正方形,但我得到的只是纯红色背景。
有人能发现我在这里做错了吗?