我想创建一个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,然后每次调用glTexImage2D来更新纹理?这种从CPU到GPU的数据重复复制真的有效还是有更好的方法?
我是否在正确的轨道上?
答案 0 :(得分:1)
1)我还没有使用iOS和OpenGL ES,但是,如果默认情况下不支持这些纹理,某些扩展可能会增加对它们的支持。
2)要更新纹理,您应该使用glTexSubImage2d
。区别在于glTexImage2D
重新分配内存,而glTexSubImage2D
则不重新分配内存。根据纹理大小,上传频率等,这可能对您来说足够有效。如果没有太多纹理数据,最好全部上传而不是更新。