ios - 在 iOS 上创建和更新 OpenGLES 纹理

标签 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) 我没有在上面使用过 iOS 和 OpenGL ES,但是,如果默认情况下不支持这些纹理,一些扩展可以添加对它们的支持。

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

关于ios - 在 iOS 上创建和更新 OpenGLES 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48723598/

相关文章:

ios - Ipad 上网络浏览器中的 3D

iphone - 在我单击 iPad Safari 浏览器中的选择元素(多选表单)之前,选项不会显示

ios - 没有 Storyboard 的应用程序启动-UIViewController仍然不可见

iphone - iOS 开发 : Why doesn't loadScoresWithCompletionHandler ever return?

android - 从 AVFrame(android) 加载纹理的问题

ios - 使用 3D 管道查找附近的三角形?

glsl - 如何使用 Open GL ES 2.0 或 WebGL 创建雾?

Android apitrace 运行失败

ios - OpenGL ES 2.0 iOS - 将矩形绘制到模板缓冲区中并限制仅在其中绘制

opengl-es-2.0 - 在 OpenGL ES 2.0 中禁用 mipmap