Android OpenGL ES 和 2D
Posted
技术标签:
【中文标题】Android OpenGL ES 和 2D【英文标题】:Android OpenGL ES and 2D 【发布时间】:2011-04-02 23:12:32 【问题描述】:嗯,这是我的要求。我已经不知道 OpenGL,也不愿意学习它,我想直接学习 OpenGL ES,因为我的开发目标是 android。我想学习 OpenGL ES 以开发我的 2D 游戏。我选择它是出于表演目的(因为在 RT 游戏中,基本的 SurfaceView 绘图效率不高)。 我的问题是:从哪里开始? 我花了一个多月的时间浏览 Google 并阅读/尝试了一些我在任何地方找到的教程/示例,但老实说,这并没有太大帮助,原因有两个:
-
几乎所有我遇到的文章/教程都与 3D 相关(我只想学习如何绘制 2D Sprites)
没有任何基础,因为所有文章都针对特定的内容,例如:“如何绘制三角形(带顶点)”、“如何创建网格”......等等。
我也尝试过阅读一些源代码(例如:replica island),但是代码太复杂并且包含很多不必要的东西;结果:我迷失在 100 个带有奇怪类名和东西的 .java 文件中。
我想没有像我正在寻找的课程那样的课程,但如果有人能给我一些指导方针和一些链接也许可以让我了解我在做什么,我会很高兴(仅 OpenGL ES 2D Sprites 渲染!没有 3D)。
【问题讨论】:
and I'm not willing to learn it
这不是在这里开始提问的好方法
请阅读我的整个问题,你拿走了它的一个敏感部分并留下了最重要的完成:“我不知道OpenGL,我也不愿意学习它,我想直接学习 OpenGL ES,因为我的开发目标是 android”如果我只想在嵌入式设备上使用 OpenGL ES,那么学习 OpenGL 有什么意义?干杯
鉴于 OpenGL ES 主要是 OpenGL 的一个子集,我不认为说你不会学习 OpenGL,因为根据定义你必须学习。跨度>
顺便说一句-复制岛几乎是值得一看的地方。您可以从它开始,然后对其进行更改。去掉你不想要或不需要的东西,然后 100 个类变成 99 个,然后是 98 个,然后是 97 个......
【参考方案1】:
我也遇到过类似情况。 我从查看非常基本的 GLSurfaceView 示例/演示开始使用 openGL 的方式。
首先,设置您的应用活动,然后设置基本画布。
查看副本岛源代码文件:GameRenderer.java,了解如何使用适当的 GL 标志设置您的画布以进行 2D(精灵)渲染。 你真的应该看看副本岛的同一作者的SpriteMethodTest:http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest
在我发布自己的代码的地方看到这个问题:Using OpenGL to replace Canvas - Android
设置好画布后,您首先调用以下代码: 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);
这应该可以帮助您在 openGL 画布上绘制 2D 精灵。 我注意到这方面真的没有简单的教程。希望将来我会在我的开发博客中发布一个:http://developingthedream.blogspot.com/
【讨论】:
老兄,非常感谢!我从来没有得到过这样的方向,这正是我要找的!我会关注你的博客,希望你以后能为我们提供一个很棒的教程:),再次非常感谢你 和 OP 一样的情况,和他一样感谢你的回答。祝你的游戏/博客好运。再次感谢 谢谢@Miguel Morales 我厌倦了用 GL 寻找 2D 绘图。正如 CoolStraw 所说,教程太多,里面有很多不必要的东西。这个答案像水晶一样清晰。 @Miguel Morales 经过多次尝试,我无法绘制任何东西,我的纹理显示为黑色。我问了一个问题***.com/questions/9624260/…你可以看看吗?【参考方案2】:2D 编程只是受限于平面的 3D 编程。您别无选择,只能学习 3D,但使用时只需设置 z = 0。
有一本关于 OpenGL ES 的官方书籍。这可能会给你你所追求的介绍: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/
【讨论】:
学究气,你还是用Z,这样你就可以让硬件为你做排序了。最大的变化是(很可能)2D 应用程序将使用正交视图而不是透视视图。 非常感谢您的回答,您的陈述表明我对 Opengl 和 Opengl ES 的定义有误。【参考方案3】:我肯定会检查 Android - Chris Pruett Google IO 讲座 为 Android redux 编写实时游戏
同时获取 PDF
这在很多层面上都非常有帮助,Chris 在为移动设备创建游戏方面拥有非常丰富的经验
但如果您真的专注于 2D,那么请从 Canvas 开始 http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas
另一个取决于技能水平的选择是从 Flash+AdobeAIR 到 Android,我自己喜欢并且喜欢编程水平,随着您进一步开始开发,您会发现原因。
OpenGL: 检查 - Nehe Productions
您可能想在手机上安装一些值得且免费的应用程序是: OpenGL演示, min3d 框架, 红皮书样本
【讨论】:
【参考方案4】:可以看到项目: https://github.com/ChillingVan/android-openGL-canvas/blob/master/README-en.md 这用 OpenGL 实现了画布。它是纯Java。它实现了普通画布可以做的部分。
【讨论】:
【参考方案5】:您可以学习很多在线教程,但对于初学者来说,没有什么可以替代这个:A real Open GL ES 2.0 2D tutorial
【讨论】:
以上是关于Android OpenGL ES 和 2D的主要内容,如果未能解决你的问题,请参考以下文章
Android OpenGL ES和OpenGL一起学------理解Viewport(视口)和坐标系Android OpenGL ES篇(转帖)
iOS OpenGL ES 和 Android OpenGL ES 的区别