OpenGL ES 在不使用 glPixelStorei 的情况下更新纹理的子部分

Posted

技术标签:

【中文标题】OpenGL ES 在不使用 glPixelStorei 的情况下更新纹理的子部分【英文标题】:OpenGL ES updating a sub-part of a texture without using glPixelStorei 【发布时间】:2014-08-21 10:55:59 【问题描述】:

我正在使用一个名为 fontstash 的开源项目来使用 OpenGL 绘制文本。可以在 github 上找到:https://github.com/memononen/fontstash

这适用于桌面,但是当我尝试为 android 构建它时,它失败了。这是因为它使用 glPixelStorei 和三个名为 GL_UNPACK_ROW_LENGTH、GL_UNPACK_SKIP_PIXELS、GL_UNPACK_SKIP_ROWS 的参数。这些在 OpenGL ES 1.1 或 2.0 中不可用(我认为它们已在 3.0 中添加)。但我发现这个 *** 答案表明可以通过使用 som 指针数学自己来完成:openGL SubTexturing

但我没有让它工作。

这是原始代码:

static void glfons__renderUpdate(void* userPtr, int* rect, const unsigned char* data)

    struct GLFONScontext* gl = (struct GLFONScontext*)userPtr;
    int w = rect[2] - rect[0];
    int h = rect[3] - rect[1];

    if (gl->tex == 0) return;
    glBindTexture(GL_TEXTURE_2D, gl->tex);
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);
    glPixelStorei(GL_UNPACK_ROW_LENGTH, gl->width);
    glPixelStorei(GL_UNPACK_SKIP_PIXELS, rect[0]);
    glPixelStorei(GL_UNPACK_SKIP_ROWS, rect[1]);
    glTexSubImage2D(GL_TEXTURE_2D, 0, rect[0], rect[1], w, h, GL_ALPHA,GL_UNSIGNED_BYTE, data);

这是我迄今为止想出的(不工作):

static void glfons__renderUpdate(void* userPtr, int* rect, unsigned char* data)

    struct GLFONScontext* gl = (struct GLFONScontext*)userPtr;
    int w = rect[2] - rect[0];
    int h = rect[3] - rect[1];

    if (gl->tex == 0) return;
    glBindTexture(GL_TEXTURE_2D, gl->tex);
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);
    glTexSubImage2D(GL_TEXTURE_2D, 0, rect[0], rect[1], w, h, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);

    int y = 0;
    for(y; y < h; y++)
    
        char *row = data + ((y + rect[1])*gl->width + rect[0]) * 4;
        glTexSubImage2D(GL_TEXTURE_2D, 0, rect[0], rect[1] + y, w, 1, GL_ALPHA, GL_UNSIGNED_BYTE, row);
   

【问题讨论】:

当 GL_ALPHA + GL_UNSIGNED_BYTE 暗示一个像素需要 1 个字节时,为什么要使用 4 作为乘数? 是的,我为什么要这样做?谢谢,当我删除 4 的乘数时效果更好。 【参考方案1】:

我在查看如何从 OpenGL ES 1.1/2.0 中的数据更新部分纹理时发现了这篇文章,并找到了这个解决方案。但事实证明这种方法很慢,所以任何寻找更快方法的人都可以查看this answer。

【讨论】:

以上是关于OpenGL ES 在不使用 glPixelStorei 的情况下更新纹理的子部分的主要内容,如果未能解决你的问题,请参考以下文章

03: OpenGL ES 基础教程02 使用OpenGL ES 基本步骤

如何在Android上使用OpenGL ES 2.0绘制点

使用 OpenGL(和 OpenGL ES)渲染 SVG

(转)使用openGL显示图像建立OpenGL ES的环境

OPENGL ES 2.0 知识串讲――OPENGL ES 2.0 概括

OPENGL ES 2.0 知识串讲 ——OPENGL ES 详解II(传入绘制信息)