Android OpenGL ES 和 2D

问题描述 投票:0回答:5

但是,我想直接学习 OpenGL ES,因为我的开发目标是 android。我想学习 OpenGL ES 来开发我的 2D 游戏。我选择它是出于性能目的(因为基本的 SurfaceView 绘图在 RT 游戏中效率不高)。 我的问题是:从哪里开始? 我花了一个多月的时间浏览谷歌并阅读/尝试一些我在任何地方找到的教程/示例,但说实话,这并没有多大帮助,这是有两个原因:

  1. 几乎所有我遇到的文章/教程都与 3D 相关(我只想学习如何进行 2D Sprites 绘图)
  2. 没有基础,因为所有文章都针对特定的事情,例如:“如何绘制三角形(带顶点)”,“如何创建网格”...等。

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

我想没有像我正在寻找的课程那样的课程,但如果有人能给我一些指导方针和一些链接,我会非常高兴,也许可以了解我在做什么(仅限 OpenGL ES 2D Sprites 渲染) !没有 3D)。

android opengl-es 2d
5个回答
85
投票

我也遇到过类似的情况。
我从查看非常基本的 GLSurfaceView 示例/演示开始使用 openGL。

首先,设置您的应用程序活动,并设置基本画布。

查看复制岛源代码文件:GameRenderer.java,了解如何使用正确的 GL 标志设置画布以进行 2D(精灵)渲染。 你真的应该看看副本岛同一作者的 SpriteMethodTest:http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

请参阅我发布自己的代码的这个问题:Using OpenGL to replacement 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/


12
投票

2D 编程只是受限于平面的 3D 编程。你别无选择,只能学习 3D,但当你使用它时,只需设置 z = 0。

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


3
投票

我肯定会查看 Android - Chris Pruett Google IO 讲座 为 Android redux 编写实时游戏

也获取 PDF

这在很多层面上都非常有帮助,克里斯在为移动设备创建游戏方面拥有非常丰富的经验

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

另一个取决于技能水平的选择是 Flash+AdobeAIR 到 Android,我自己喜欢并且喜欢编程水平,当你进一步开始开发时,你会发现原因。

OpenGL: 检查 - Nehe Productions

您可能想在手机上安装一些值得安装且免费的应用程序,它们是: OpenGL 演示, min3d 框架, 红皮书样本


1
投票

您可以查看项目: https://github.com/ChillingVan/android-openGL-canvas/blob/master/README-en.md 这使用 OpenGL 实现了画布。它是纯Java的。它实现了普通画布的部分功能。


0
投票

有很多在线教程可供您参考,但对于初学者来说,没有什么可以替代这个:真正的 Open GL ES 2.0 2D 教程

© www.soinside.com 2019 - 2024. All rights reserved.