如何使用2D纹理将RGB位图渲染到GLKView中?

时间:2015-10-08 01:40:52

标签: ios objective-c opengl

我有一个内存中的“位图”,它只是一个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的白色正方形,但我得到的只是纯红色背景。

有人能发现我在这里做错了吗?

0 个答案:

没有答案