《OpenGL ES 3.x游戏开发(下卷)》一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”,表示支持此种情况的匹配。

时间: 2024-09-20 05:54:35

《OpenGL ES 3.x游戏开发(下卷)》一1.5 其他缓冲区对象操作的相关文章

《OpenGL ES 3.x游戏开发(下卷)》一导读

前 言 OpenGL ES 3.x游戏开发(下卷) 为什么要写这样一套书 随着智能手机硬件性能的不断提升,如"水果忍者""极品飞车""狂野飙车8:极速凌云"等一批优秀的3D游戏娱乐应用在广大智能机用户间流行开来.与此同时,也带动了手机游戏产业逐渐从2D走向3D.但目前国内专门介绍3D游戏开发的书籍与资料都非常少,同时3D应用开发的门槛又比较高,使得很多初学者无从下手.根据这种情况,笔者结合多年从事3D游戏应用开发的经验编写了这样一套书. 了解一些

《OpenGL ES 3.x游戏开发(下卷)》一1.1 顶点缓冲区

1.1 顶点缓冲区 将绘制物体的顶点数据保存在内存中,在调用glDrawArrays或者glDrawElements等绘制方法前需要调用相应的方法将数据送入显存,I/O开销大,性能不够好. 若采用顶点缓冲区对象存放顶点数据,则不需要在每次绘制前都将顶点数据复制进显存,而是在初始化顶点缓冲区对象时一次性将顶点数据送入显存,每次绘制时直接使用显存中的数据,可以大大提高渲染性能. 1.1.1 基本知识 OpenGL ES 3.0中支持两种类型的顶点缓冲区对象,分别为数组缓冲区对象(Array Buff

《OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》——6.4节点法向量和面法向量

6.4 点法向量和面法向量 OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例 本章前面几节的案例都是基于球面开发的,球面属于连续.平滑的曲面,因此面上的每个顶点都有确定的法向量.但现实世界中的物体表面并不都是连续.平滑的,此时对于面上的某些点的法向量计算就不那么直观了,图6-18说明了这个问题. 从图6-18中可以看出,顶点A位于长方体左.上.前3个面的交界处,此处是不光滑的.这种情况下顶点A的法向量有两种处理策略,具体如下所列. 在顶点A的位置放置3个不同的顶点,每个顶点看作是仅

《OpenGL ES 3.x游戏开发(上卷)》一第1章 Android概述

第1章 Android概述 OpenGL ES 3.x游戏开发(上卷)随着移动互联网时代的到来,智能手机逐渐走进了人们的生活, Google公司于2007年11月5日发布了基于Linux平台的开源手机操作系统--Android.由于Android系统的开源性以及其他各个方面的因素,其受到了广大手机厂商的青睐,因此需要大量的Android开发人员来满足日益增长的海量软件开发需求. 提示 有些读者可能会有一点奇怪,不是介绍OpenGL ES 3.0的知识吗,怎么一开始就介绍Android呢?这是因为

《OpenGL ES 3.x游戏开发(上卷)》一第2章 游戏开发相关的 Android基础知识

第2章 游戏开发相关的 Android基础知识 OpenGL ES 3.x游戏开发(上卷)虽然本书主要是介绍OpenGL ES 3.0 3D应用及游戏开发的,但由于很多3D游戏应用中还需要用到目标平台的一些其他应用开发方面的知识,而本书3D基础知识部分主要是借助于Android平台来介绍OpenGL ES 3.0 3D应用及游戏开发的.故本章将向读者简要介绍一些在Android游戏开发中必备的一些基础知识,如音效.文件的读取.游戏信息的存储.Socket网络.蓝牙网络等. 提示 由于介绍Andr

OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一6.3 定位光与定向光

6.3 定位光与定向光 OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例上一节中介绍的光照效果都是基于定位光光源的,定位光光源类似于现实生活中的白炽灯灯泡,其在某个固定的位置,发出的光向四周发散.定位光照射的一个明显特点就是,在给定光源位置的情况下,对不同位置的物体产生的光照效果不同. 现实世界中并不都是定位光,例如照射到地面上的阳光,光线之间是平行的,这种光称为定向光.定向光照射的明显特点是,在给定光线方向的情况下,场景中不同位置的物体反映出的光照效果完全一致.图6-16中对定位

《OpenGL ES 3.x游戏开发(下卷)》一1.2 顶点数组对象

1.2 顶点数组对象 使用了顶点缓冲技术后,绘制效率有了较大的提升.但是还有一点不尽如人意,那就是顶点的位置坐标.法向量.纹理坐标等不同方面的数据每次使用时需要单独指定,重复了一些不必要的工作.OpenGL ES 3.0考虑到了这一点,提供了一种专门用于解决此问题的对象--顶点数组对象(VAO).本节将介绍顶点数组对象. 1.2.1 基本知识与案例效果 顶点数组对象的主要功能就是将绘制一个物体时所需的对应于不同方面(如顶点坐标.法向量.纹理坐标)的顶点缓冲及相关设置包装成一个整体,绘制时直接使用

《OpenGL ES 3.x游戏开发(下卷)》一2.7 固定渲染管线与可编程渲染管线实现方案的对比

2.7 固定渲染管线与可编程渲染管线实现方案的对比 本章最开始提到过,在固定渲染管线平台上想高效地实现本章案例中的特效是非常困难的.这是因为在固定渲染管线中,顶点数据一旦送入渲染管线后就不可能对其方便地自定义处理了.因此,在固定渲染管线上想实现本章案例中的特效只能采用以下两种策略之一. 提示 回顾一下,OpenGL ES 1.x(含1.0和1.1)采用的是固定渲染管线,从OpenGL ES 2.0开始采用可编程渲染管线. 1.初始化时预先计算数据此种策略的基本思想非常简单,就是在初始化时将动画中

《OpenGL ES 3.x游戏开发(下卷)》一1.3 一致缓冲区对象

1.3 一致缓冲区对象 本丛书上卷第4章已经介绍过一致变量的相关知识,读者也已经了解到可以将多个一致变量的声明通过类似结构体形式的一致块来实现.对于一致块而言,宿主语言(如Java)将值传入渲染管线时就需要使用一致缓冲区对象,本节将介绍这方面的知识,同时还会给出一个简单的案例. 1.3.1 基本知识与案例效果 介绍具体的案例开发之前,有必要先了解一下与一致缓冲区对象相关的基础知识.主要包括存储形式和相关方法两个方面,具体内容如下. 1.存储形式 从前面的介绍中已经了解到,一致缓冲区是为了向一致块