【问题标题】:Generating and updating 8-bit gray-scale texture in OpenGL ES 2.0在 OpenGL ES 2.0 中生成和更新 8 位灰度纹理
【发布时间】:2015-08-08 03:50:33
【问题描述】:

对于 OpenGL 纹理缓存,我需要初始化一个大的(≥ 2048x2048)纹理,然后经常更新它的一小部分。

以下(伪)代码有效:

// Setup texture
int[] buffer = new int[2048*2048 / 4]; // Generate dummy buffer with 1 byte per pixel
int id = glGenTexture();
glBindTexture(GL_TEXTURE_2D, id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 2048, 2048, 0, GL_ALPHA, GL_UNSIGNED_BYTE, buffer);

// Perform update
glBindTexture(GL_TEXTURE_2D, id);
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, data);

但我发现完全不必要的 4MB int 缓冲区的创建至少可以说有点不可取。所以,我尝试了以下方法:

// Setup texture
int id = glGenTexture();
glBindTexture(GL_TEXTURE_2D, id);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 0, 0, 2048, 2048, 0);

这给了我一个 GL_INVALID_OPERATION 错误,我认为这是由于帧缓冲区不包含 alpha 值这一事实引起的,因此调用失败而不是仅仅将其设置为 1。

下一次尝试:

// Setup texture
int id = glGenTexture();
glBindTexture(GL_TEXTURE_2D, id);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 2048, 2048, 0);

这可行,但现在我的 glTexSubImage2D 调用失败并显示 GL_INVALID_OPERATION,因为它指定了 GL_ALPHA 而不是 GL_LUMINANCE。因此,我也将其更改为:

// Perform update
glBindTexture(GL_TEXTURE_2D, id);
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);

我更改了我的着色器以从 r 而不是 a 组件中读取值。

这适用于某些设备,但在 iPhone 3GS 上,我仍然在 glTexSubImage2D 调用中收到 GL_INVALID_OPERATION 错误。为什么?我该如何解决这个问题?有没有办法,例如,改变内部纹理格式?或者我可以创建一些其他的具有 alpha 组件的帧缓冲区,我可以将其用作 glCopyTexImage2D 的源吗?

【问题讨论】:

    标签: opengl-es glteximage2d


    【解决方案1】:

    如果您只想分配一个空纹理,data 可以在您的 glTexImage2D() 调用中为 NULL

    data 可能是一个空指针。在这种情况下,纹理内存被分配以容纳widthheight 的纹理。然后,您可以下载子纹理来初始化此纹理内存。如果用户尝试将纹理图像的未初始化部分应用于图元,则图像未定义。

    【讨论】:

    • 哇!我怎么会错过那个???惊人的!当然,这让生活变得更加轻松!谢谢!
    • 您知道 iPhone 3GS 上的错误可能来自哪里吗?这是一些错误吗?还是我没有看到的一些特殊情况?如果我用 glTexImage2D 和 GL_LUMINANCE 初始化纹理,一切正常,只是 clCopyTexImage2D 似乎无法与 GL_LUMINANCE 相处......
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2012-03-29
    • 2011-05-19
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多