Android OpenGL ES和2D

那么,这是我的要求。 我不知道OpenGL了,而且我不愿意学习它,但是我想直接学习OpenGL ES,因为我将自己的开发目标locking在了Android上。 我想学习OpenGL ES以开发我的2D游戏。 我select它作为表演的目的(因为基本的SurfaceView绘图在RT游戏方面效率不高)。 我的问题是:从哪里开始? 我已经花了一个多月的时间浏览Google,阅读/尝试一些我在其他地方find的教程/示例,但是说实话,这并没有多大帮助,这有两个原因:

  1. 几乎所有我遇到的文章/教程都是3D相关的(我只想学习如何做2D Sprites绘图)
  2. 因为所有文章的目标都是“如何画一个三angular形(顶点)”,“如何创build一个网格”等等,所以没有什么基础。

我也尝试过读取一些源代码(例如:副本岛),但代码太复杂,包含了很多不必要的东西; 结果:我迷失在100个.java文件中,并带有奇怪的类名和东西。

我想有没有像我正在寻找的路线,但我会很高兴,如果有人可以给我一些指导方针和一些链接,也许学习我所了解的(只有OpenGL ES 2D Sprites渲染!没有3D )。

我处于类似的情况。
我从开始使用openGL的方式开始,通过查看非常基本的GLSurfaceView示例/演示。

开始,通过设置您的应用程序活动,并设置基本canvas。

在副本岛源代码文件GameRenderer.java中获得一个掠夺,了解如何使用适当的GL标志设置2D(精灵)渲染的canvas。 你应该看看SpriteMethodTest由同一个副本岛的作者: http : //code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

看到这个问题,我发布我自己的代码: 使用OpenGL来取代canvas – Android

设置完canvas之后,您可以先调用如下所示的内容:gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

之后,你准备好渲染一个精灵。 首先,您需要将精灵加载到纹理中: http : //qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

然而,这是真正帮助我加载精灵的教程: http : //tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

我是这样做的,我有一个名为Texture.java的类:

 public class Texture { /*Begin public declarations*/ public float x = 0; public float y = 0; public float z = 0; public float width = 0; public float height = 0; /*Begin Private Declarations*/ private GL10 gl; public int[] texture; //holds the texture in integer form private int texture_name; private int[] mCropWorkspace; private final BitmapFactory.Options sBitmapOptions; /*Begin Methods*/ public Texture( GL10 gl_obj ) { gl = gl_obj; texture = new int[1]; mCropWorkspace = new int[4]; sBitmapOptions = new BitmapFactory.Options(); sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565; //Log.d(TAG, "Initializing Texture Object"); } public int get_texture_name( ) { return texture_name; } /*Loads the resource to memory*/ public boolean Load( Bitmap bitmap ) //rename this to glLoad and don't have it as an initializer parameter { /*many thanks to sprite method test if this works*/ if ( gl == null ) { Log.e(TAG, "Failed to load resource. Context/GL is NULL"); return false; } int error; int textureName = -1; gl.glGenTextures(1, texture, 0); textureName = texture[0]; //Log.d(TAG, "Generated texture: " + textureName); gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); mCropWorkspace[0] = 0; mCropWorkspace[1] = bitmap.getHeight(); mCropWorkspace[2] = bitmap.getWidth(); mCropWorkspace[3] = -bitmap.getHeight(); ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0); error = gl.glGetError(); if (error != GL10.GL_NO_ERROR) { Log.e(TAG, "GL Texture Load Error: " + error); } //Log.d(TAG, "Loaded texture: " + textureName); return true; } } 

然后在我的onDrawFrame()方法中,我只需要:

 Texture texture = ... gl.glBindTexture(GL10.GL_TEXTURE_2D, texture.texture[0]); ((GL11Ext) gl).glDrawTexfOES((float)(draw_x + 0.5), (float)(draw_y + 0.5), 0, tile_width, tile_height); 

这应该让你在一个openGLcanvas上绘制2D精灵。 我注意到,这里没有简单的教程。 希望将来我会在我的开发博客中发布一个: http : //developingthedream.blogspot.com/

二维编程只是三维编程,而不是一个平面。 你别无select,只能学习3D,但是当你使用它时,只需设置z = 0。

有一本关于OpenGL ES的官方书籍。 这可能会给你后面的介绍: http : //www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

我肯定会检查Android – 克里斯Pruett谷歌IO讲座编写实时游戏为Android的REDX

抓住PDF也

Chris在很多层面上都非常有帮助,Chris在为移动设备开发游戏方面有非常出色的经验

但如果你真的专注于2D,那么从Canvas开始http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

另一个select取决于技术水平是Flash + Adob​​eAIR到Android,我自己喜欢和luv编程水平,当你进一步开始发展,你会发现为什么。

OpenGL:检查 – Nehe Productions

几个应用程序,你可能想放在你的手机是值得的,他们是免费的是:OpenGL演示,min3d框架,红宝书样品

我看到很多好的信息已经提供了。 我想分享一个网站,帮助快速加快OpenGLE的速度! 它只花了几个月的时间,并有一个基于笛卡尔坐标系统的自定义坐标系统。 我能够使用增强现实技术渲染3D对象没有相机。

我从编程经验开始,没有OpenGL经验。 我使用了Ray Wenderlich的教程网站。 所提供的信息是一stream的,易于理解。 他切入了大部分多余的信息,并提供您需要知道的快速生产。 我高度推荐本教程作为出发点: http : //www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

我推荐的其他资源是Erik M Buck的一本书,名为“学习OpenGL ES for iOS”。

学习OpenGL ES for iOS书籍封面

有人批评说这太简单了。 但那正是我所期待的。 它帮助我理解了所有的基础知识,并让我知道我应该去哪里学习更先进的东西。 但毫不奇怪的是,我能够使用我从Ray的网站和Erik的书中学到的简单技术来构build我的增强现实应用程序。 感谢他们共享!

你可以看到这个项目: https : //github.com/ChillingVan/android-openGL-canvas/blob/master/README-en.md这实现了与OpenGL的canvas。 这是纯粹的Java。 它实现了普通canvas可以做的部分。