小编god*_*024的帖子

为什么iOS设备上的glGenerateMipmap()会占用如此多的客户端内存?

我正在开发一个使用OpenGL ES渲染图像的iOS应用程序.这是我的函数的关键代码片段,用于设置纹理参数和数据:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
Run Code Online (Sandbox Code Playgroud)

这适用于iPhone,但在缩小时会出现锯齿现象.所以我尝试使用mipmap,修改以前的代码如下:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);// for mipmapping
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
glGenerateMipmap(GL_TEXTURE_2D);// This will generate all mip-mapping textures
Run Code Online (Sandbox Code Playgroud)

这个mipmapping运行良好,在缩小时不会出现混叠现象.

但是,我发现mipmapping占用了太多内存:不是图形内存,而是主内存(在OpenGL方面,不是服务器端内存,而是客户端内存)!

我用仪器的Memory Monitor证实了这一点:

如果没有mipmapping,我的纹理设置功能几乎不会占用任何内存,即使纹理源是4K分辨率图像.这样的结果清楚地证明了glTexImage2D只在OpenGL服务器(即图形卡)中分配内存,因此内存监视器无法监视它,而不关心图形内存的使用.

但是使用glGenerateMipmap()进行mipmapping,当我创建4K纹理时,堆内存使用量会快速增加约100M.在glDeleteTextures()之后,它会回落.

似乎glGenerateMipmap()不仅在图形内存中生成mip贴图纹理,而且还消耗主内存.删除纹理后,可以回收这段主内存.很奇怪,不是吗?

我想知道为什么.我的关键点是,如何在没有太多内存使用的情况下使用mip映射?谢谢你的帮助.

memory gpu opengl-es ios

5
推荐指数
1
解决办法
257
查看次数

像glColorPointer这样的OpenGL API如何知道作为指针传递的数组的大小?

这是来自opengl.org的glColorPointer的定义:

void glColorPointer(GLint size,GLenum type,GLsizei stride,const GLvoid*pointer); 参数

size指定每种颜色的组件数.必须为3或4.初始值为4.

type指定数组中每个颜色组件的数据类型.接受符号常量GL_BYTE,GL_UNSIGNED_BYTE,GL_SHORT,GL_UNSIGNED_SHORT,GL_INT,GL_UNSIGNED_INT,GL_FLOAT和GL_DOUBLE.初始值为GL_FLOAT.

stride指定连续颜色之间的字节偏移量.如果stride为0,则颜色被理解为紧密排列在阵列中.初始值为0.

pointer指定指向数组中第一个颜色元素的第一个组件的指针.初始值为0.

简单来说,我们可以说sizetype参数指定一个颜色单元的字节数,stride指定连续颜色单元之间的字节偏移.

但是,这个功能如何知道单位总数?众所周知,如果一个数组作为指向函数的指针传递,则不可能通过在函数内使用sizeof()来获取数组的大小.那么当指针参数只是一个GLvoid*指针时,glColorPointer如何知道数组的大小?

c c++ opengl opengl-es

2
推荐指数
1
解决办法
929
查看次数

标签 统计

opengl-es ×2

c ×1

c++ ×1

gpu ×1

ios ×1

memory ×1

opengl ×1