Articles of opengl es2

如何在一个平局中处理大量的纹理?

我目前正在开发文字渲染和基于纹理混合的简单风景的纹理。 例如类似的东西,但在3D中。 在第一个实现中,我已经使用2D纹理数组来实现纹理切换的问题,以便能够在一个opengl绘制调用中绘制整个景观网格,并且效果很好,但是这应该在opengl es 2.0设备上运行,并且它们没有2纹理arrays支持。 所以我的问题是 – 我能做些什么来处理这样的问题呢? 当然,我可以分别绘制每个景观四元组,但是我非常确定,这个解决scheme真的会真正的performance真正的心脏。 (MB我错了?) 我也知道纹理图集,但是我可以保证我可以把所有可能的纹理分块着色器为每个可能的瓷砖组合?(地形瓷砖风景和每个可能的文字字符大小不同,我想你明白了)我几乎当然,我不能,这就是为什么我在这里问这个问题。 对不起,我可怕的英语,我正在努力。

何时调用GLBindTexture时,使用恶意表?

最初,我为我的精灵的animation使用了单独的纹理(即单个的.png文件),并最近更改了我的代码,以便我可以将所有的animation帧放到1个文件中(所以它基本上就像是一个迷你精灵表 – 迷你',因为我使用每个精灵1个文件,我没有使用1个文件我所有的精灵)。 无论如何,我的问题涉及glBindTexture 。 最初,当我想更新animation帧时,我正在切换纹理,所以在我的精灵的绘制方法中调用它: GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texID); //texID being the texture ID 但是,现在发生的是我找出纹理偏移量,并指向我需要的纹理的一部分。 纹理本身不会改变,所以每次画图时我都需要这一行吗? 我尝试从我的draw()方法中删除线条,并在最初加载纹理时调用它,但是精灵没有使用正确的纹理进行绘制,而是使用完全不同的非相关纹理。 那么在使用精灵表的情况下,正确的行为是什么呢? 目前,我不知道为什么这会比使用单个文件和每帧切换纹理更快。 事实上,由于我现在不得不计算纹理偏移量(而之前它是固定的),所以会有更多的开销。 所以我猜测这个优势来自于每次绘制时都不需要调用这个glBindTexture线(因为它很昂贵)。 那么如何正确地select纹理来分配给这个精灵,而不是在绘制方法中呢? 任何帮助将不胜感激,如果你需要代码请问我没有发布我的整个绘制方法,因为我不认为有必要解释这个问题。 这是我以前做的事情 Bind texture 1 (Animation frame 1, textures 1-8 belong to this sprite) Draw Sprite 1 Bind texture 9 Draw Sprite 2 重复绑定纹理2,然后3等等的精灵1animation 我现在使用一个包含所有8个animation帧的sprite1纹理 Bind texture 1 (all frames) Draw Sprite 1 (pointing […]

OpenGL ES,正射投影和视口

我想在iOS上做一些简单的2D游戏来熟悉OpenGL ES。 我从Ray Wenderlich的教程开始( 如何用OpenGL ES 2.0和GLKit创建简单的2D iPhone游戏 )。 这个教程相当不错,但我错过了一个难题的一些部分。 Ray使用一些像480和320这样的魔术数字来创建一个正交投影。我不清楚他为什么拿这些数字,并且据我所知,精灵并没有被映射到iPad模拟器屏幕的一对一像素。 我尝试使用正交matrix创建的参数,但我无法弄清楚这里的math。 我怎样才能计算数字(底部,顶部,左,右,接近,远)这将是正交投影matrix创建的参数,并在屏幕上显示的原始大小的精灵?

创建实体时的循环依赖

我有以下问题: 我有一个名为Stage的类,它保存了一个实体列表,它遍历每个更新循环,并更新它们。 其中一个实体可能是一个武器(PEW PEW!),当更新产生新的实体时(射弹,KA-ZOOM,KER BANG!)。 如何将这些新实体添加到Stage中实体的列表中? 目前,我把Stage作为一个具有全局访问权限的单例,所以那些反过来派生实体的实体只是调用Stage的addEntity方法的实例,但是这样做感觉很愚蠢。 舞台 – >实体(武器) – >再次登台? 创建敌人时我有类似的问题: 舞台 – >实体(敌波) – >再次登台 我一直在考虑将List传递到可以创建其他实体的所有实体,但是我不得不改变基本实体类的更新方法,以便它获取这个列表,大多数实体不需要。 此外,在向舞台添加实体时,必须让舞台知道该实体的许多graphics组件,以便Stage能够告诉渲染器(具有OpenGL上下文)为这些graphics加载合适的资源组件。 任何想法我应该做什么? 我现在做错了吗? 而且,当我们在这时,为什么Singletons如此皱眉?

我应该如何在Android中实现游戏结束菜单?

通过游戏菜单 ,我的意思是一个菜单显示,当你死,有一个选项再次播放。 我有两个办法: 使用OpenGL 准备好一些button纹理。 当角色死亡时,绘制它们。 听这些纹理的事件。 使用一个视图 (这就是我现在正在做的)当用户打开游戏时,我有一个基本的活动,以及一个FrameLayout的基本视图:根是一个GlSurfaceView并有一个菜单顶部(embeddedLinearLayout )。 当用户点击“播放”时,该菜单将从屏幕转换(使用翻译animation),只留下可以与用户交互的GlSurfaceView 。 游戏结束时,我正在考虑执行类似的事情,但我不确定从哪里开始。 我不特别喜欢第一种方法,因为在OpenGL中实现button事件似乎很难。 我应该如何处理这个?

在3D相机math中,计算给定FOV的Z深度是像素单位

我正在iOS和OpenGL ES 2.0中工作。 通过试验和错误,我已经找出了一个截锥体,在特定的z深度像素绘制与我的源纹理1到1。 所以我的纹理中的1个像素是屏幕上的1个像素。 对于2D游戏这是很好的。 当然,这也意味着我也会考虑像四边形的大小和纹理的大小。 例如,如果我的精灵是一个四32×32像素。 四倍大小是3.2个单位宽和高。 而texcoords是32 /纹理的宽度和高度的大小。 那么这个平截头体是: matrixFrustum(-(float)backingWidth/frustumScale,(float)backingWidth/frustumScale, -(float)backingHeight/frustumScale, (float)backingHeight/frustumScale, 40, 1000, mProjection); 凡视网膜屏幕的截锥尺寸是800。 然后在距相机800的距离处,精灵像素的像素与photoshop相同。 对于3D游戏,有时我仍然希望能够做到这一点。 但是根据现场的情况,我有时需要把视场做成不同的东西。 我正在寻找一种方法来弄清楚什么Z深度将达到一个给定的FOV相同的像素统一。 为此,我的mProjection被设置为: matrixPerspective(cameraFOV, near, far, (float)backingWidth / (float)backingHeight, mProjection); 通过testing,我发现在45.0的FOV处,38.5的Z值非常接近像素单位。 而在30.0的FOV,59.5的Z是正确的。 但是,我怎样才能计算一个现货价值呢? 这是我的matrixPerspecitve代码: void matrixPerspective(float angle, float near, float far, float aspect, mat4 m) { //float size = near * tanf(angle / 360.0 […]

区域周围更亮的像素(OpenGL ES 2)

我试图达到像在图像波纹管中的效果。 基本上我会有一个2D纹理,我想要一个点周围的小区域(我们称之为“光源”)稍微好点亮(即更明亮)。 光源不会从原来的位置移动,也不会像火灾的光线那样“脉动”。 所有其他远的地方都会有一些默认的亮度。 根据我的理解,这可以使用光照贴图来完成,但是我想知道是否有可能在下面纹理的片段着色器中提出一个公式来改变我的像素的亮度,使得它在周围非常明亮特定点并快速淡化为远离像素的默认值。 我尝试了这样的工作: precision mediump float; uniform sampler2D u_Texture; uniform vec3 u_LightPosition; varying vec3 v_Position; varying vec2 v_TexCoordinate; void main() { float dist = length(v_Position – u_LightPosition); gl_FragColor = (1.0 / (c + b * dist + a * dist * dist) + 0.15) * texture2D(u_Texture, v_TexCoordinate); } 其中c , b和a是由我自己进行硬编码和调整的。 然而,我没有find任何c […]

使用OpenGL ES 2.0在3D中绘制火焰字母

我对如何实现这一点感到困惑。 我想要的是“用火焰画”。 我已经成功地实现了这个纹理,但现在我关心的是用粒子来实现火焰效果。 我应该创建一个path,我应该添加许多粒子发射器,将发射火焰粒子? 我理解2D的概念,但对3D来说,粒子总是应该面向用户? 我担心的另外一个问题是,由于拥有这么多的粒子发射器将会发生性能冲击,因为同时可以有许多字母和图画,而且每个元素都有许多粒子发射器。 更新1: 更详细的解释: 我有一个点的path,这是我的模型。 想象一下例如一个虚线的字母“S”。 我想让“S”着火。 “S”只是一个例子,它可以是一个圆形,三角形,一条线,几乎任何我所描述的path点。 为了达到这个效果,我想到了使用粒子。 所以我使用一个名为“粒子devise器”的程序来创建一个消防风格的粒子发射器。 这个发射器在iphone屏幕尺寸上看起来非常完美。 所以我想我可以画一个S或其他任何数字,如果我把许多粒子发射器放在彼此相邻的path之后。 为了从2D版本移动到3D版本,我考虑了缩放发射器(在其模型matrix中使用缩放matrix乘法),然后将其移动到3D世界中的某个点。 我这样做,它的工作原理。 所以现在我在3D世界中有一个粒子发射器。 我的问题是,你是如何实现一个燃烧的信? 如果我期望在我的世界上有许多燃烧的path,这太低效了吗? 我是否应该旋转粒子的四边形,以便它始终看着用户? (最后一个是因为我注意到如果你从侧面看它的粒子开始变平) 更新2: 我testing了这个,有多个粒子发射器,而且他们看起来相当好,我得到的最差的粒子越多。 一个常见的情况是在同一时间至less有大约50个不同的行/字母。 目前粒子发射器在CPU上。 它计算每个粒子的顶点的位置,并将新的顶点提供给GPU。 这对于一些排放者来说效果不错,但是还不足以让所有的字母都“燃烧”。 我正考虑在着色器中将粒子发射器执行的计算移动到GPU,但是这似乎有些复杂,因为每个粒子都有其自己的状态并且被修改为时间增量。 在CPU中,它只是一个以前一个值作为参考来改变它的值的对象,但是GPU渲染器只是每个绘制调用运行一次,不是吗?

Java缓冲区和OpenGL ES 2.0(Android)

我一直在试图想出一个用于asynchronous预加载纹理的很好的解决scheme,但是在使用OpenGL ES的Android中,你不能在上下文之外创建纹理。 合适的解决scheme是加载一个ByteBuffer与我的PNG图像的数据,然后当我回到渲染线程调用glTexImage2D? 我不明白的是OpenGL是否实际上将缓冲区复制到它自己的位置,或直接访问我的。 后一种方法将是理想的。 谁能给我澄清?

cocos2d-x“即时模式”?

我有一些c ++游戏代码,在“即时模式”下的每个游戏循环周期中绘制游戏状态。 我的意思是,游戏代码不会添加任何types的“场景图”或其他数据结构的精灵。 它从每个游戏循环周期的一个空白的石板开始,并从后面堆积在精灵之前。 (我知道你可能想知道这个c ++代码实际上在使用什么 API,它是用Marmalade编写的,我正在离开,Marmalade提供了一个抽象层,这个问题的实质就是replace这个抽象层。 我很难理解“直接模式”在操作中的真正意义,以及它与“固定function”与“可编程”stream水线的关系。 我读过的一些东西说,不要使用旧的即时模式函数,而应该使用基于现代着色器的可编程API。“但同时,我相信在opengl es 2.0中glDrawArrays()可以使用,对吧?这是一个“即时模式”function。 (我相信这里所说的“直接模式”是指不同层次的不同事物,我的理解是像cocosd2-x这样的库是“保留模式”,因为你可以在引擎管理的场景图上添加精灵。但是在opengl级别本身,我认为“即时模式”意味着有点不同,即是否将重要的绘图结构保留在CPU空间中,直到用begin()end()三明治绘制它们,而不是提前上传它们所以它可以感知GPU在通话过程中“保留”你的数据,但是你仍然可以使用glDrawArrays()来一次一个堆积一个精灵,必要。) 在cocos2d-x的“hello world”例子中,我们看到了 // add the sprite as a child to this layer this->addChild(sprite, 0); 这正是我不想做的事情,因为正如我所说的,我的代码库设置时并没有将精灵视为对象,而是像从堆叠在顶部的纹理表(图集)中绘制一堆矩形彼此的。 我不想考虑在一些场景图中join精灵,并且“让引擎照顾它”。 一般来说,这可能是一种很好的思维方式,但是这将涉及到对现有代码的大量重写。 另一方面,我想我喜欢cocos2d-x的想法,因为它给了我一个方便的方法来开发一个代码库,我可以在Windows上开发并运行在iPhone,Android和其他地方。 所以我想了解的是:我可以在一些“即时模式”的时尚使用cocos2d-x? 基本上,在opengles 2.0,我被允许调用glDrawArrays(),正确的? 如果我以合理的方式批量join我的精灵,我可以限制在每一帧中调用glDrawArrays()的次数。 所以我想这样做,而且我自己写这个gl代码是很好的。 但是我认为 ,尽管也许这首先解决了使用cocos2d-x的一些问题,但是使用cocos2s-x vs从头开始编写自己的东西,仍然有很大的可移植性,而不是重新发明轮子的优势。 那么我可以用“即时模式”的方式使用cocos2s-x,并且仍然保留一次写入/运行的好处?