本节书摘来异步社区《OpenGL ES 3.x游戏开发(下卷)》一书中的第1章,第1.5节,作者: 吴亚峰 责编: 张涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.5 其他缓冲区对象操作
前面已经介绍了顶点缓冲区对象、顶点数组对象、一致缓冲区对象以及映射缓冲区对象,本节将介绍两个其他的缓冲区对象操作,包括复制缓冲区对象(Copying Buffer Objects)以及从颜色缓冲区复制纹理数据(Copying Texture Data from the Color Buffer)。
1.5.1 复制缓冲区对象
到目前为止,已经介绍了如何使用glBufferData、glBufferSubData以及 glMapBufferRange方法将数据加载到缓冲区中,所有这些方法都涉及从内存到显存的数据传输。其实在OpenGL ES 3.0中还可以直接从一个缓冲中将数据复制到另一个缓冲中,此时就需要使用复制缓冲区对象。
使用复制缓冲区对象很简单,调用glCopyBufferSubData方法完成复制即可,其具体方法签名如下。
1 public static void glCopyBufferSubData (
2 int readTarget, int writeTarget,int readOffset, int writeOffset, int size)
说明
此方法的功能为将绑定到readTarget缓冲中的数据复制进绑定到writeTarget的缓冲中,其中readTarget与writeTarget参数可以采用本章前面表1-1中列出的值。writeTarget参数为在目标缓冲中写入数据的偏移量,以字节计算。
readOffset参数为从源缓冲中读取数据的偏移量,也是以字节计算。参数size为需要复制的数据字节数。
提示
若不希望由于缓冲区数据的复制而干扰其他GL状态,则可以将源缓冲绑定到GL_COPY_READ_BUFFER类型,将目标缓冲绑定到GL_COPY_WRITE_BUFFER类型再进行复制。
1.5.2 从颜色缓冲区复制纹理数据
OpenGL ES 3.0中支持的另一个缓冲区特殊操作就是允许将颜色缓冲中的数据复制进指定的纹理中,这在很多特殊绘制中可以提供不少方便。从颜色缓冲中复制数据到指定纹理的相关方法包括glCopyTexImage2D、glCopyTexSubImage2D、glCopyTexSubImage3D及glReadBuffer等,具体方法签名及说明如表1-7所列。
表1-7中方法glCopyTexImage2D的参数internalformat表示纹理的内部格式,共有34种可能的取值,具体情况如表1-8所列。
说明
表1-8中给出了纹理的34种内部格式,每种内部格式都不尽相同,由于篇幅所限,这里不再详细解释,若读者有兴趣可以自行查阅相关书籍或资料。
使用glCopyTexImage2D、glCopyTexSubImage2D和glCopyTexSubImage3D方法时要注意两点:
进行复制之前首先要调用glReadBuffer方法设置被复制的颜色缓冲区。
纹理图格式拥有的颜色分量不能多于复制颜色缓冲区中的颜色分量。也就是说,复制颜色缓冲区中的数据时,可以转换为分量较少的格式,但不能转换为分量较多的格式,具体情况如表1-9所列。
说明
表1-9中A代表GL_ALPHA,L代表GL_LUMINANCE,LA代表GL_LUMINANCE_ALPHA,R代表GL_RXXX,RG代表GL_RGXXX,RGB代表GL_RGBXX,RGBA代表GL_RGBAXXX,具体内容参见表1-8。另外,N代表“NO”,表示不支持此种情况的匹配;Y代表“YES”,表示支持此种情况的匹配。