创建&;在iOS上更新OpenGLES纹理

创建&;在iOS上更新OpenGLES纹理,ios,opengl-es,opengl-es-2.0,texture-mapping,texture2d,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(

我想创建一个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像素数据)。我的疑问是:

  • iOS支持256x1纹理吗?如果没有,出路是什么

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

  • 我在正确的轨道上吗

  • 1) 我还没有使用过iOS和OpenGL ES,但是,如果默认情况下不支持这些纹理,一些扩展可以为它们添加支持


    2) 要更新纹理,应使用
    glTexSubImage2d
    。不同之处在于
    glTexImage2D
    重新分配内存,而
    glTexSubImage2D
    不重新分配内存。根据纹理大小、上载频率等,这可能足够有效。如果没有太多纹理数据,最好将其全部上载,而不是更新。

    好的,现在我的下一个问题是如何将此纹理传递给着色器?像glUniform1i(纹理,0)这样的东西足够了吗?@DeepakSharma是的,只是你需要传递纹理ID而不是0。