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

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

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。



2013-12-29更新:

写完下面这些,感觉思路有些清晰了,可是我的中心意思,还没表达出来。

这个情况,实际生活中也发生过,其实应该在跟别人说之前,先自已说出来,

要不然,你以为你明白了,但真正能找到适当的语言来表达出来,才能真正让别人明白。

没有这个人后的准备步骤,那么在人前,就会越说越乱,而自已还感觉很清晰的样子。

不过还有一种可能,

不是你的问题,而是听者,你再怎么用简炼、平实的话来说,都听不懂,

那这个还是你的问题,你为什么要找一个不专业的人,作为你的听众呢?

哈哈哈,有时侯,就是经常发生这样的事情,你还必须向不专业或根本就不粘边的人,说明白技术细节,

这时,最好的办法是别说技术本身,挑他关心的事情来说就好了,

虽然,到了,旁人听不懂你的胡邹什么,但你需要向其说明的人,确听得津津乐道,

因为他只关心他关心的事情,并不关心你和旁人所关心的事情,虽然你和旁人都是技术专家。

切忌,切忌!

切记,切记!

见人说人话,见鬼说鬼话,无论用中文,还是英文,最终解答清楚对方关心的是最重要的,

即对方心里的想法,而非他嘴上说的,因为他毕竟不专业,说出的问题,可能都是比萨斜塔......


纹理单元是 OpenGL ES 的一个状态,表示当前要处理的该单元目标;

简单地说,是个容器,它本身并没有内容,是需要装入其它内容的,即纹理对象。

一个纹理贴图,可以创建一个纹理对象,该纹理对象是缓存在 GPU 的内存中的,可以同时有很多个纹理对象缓存在 GPU 中,以减少 CPU 与 GPU 之间的数据交换,提高效率。

这么多个纹理对象,当前渲染引擎处理某个片元时,该用哪一个呢?

那要看你把它装入哪个纹理单元了。

而且创建了一个纹理对象后,要给该纹理对象填充贴图图片的数据,也得先把纹理对象绑到一个纹理单元上,再针对这个纹理单元来操作。

就像是你拿瓶子去打小烧酒一样,直接往你的瓶子里倒,这不合规矩,那样会洒,算谁的呀!

所以得先弄个漏斗插到瓶口上,然后往漏斗里倒酒。

一家店可能就那么两三个漏斗,但瓶子可就多了去了,不过记住,要操作纹理对象,一定要先绑到纹理单元上,或者简单地理解为,料要夹在机床上,才能加工。


从下面的声明中,可以看得出,一共有32个可用的漏斗,或者是32个机床,每个机床旁边堆了多少块料,这个就不知道了,而且一个机床旁的原料,可以放到另一个机床上加工。

看来机床和待加工的原料,这种比喻比较贴切一些。

自个儿理解去吧,我可以很肯定按这个比喻,我能很好的理解。

至于做到,还在进行时,希望在田野上!

    // 声明纹理对象句柄
    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 中有如下定义

/* 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


你可能感兴趣的:(OpenGL ES 可用纹理单元数量与大量纹理的思考)