创造&更新iOS上的OpenGLES纹理

时间:2018-02-10 17:31:48

标签: ios opengl-es opengl-es-2.0 texture-mapping texture2d

我想创建一个OpenGLES 2.0纹理并在CPU端的每次绘制调用中更新它,以便着色器在使用纹理时具有正确的数据。以下是创建纹理的代码:

GLubyte * oglData;

- (GLuint)setupTexture
{
    oglData = (GLubyte *) calloc(256*1*4, sizeof(GLubyte));

    GLuint texName;
    glGenTextures(1, &texName);
    glBindTexture(GL_TEXTURE_2D, texName);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, oglData);

     return texName;
    }

我计划每次在glDrawArrays()之前更新oglData(256x1 RGBA像素数据)。我的疑惑:

  1. iOS是否支持256x1纹理?如果不是,那么出路是什么?

  2. 是否可以多次更新oglData,然后每次调用glTexImage2D来更新纹理?这种从CPU到GPU的数据重复复制真的有效还是有更好的方法?

  3. 我是否在正确的轨道上?

1 个答案:

答案 0 :(得分:1)

1)我还没有使用iOS和OpenGL ES,但是,如果默认情况下不支持这些纹理,某些扩展可能会增加对它们的支持。

2)要更新纹理,您应该使用glTexSubImage2d。区别在于glTexImage2D重新分配内存,而glTexSubImage2D则不重新分配内存。根据纹理大小,上传频率等,这可能对您来说足够有效。如果没有太多纹理数据,最好全部上传而不是更新。

相关问题