http://www.geekfaner.com/cocos2d-x/ReadCocos2dxSourceCode15.html
课程概述
“Cocos2d-X的纹理(1)”课程概述
游戏中的UI元素各种各样,栩栩如生,而这些UI元素的形状依靠的是顶点坐标,色彩大多都是依靠纹理,纹理也是OpenGL ES中的重要概念。本节课将讲述Cocos2d-X的纹理。
课程笔记
如何将纹理对应到屏幕上
在(Cocos2d-X的核心OpenGL ES)一节中,我们知道了如何将Cocos2d-X的一个UI元素,从本地坐标系,经过矩阵变换,转换到世界坐标系,再经过模型视图矩阵、投影矩阵,转换到裁剪坐标系,再经过视口变换,对应到屏幕上的一个个点(像素)。然而在世界坐标系中的每一个点,不仅对应着一个坐标变量,还对应着一个纹理坐标,指定该点对应纹理中的某个点。顶点坐标为(x、y、z、w),纹理坐标在纹理图片中为(u、v),u、v是纹理的宽度和高度,在fragment shader的纹理坐标为(s、t),为(u、v)的归一化坐标。在光栅化的时候,生成像素点的顶点坐标,并使用插值smooth(或者非插值flat)的方法生成每个像素点的纹理坐标(颜色、深度等),使得屏幕上的点可以与纹理图片中对应。
但是屏幕上的点是离散的,经过了光栅化,一条斜线就是由一些不在一条直线上的点组成,会出现锯齿,为了反锯齿,可以使用多重采样。多重采样,就是在图片的边缘部分,framebuffer上的每个点的颜色不仅是该像素点由fragment shader生成的颜色决定,而是利用了多重采样缓冲区,由该点附近多个位置的颜色、depth、stencil决定。Cocos2d-X默认没有打开多重采样,可以打开并设置multisample buffer的数量,原因是Cocos2d-X主要用于2D游戏的开发,大部分UI元素是规则而且垂直于摄像机。打开多重采样效果好,但是影响性能。
如何将cpu中的纹理图片传入GPU
纹理图片在cpu一般是压缩格式,比如png、jpg,需要解压成glTexImage2D认识的格式,Cocos2d-X提供这样的方法。然后,通过glTexImage2D函数,输入参数为format(纹理图片在cpu中的分量组成),type(纹理图片在cpu中的存储格式和分量组成方式),internalformat(纹理图片在GPU中的分量组成方式)。纹理图片经历了解包、归一划、转换为RGB格式、归一划的过程,存储到了GPU中,在内存中,需要按照UNPACK_ALIGNMENT对齐。当cpu的纹理图片unpack到了GPU,开发者可以把cpu端的纹理图片删除。
纹理属性
可以对纹理设置其属性,包括filter(用于纹理图片于显示区域并非11对应的时候,将纹理图片中的点对应到屏幕上的时候,确定如何采样。)wrap mode(用于在纹理坐标超出纹理尺寸的采样行为)。多级纹理是借用原始纹理生成很多隶属于该纹理的小纹理,借用这些纹理来完成采样。多级纹理可以在游戏中生成,也可以在纹理素材中包含。
纹理的存储格式影响着应用程序包的大小,也占据了游戏的大部分内存。