Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGL在不使用glPixelStorei的情况下更新纹理的子部分_Android_C++_Opengl Es - Fatal编程技术网

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

Android OpenGL在不使用glPixelStorei的情况下更新纹理的子部分,android,c++,opengl-es,Android,C++,Opengl Es,我正在使用一个名为fontstash的开源项目来使用OpenGL绘制文本。可以在github上的此处找到: 这对桌面来说很好,但当我尝试为android构建它时,它失败了。这是因为它使用的glPixelStorei具有三个参数:GL_UNPACK_ROW_LENGTH、GL_UNPACK_SKIP_PIXELS、GL_UNPACK_SKIP_ROWS。这些在OpenGLES1.1或2.0中不可用(但我认为它们是在3.0中添加的)。但我发现这个stackoverflow答案表明,可以通过使用som

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

这对桌面来说很好,但当我尝试为android构建它时,它失败了。这是因为它使用的glPixelStorei具有三个参数:GL_UNPACK_ROW_LENGTH、GL_UNPACK_SKIP_PIXELS、GL_UNPACK_SKIP_ROWS。这些在OpenGLES1.1或2.0中不可用(但我认为它们是在3.0中添加的)。但我发现这个stackoverflow答案表明,可以通过使用som指针数学自己完成这项工作:

但我不能让它发挥作用

这是原始代码:

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);
}
这就是我到目前为止所想到的(不起作用):

静态void glfons\uu renderUpdate(void*userPtr、int*rect、unsigned char*data)
{
结构GLFONScontext*gl=(结构GLFONScontext*)userPtr;
int w=rect[2]-rect[0];
inth=rect[3]-rect[1];
如果(gl->tex==0)返回;
glBindTexture(GL_纹理_2D,GL->tex);
glPixelStorei(GLU解包对齐,1);
glTexSubImage2D(GL_纹理_2D,0,rect[0],rect[1],w,h,GL_ALPHA,GL_无符号_字节,NULL);
int y=0;
对于(y;ywidth+rect[0])*4;
glTexSubImage2D(GL_纹理_2D,0,rect[0],rect[1]+y,w,1,GL_ALPHA,GL_无符号_字节,行);
}
}

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

当GL_ALPHA+GL_UNSIGNED_BYTE表示像素需要1个字节时,为什么要使用4作为乘法器?是的,我为什么要这样做?谢谢,当我去掉乘数4时效果更好。
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);
   }
}