社区
Android
帖子详情
OpenGL ES 将一个纹理的内容拷贝到另一个纹理上,有比glCopyTexSubImage2D更好的方法吗
rcbblgy
2012-12-30 12:06:44
glCopyTexSubImage2D是直接在显存上的拷贝吗?需不需要经过CPU、内存的中转处理?
现在的需求是想将一个纹理的内容拷贝到另外一个纹理上,有没有更快的方法?
...全文
741
2
打赏
收藏
OpenGL ES 将一个纹理的内容拷贝到另一个纹理上,有比glCopyTexSubImage2D更好的方法吗
glCopyTexSubImage2D是直接在显存上的拷贝吗?需不需要经过CPU、内存的中转处理? 现在的需求是想将一个纹理的内容拷贝到另外一个纹理上,有没有更快的方法?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
rcbblgy
2012-12-31
打赏
举报
回复
引用 1 楼 xqhrs232 的回复:
直接迭加吧,坐标相同就迭了
能说具体一点吗
xqhrs232
2012-12-31
打赏
举报
回复
直接迭加吧,坐标相同就迭了
OPhone平台
2D
游戏引擎实现——物理引擎
OPhone平台
2D
游戏引擎实现——物理引擎(一) OPhone平台开发, 2010-10-19 17:27:20 标签 : Ophone平台
2D
游戏 引擎 上一篇文章我们介绍了常见的各种游戏特效的实现,你现在可以很轻松的实现各种游戏中所需要的特效,但是,你可能已经意识到了,我们的游戏一般都需要进行碰撞检测,比如前面的火柴棍小人,我们需要检测子弹和敌人之间的碰撞;碰撞检测通常是游戏开发的难点,作为引擎必然少不了碰撞检测部分,这里我们还是按照cocos
2d
的构架,使用Box
2d
作为物理引擎,下面我们将通过在Ophone平台实现
一个
小游戏,来对Box
2d
物理引擎进行学习。 Box
2d
Box
2D
是
一个
用于游戏的
2D
刚体仿真库,它可以使物体的运动更加真实,让游戏场景看起来更具交互性。
2D
物理引擎能增强游戏世界中物体如多边形(砖块,三角形,多边形)的动作的真实感从而提高游戏质量。该引擎通过用户设定的参数如重力,密度,摩擦,弹性等参数计算碰撞,角度,力和动力等。这些计算需要大量的数学,物理等知识,如果有兴趣也可以下载其源码来研究。 Box
2d
同时也提供了各种语言环境的实现,由于Ophone平台使用java作为变成语言,所以我们将选择使用Box
2d
的java版JBox
2d
,这也将产生
一个
问题,JBox
2D
是用proc
es
sing库来处理图像显示,所以Ophone平台上则不适用,在Ophone平台上的图像渲染主要包括两种:Canvas和
Open
gl
ES
,因此我们可以任选其中一种,这里为了配合我们的引擎实现,选择通过
Open
gl
ES
来作为渲染部分,这部分就需要我们自己来实现,其实我们也可以不使用其图像渲染部分,因为我们主要是使用Box
2d
来做物理检测,稍后我们会通过
一个
实例游戏来介绍。 另外,比较优秀的
2D
物理引擎还有Chipmunk,对于谁好谁坏,我们这里不去评价,如果要使用Chipmunk作为物理引擎会比Box
2d
稍微苦难一些,因为Chipmunk目前没有Java版本,所以只能通过JNI方式来使用,这就需要使用NDK来开发原生的C程序,使用C语言来做,效率要高很多,但是开发,调试的难度也将增加,有机会我们将可以介绍如何使用NDK来编写C程序,并同时整合Chipmunk物理引擎。 这里只是我们对Box
2d
的
一个
简单介绍,让大家明白其用处,关于更多详细信息,大家可以参考其官方网站http://www.box
2d
.org/,图12-1则是cocs
2d
中演示的Box
2d
物理引擎效果,学完这部分
内容
,你也可以很轻松将其运行在Ophone平台上。 图12-1 cocos
2d
Iphone Box
2d
演示 图12-1中这每个方块都具有重力,摩擦力,碰撞检测规则,他们都处于同
一个
世界场景中,不必眼红Iphone开发者,下面就给大家看一下,我们在Ophone平台提供的示例物理小游戏。 在学习使用Box
2D
引擎之前,我们需要了解一下一些常用的概念: 刚体(rigid body) 一块十分坚硬的物质,它上面的任何两点之间的距离都是完全不变的。它们就像钻石那样坚硬。我们用物体(body)来代替刚体。 形状(shape) 一块严格依附于物体(body)的
2D
碰撞几何结构(collision geometry)。形状具有摩擦(friction)和恢复(r
es
titution)的材料性质。 约束(constraint)
一个
约束(constraint)就是消除物体自由度的物理连接。在
2D
中,
一个
物体有 3 个自由度。如果我们把
一个
物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上。这样,此物体就只能绕着这个钉子旋转,所以这个约束消除了它 2 个自由度。 接触约束(contact constraint)
一个
防止刚体穿透,以及用于模拟摩擦(friction)和恢复(r
es
titution)的特殊约束。你永远都不必创建
一个
接触约束,它们会自动被 Box
2D
创建。 关节(joint) 它是一种用于把两个或多个物体固定到一起的约束。Box
2D
支持的关节类型有:旋转,棱柱,距离等等。关节可以支持限制(limits)和马达(motors)。 关节限制(joint limit)
一个
关节限制(joint limit)限定了
一个
关节的运动范围。例如人类的胳膊肘只能做某一范围角度的运动。 关节马达(joint motor)
一个
关节马达能依照关节的自由度来驱动所连接的物体。例如,你可以使用
一个
马达来驱动
一个
肘的旋转。 世界(world)
一个
物理世界就是物体,形状和约束相互作用的集合。Box
2D
支持创建多个世界,但这通常是不必要的。 这里先给大家介绍就是让大家明白Box
2d
包括哪些
内容
,稍后对框架的介绍时就能更加容易理解,当然对于这些具体的功能,我们会在后面跟着示例代码一起学习。 Ophone Box
2d
首先分析一下我们在Ophone平台上的Box
2d
Demo需要实现什么功能,首先我们将整个屏幕构建成
一个
盒子,然后再盒子中设置各种障碍,当我们触摸屏幕上任意位置时,就释放
一个
当前选择的物体,然后该物体将受到重力等因素的影响开始运动,直到最后静止下来。运行效果如图12-2所示。 图12-2 OphoneBox
2d
效果 屏幕中间的长条则是我们设置的障碍,而圆形和矩形都是我们在点击屏幕时要释放的物体,前面我们说过,JBox
2d
中的图形部分在Ophone中不能用,所以我们会专门介绍如何通过
Open
gl
ES
来对图形图像进行渲染,另外,该示例中的这些物体都是通过
纹理
映射来将图片映射到四边形上。为了大家能掌握图形系统相关
内容
,我们还实现了
一个
功能,玩家可以自己设置障碍,只需要点击Menu中,选择"编辑模式"就可以进入障碍编辑状态,如图12-3所似。 图12-3 障碍编辑状态 当障碍编辑完成之后再次选择编辑模式,则恢复到游戏中,此时我们所编辑的这些障碍都会正常的运行。当然该过程我们并没有使用引擎来完成,目的在于让大家更清楚渲染的原理,以及代码能够更多的重用,也就是说,大家可以直接
拷贝
代码到需要的游戏中去即可。同时大家也能掌握很多
Open
gl
ES
的相关知识。 Ophone平台如何使用JBox
2d
要使用JBox
2d
我们首先需要获得其源码或者jar包,这个就不用多说了,知道其官方网站下载即可,这里我们下载了
一个
完整版本jbox
2d
-2.0.1-full.jar,让后将其放入我们所建立OphoneBox
2d
工程的lib文件夹下,JBox
2d
中大致包含了如图12-4所示的一些包: 图12-4 JBox
2d
结构图 其中org.jbox
2d
.collision比较重要,主要负责处理碰撞相关,包括对一些多边形的实现,这里所说的多边形主要是一些数据,比如多边形的位置,大小,重力,形状,质量等属性;org.jbox
2d
.common包主要用来设置一些全局的属性(Setting.java),调试时所使用的颜色(Color3f.java),以及其他的一些数学相关的
内容
,因为我们说了Box
2d
他主要不是来做渲染的,但是有时候我们需要知道所设置的这些物体是否正确,进行调试,就需要绘制这些简单的图形,并显示出来,供我们调试;org.jbox
2d
.dynamics包主要负责动力学相关的
内容
,下面是常见的功能包描述。 org.jbox
2d
.collision包 AABB:AABB坐标 OBB:OBB坐标 ContactID:接触ID ContactPoint:接触点 ManifoldPoint:繁殖点 Segment:线段 Shape:外形基类 ShapeDef:外形定义基类 CircleDef:圆外形定义 Circl
eS
hape:圆外形 FilterData:碰撞过滤器 MassData:质量运算器 PolygonDef:多边开定义 PolygonShape:凸多边形 org.jbox
2d
.common包 Color3f:调试绘图颜色 Settings:全局设置 Mat22:2*2 矩阵 Sweep:碰撞描述 Vec2:向量(x ,y) XForm:坐标转换,平移或旋转 标准的版本中还会存在Mat33表示3*3的矩阵和Vec3向量(x,y,z),该java版本中没有出现这些。 org.jbox
2d
.dynamics包 Body:刚体或叫物体 BodyDef:刚体定义 BoundaryListener:世界边界侦听 ContactFilter:继承这个类用来获取过滤碰撞 ContactListener:继承这个类用来获取碰撞结果 DebugDraw:调试绘图,用于调试 D
es
tructionListener:关节或外形销毁时处理
方法
World:物理世界 org.jbox
2d
.dynamics.contacts Contact:管理两个外形接触 ContactEdge:接触边用来连接多个物体和接触到
一个
接触表 ContactR
es
ult:记录接触结果 org.jbox
2d
.dynamics.Joints DistanceJoint:距离校正器 DistanceJointDef:距离连接定义 GearJoint:齿轮 GearJointDef:齿轮连接定义 Joint:连接基类 JointDef:连接定义基类 JointEdge:用于组合刚体或连接到一起.刚体相当于节点,而连接相当于边 MouseJoint:鼠标连接 MouseJointDef:鼠标连接定义 PrismaticJoint:棱柱连接 PrismaticJointDef:棱柱连接定义 PulleyJoint:滑轮连接 PulleyJointDef:滑轮连接定义 RevoluteJoint:旋转连接 RevoluteJointDef:旋转连接定义 org.jbox
2d
.t
es
tbed:主要是一些用来测试的程序 添加JBox
2d
到Ophone项目中 要在工程中使用JBox
2d
库,需要将JBox
2d
添加到工程中,添加
方法
如下: 右键单击工程,选择"Properti
es
",进入项目Properti
es
界面。 选择"Java Build Path",选择"Librari
es
"选项卡。 在点击"Add Jars..."按钮,添加Jar。 选择当前工程中我们之前放入lib文件夹中的jbox
2d
-2.0.1-full.jar文件,如图12-5所示,单击"确定"按钮即可。 图12-5 添加jbox
2d
-2.0.1-full.jar OphoneBox
2d
框架 现在工程的结构展开应该如图12-6所示。 图12-6 OphoneBox
2d
项目结构 其中实现该工程的文件如下: Box
2d
T
es
t:工程Activity,入口 Game
GL
SurfaceView:游戏
GL
SurfaceView
GL
Renderer:
Open
gl
es
渲染器 DrawObject:使用
Open
gl
ES
来绘制常用图形(矩形,圆形) PhysicsWorld:物理世界场景 OphoneBox
2d
实现 开始分析代码之前,我们先确定一下需要准备的资源图片,从图12-2所示,我们可以看出,多少需要
一个
矩形和
一个
圆形的图片(当然也可直接指定颜色绘制矩形和圆形),这里我们将使用图片来进行
纹理
映射,该工程所需要的
纹理
图片如图12-7所示。 图12-7 资源图片 Box
2d
T
es
t实现 该类继承自Activity,将作为本程序的入口,授予我们是通过
Open
gl
ES
来渲染的,所以构建需要构建
一个
GL
SurfaceView对象作为
Open
gl
ES
的窗口,然后通过setContentView函数来设置显示该窗口视图。然后分别在onPause和onR
es
ume函数中调用
GL
SurfaceView类的
GL
SurfaceView。当然这也是所有
Open
gl
ES
程序的渲染基础框架,所有的
Open
gl
ES
程序窗口都由
GL
SurfaceView来实现。具体实现入代码清单12-1所示。
Open
GL
纹理
拷贝
的两种
方法
然后,将源
纹理
绑定到帧缓冲区的颜色附着点,然后使用
gl
Copy
Tex
Sub
Image
2D
函数将源
纹理
的一部分数据
拷贝
到目标
纹理
中。最后,恢复
Open
GL
的状态。然后,将源
纹理
绑定到帧缓冲区的颜色附着点,然后使用
gl
Copy
Tex
Image
2D
函数将源
纹理
的数据
拷贝
到目标
纹理
中。在本文中,我将介绍两种常用的
Open
GL
纹理
拷贝
方法
,并提供相应的源代码示例。
gl
Copy
Tex
Sub
Image
2D
函数也可以用于
纹理
拷贝
,但与
gl
Copy
Tex
Image
2D
不同的是,它只
拷贝
纹理
的一部分数据。
Open
GL
萌谷手册视频教程
Open
GL
视频培训课程,本课程带领完全没有基础的学员打下坚实的
Open
GL
学习基础,
内容
包括
OPen
GL
框架搭建、矩阵、光照、
纹理
、3D模型绘制、键盘鼠标、模型渲染、
纹理
贴图等详细
内容
。
Open
GL
中如何将某个
tex
ture
拷贝
到另外
一个
tex
ture
参考stackoverflow,可行的
方法
为 一、使用
gl
Copy
Image
Sub
Data,这个
方法
最直观而且简单。不过需要
Open
GL
4.3 二、为目标
tex
ture创建FBO。使用shader,采用
tex
ture
2D
把源
tex
ture画到目标
tex
ture 三、为源
tex
ture创建FBO。使用
gl
Copy
Tex
Sub
Image
2D
从framebuffer
拷贝
到目标
纹理
fboId = src
Tex
->GetFrameBufferId();
gl
BindFramebu.
Open
GL
拷贝
纹理
的两种方式
一种是直观的使用
gl
Get
Tex
Image
,然后获取数据到内存再贴上去,这种
方法
很慢 另一种是使用FBO,将
纹理
附加到FBO,然后用
gl
Copy
Tex
Sub
Image
2D
,不涉及跟内存交换数据,速度飞快。
方法
一:获取
纹理
再
拷贝
unsigned char * data = new unsigned char[normal_
tex
ture.width*normal_
tex
ture.Hight*4];
gl
Bind
Tex
ture(
GL
_
TEX
TURE_
2D
,src_id); .
Android
80,350
社区成员
91,288
社区内容
发帖
与我相关
我的任务
Android
移动平台 Android
复制链接
扫一扫
分享
社区描述
移动平台 Android
android
android-studio
androidx
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章