一、Textures简介
为了让图形更加生动,需要添加更多的顶点和图形的细节,才能创建出图像。但是,如果想让图形看起来更加真实,我们则必须使用足够多的顶点,从而指定足够多的颜色,即每个图形需要更多的顶点,每个顶点又需求一个颜色属性。为了减少工作量,我们使用纹理(Texture),纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;我们可以想象一张画有窗户纸(window.jpg),把他贴在墙上,这样墙上看起来就像有窗户了,而这张图片我们可以插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。
基于Adreno SDK项目实现过程中,我们也可以通过纹理加载来使得最终取得更好的效果。
二、OpenGL纹理实现
为了使纹理映射到图形上,我们需要指定图形顶点对应纹理的哪一部分,这样就会有顶点关联纹理坐标这样一个关系,标明该从纹理的哪个部分进行采样,之后在图形的其它片断上进行片断插值。
1、定义纹理坐标数组。根据实际顶点数目确定,同时以数组形式保存其坐标。
2、确定纹理环绕方式。环绕方式有以下几种类型:
可以使用glTexParameter()函数对其进行设定,以下为简单实例:
从上图中我们可以到生成一个纹理的简单流程。在glTexParameter()函数中,第一个参数代表的为2D纹理,第二个指定设置的选项与应用的纹理轴,图中分别为坐标轴S和T,配置的为WRAP选项。
3、生成纹理:
GLuint texture;
glGenTextures(1, &texture);
参数分别代表的为生成纹理的数量1;存储的缓冲区。
绑定:glBindTexture(GL_TEXTURE_2D, texture);
根据加载的图片生成纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
4、最后为纹理应用:
应用之前需要添加额外的顶点属性,告诉OpenGL新顶点的格式,在着色器程序中的顶点着色器、片段着色器之中都进行引用声明。
最后在draw过程调用以下函数进行实现:
glBindTexture(GL_TEXTURE_2D, texture);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
5、实例函数解析:
上面实例中用到了VAO和VBO两个参数,此处的声明其实并不随意,了解的人可能已经知道了。
顶点数组对象(Vertex Array Object,)可以像顶点缓冲对象那样被绑定,任何随后的顶点属性调用都会储存在这个VAO中。这样的好处就是,当配置顶点属性指针时,你只需要将那些调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。这使在不同顶点数据和属性配置之间切换变得非常简单,只需要绑定不同的VAO就行了。
VBO为顶点缓存对象(Vertex Buffer Object),它会在GPU内存(通常被称为显存)中储存大量顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。
此外还有VA(顶点数组)、EBO索引缓存对象,这部分内容可以对我们开发过程提供很大的帮助。
三、总结
以上为Textures的简单介绍,同Shader一样作为OpenGL开发过程中绕不过的部分,对于基于Adreno SDK开发来说是需要熟练掌握的内容模块。