##纹理
我所理解的cocos2d-第五章 纹理 相关笔记;以及一些补充及练习
###简述:
想要增加图形的真实性,我们需要为每个顶点添加颜色来增加图形的细节,需要足够多的顶点,从而指定足够多的颜色,这将产生很多额外开销。
使用纹理(Texture),使其贴合到3D模型的面上,可以方便的添加物体的细节。在一张图片上可以插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。
此外,纹理也可以被用来储存大量的数据,这些数据可以发送到着色器上。
目录:
- 1 光栅化
- 2 cocos2d中使用纹理(存储格式、传输、缩放、压缩、生命周期)
###纹理使用
纹理数据传输到gpu内存后,在片段着色器工作时,根据光栅化阶段插值计算得到的纹理坐标从纹理中进行采样进行着色。
除了着色,使用漫反射贴图(不同材质下的光照效果),镜面光贴图(漫反射强度),法线贴图(使用rgb向量表示法向量的纹理,纵深感)可以实现更丰富的光照效果;使用视差贴图实现立体感;(1)
####1 光栅化
步骤:
- 光栅化前:根据顶点装配好的指定形状的图元(如3角形)生成形状(输出用于光栅化)
- 根据图元 (4),确定需要覆盖的片段
- 计算顶点间每个片段的颜色和深度
- 光栅化后:根据数据进行片段操作
即 像素化;
将图元映射到2d屏幕上的整数坐标上相应的像素,并转化为含有颜色 深度 模板值的片段供片段着色器(Fragment Shader)使用。
在片段着色器运行之前会执行裁切。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。
光栅化过程中可能出现锯齿,使用多重采样使像素之间能光滑过渡,当游戏中多为不规则线段则需开启多重采样(cocos控制是否开启:multiSampling)
片段:是OpenGL渲染一个像素所需的所有数据。
裁切:在一个顶点着色器运行的最后,OpenGL期望所有的坐标都能落在一个特定的范围内,且任何在这个范围之外的点都应该被裁剪掉。被裁剪掉的坐标就会被忽略,所以剩下的坐标就将变为屏幕上可见的片段。如果只是图元则opengl会重新构建图元适配裁剪范围,如3角形则重构一个3角形或多个3角形(exc-pyqt5)。
####2 cocos2d中使用纹理(存储格式、传输)
1 CCImage.cpp(图像加载)
- 像素格式与类型 的组合(RGBA-UNSIGNED_BYTE-4, RGB-UNSIGNED_BYTE-3, RGBA-UNSIGNED_SHORT_4_4_4_4-2…) 即最多可有 4X8 = 32 位的颜色
- 指定对应的服务端格式(如 _renderFormat = Texture2D::PixelFormat::I8)
- 。。。
2 CCTexture2D.cpp(数据传输, 图像数据设置, initWithMipmaps)
- 客户端图像常压缩为png或jpg格式(占更少的磁盘空间),创建纹理对象(glGenTextures)后,传至GL服务端(glTexImage2D)前需转换为对应格式,
- 创建纹理时,指定按多少位对齐(glPixelStorei)可提升传输性能
- 数据格式的转换(convertDataToFormat)当图像不为多级纹理或压缩纹理时将自动转化为
- 。。。
像素格式与类型
rgba数据中每个分量可以占据一个byte,每个byte8位,所以最多支持4x8 = 32位。 就是2的32次方 种颜色;
##参考
1 https://www.cnblogs.com/alps/p/5793650.html 贴图使用
2 https://blog.youkuaiyun.com/rong_toa/article/details/80205568
3 https://blog.youkuaiyun.com/wanlixingzhe/article/details/7107923
4 https://blog.youkuaiyun.com/jing16337305/article/details/80182815 图元
5 https://learnopengl-cn.github.io/01 Getting started/04 Hello Triangle/ 渲染管线
6 http://www.zwqxin.com/archives/opengl/opengl-api-memorandum-2.html 纹理数据传输