我想创建一个 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 的重复数据复制真的很高效吗?还是有更好的方法?
我走的路正确吗?
最佳答案
1) 我没有在上面使用过 iOS 和 OpenGL ES,但是,如果默认情况下不支持这些纹理,一些扩展可以添加对它们的支持。
2) 要更新纹理,您应该使用 glTexSubImage2d
。区别在于 glTexImage2D
重新分配内存,而 glTexSubImage2D
没有。根据纹理大小、上传频率等,这对您来说可能足够有效。如果纹理数据不多,最好全部上传而不是更新。
关于ios - 在 iOS 上创建和更新 OpenGLES 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48723598/