您的位置:首页 > 运维架构

OpenGL ES 可用纹理单元数量与大量纹理的思考

2018-03-19 14:53 232 查看
OpenGL ES 可用纹理单元数量与大量纹理的思考
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商业用途-保持一致”创作公用协议转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

2013-12-29更新:
写完下面这些,感觉思路有些清晰了,可是我的中心意思,还没表达出来。
这个情况,实际生活中也发生过,其实应该在跟别人说之前,先自已说出来,
要不然,你以为你明白了,但真正能找到适当的语言来表达出来,才能真正让别人明白。
没有这个人后的准备步骤,那么在人前,就会越说越乱,而自已还感觉很清晰的样子。
不过还有一种可能,
不是你的问题,而是听者,你再怎么用简炼、平实的话来说,都听不懂,
那这个还是你的问题,你为什么要找一个不专业的人,作为你的听众呢?
哈哈哈,有时侯,就是经常发生这样的事情,你还必须向不专业或根本就不粘边的人,说明白技术细节,
这时,最好的办法是别说技术本身,挑他关心的事情来说就好了,
虽然,到了,旁人听不懂你的胡邹什么,但你需要向其说明的人,确听得津津乐道,
因为他只关心他关心的事情,并不关心你和旁人所关心的事情,虽然你和旁人都是技术专家。
切忌,切忌!
切记,切记!
见人说人话,见鬼说鬼话,无论用中文,还是英文,最终解答清楚对方关心的是最重要的,
即对方心里的想法,而非他嘴上说的,因为他毕竟不专业,说出的问题,可能都是比萨斜塔......

纹理单元是 OpenGL ES 的一个状态,表示当前要处理的该单元目标;
简单地说,是个容器,它本身并没有内容,是需要装入其它内容的,即纹理对象。
一个纹理贴图,可以创建一个纹理对象,该纹理对象是缓存在 GPU 的内存中的,可以同时有很多个纹理对象缓存在 GPU 中,以减少 CPU 与 GPU 之间的数据交换,提高效率。
这么多个纹理对象,当前渲染引擎处理某个片元时,该用哪一个呢?
那要看你把它装入哪个纹理单元了。
而且创建了一个纹理对象后,要给该纹理对象填充贴图图片的数据,也得先把纹理对象绑到一个纹理单元上,再针对这个纹理单元来操作。
就像是你拿瓶子去打小烧酒一样,直接往你的瓶子里倒,这不合规矩,那样会洒,算谁的呀!
所以得先弄个漏斗插到瓶口上,然后往漏斗里倒酒。
一家店可能就那么两三个漏斗,但瓶子可就多了去了,不过记住,要操作纹理对象,一定要先绑到纹理单元上,或者简单地理解为,料要夹在机床上,才能加工。

从下面的声明中,可以看得出,一共有32个可用的漏斗,或者是32个机床,每个机床旁边堆了多少块料,这个就不知道了,而且一个机床旁的原料,可以放到另一个机床上加工。
看来机床和待加工的原料,这种比喻比较贴切一些。
自个儿理解去吧,我可以很肯定按这个比喻,我能很好的理解。
至于做到,还在进行时,希望在田野上!
[objc] view plain copy // 声明纹理对象句柄  
GLuint textureHandle = 0;  
// 生成纹理对象,并将句柄赋给 textureHandle  
glGenTextures(1, &textureHandle);  
// 激活当前 GL_TEXTURE_2D 纹理单元为 GL_TEXTURE1,32个同时只能有一个是在处理的  
glActiveTexture(GL_TEXTURE1);  
// 将纹理对象绑定到 GL_TEXTURE_2D 当前激活的纹理单元 GL_TEXTURE1 上  
// GL_TEXTURE_2D 当前操作台,GL_TEXTURE1 是当前用的漏斗子,textureHandle 是酒瓶子,绑定到当前操作台就是把当前选定的漏斗子插到这个瓶子上  
glBindTexture(GL_TEXTURE_2D, textureHandle);  
  
// 一堆不知道干什么的东西,据说可以用来解决锯齿,实际没看到有效果  
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);  
  
// 把酒通过这个选定的漏斗 GL_TEXTURE1 灌到瓶子里:最终是图片存储到 GPU 上分配的纹理对象 textureHandle 上去  
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 768, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);  
// 生成 Mipmap 是针对操作台 GL_TEXTURE_2D 上的选定漏斗 GL_TEXTURE1 所插在的瓶子里的酒的,即处理图片  
glGenerateMipmap(GL_TEXTURE_2D);  

OpenGLES/ES2/gl.h 中有如下定义
[objc] view plain copy /* TextureUnit */  
#define GL_TEXTURE0                                      0x84C0  
#define GL_TEXTURE1                                      0x84C1  
#define GL_TEXTURE2                                      0x84C2  
#define GL_TEXTURE3                                      0x84C3  
#define GL_TEXTURE4                                      0x84C4  
#define GL_TEXTURE5                                      0x84C5  
#define GL_TEXTURE6                                      0x84C6  
#define GL_TEXTURE7                                      0x84C7  
#define GL_TEXTURE8                                      0x84C8  
#define GL_TEXTURE9                                      0x84C9  
#define GL_TEXTURE10                                     0x84CA  
#define GL_TEXTURE11                                     0x84CB  
#define GL_TEXTURE12                                     0x84CC  
#define GL_TEXTURE13                                     0x84CD  
#define GL_TEXTURE14                                     0x84CE  
#define GL_TEXTURE15                                     0x84CF  
#define GL_TEXTURE16                                     0x84D0  
#define GL_TEXTURE17                                     0x84D1  
#define GL_TEXTURE18                                     0x84D2  
#define GL_TEXTURE19                                     0x84D3  
#define GL_TEXTURE20                                     0x84D4  
#define GL_TEXTURE21                                     0x84D5  
#define GL_TEXTURE22                                     0x84D6  
#define GL_TEXTURE23                                     0x84D7  
#define GL_TEXTURE24                                     0x84D8  
#define GL_TEXTURE25                                     0x84D9  
#define GL_TEXTURE26                                     0x84DA  
#define GL_TEXTURE27                                     0x84DB  
#define GL_TEXTURE28                                     0x84DC  
#define GL_TEXTURE29                                     0x84DD  
#define GL_TEXTURE30                                     0x84DE  
#define GL_TEXTURE31                                     0x84DF  
#define GL_ACTIVE_TEXTURE                                0x84E0  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: