Android OpenGL在不使用glPixelStorei的情况下更新纹理的子部分
我正在使用一个名为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指针数学自己完成这项工作: 但我不能让它发挥作用 这是原始代码: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
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);
}
}