代码之家  ›  专栏  ›  技术社区  ›  CoolStraw

Android OpenGL ES和2D

  •  93
  • CoolStraw  · 技术社区  · 14 年前

    游戏。我选择它是为了表演(因为基本的SurfaceView绘图在RT游戏中效率不高)。 我的问题是:从哪里开始? 我花了一个多月的时间浏览谷歌,阅读/尝试我在任何地方找到的一些教程/例子,但老实说,这没什么帮助,原因有两个:

    1. 几乎 全部的 我遇到的文章/教程与3D相关(我只想学习如何绘制2D精灵)

    我也试过阅读一些源代码(例如:replica island),但是代码太复杂,包含了很多不必要的东西;结果:我在100个有奇怪类名的.java文件中迷失了方向。

    链接 也许要了解我在做什么(只有OpenGL ES 2D精灵渲染!没有3D)。

    6 回复  |  直到 9 年前
        1
  •  85
  •   Community noseratio    7 年前

    我也遇到过类似的情况。
    我开始使用openGL的方法是先看一些非常基本的GLSurfaceView示例/演示。

    在复制岛源代码文件中获取战利品:游戏渲染器.java了解如何使用正确的GL标志设置画布以进行2D(精灵)渲染。 你真的应该看看复制岛的同一个作者的SpriteMethodTest: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

    Using OpenGL to replace Canvas - Android

    gl.gl清除(GL10.GL\u颜色\u缓冲区\u位);

    之后你就可以渲染精灵了。 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

    我就是这样做的,我有一个叫纹理.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/

        2
  •  12
  •   No one in particular    14 年前

    二维编程就是被限制在平面上的三维编程。你别无选择,只能学习3D,但当你使用它时,只需设置z=0。

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

        3
  •  3
  •   Atom Arcade    14 年前

    我肯定会去查收Android-Chris Pruett的谷歌IO讲座 为Android redux编写实时游戏

    抓取PDF文件

    它在很多方面都非常有用,Chris在为移动设备创建游戏方面有着非常丰富的经验

    http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

    OpenGL:

    您可能希望在手机上安装一些值得一试的免费应用程序: min3d框架, 红皮书样本

        4
  •  1
  •   ChillingVan    7 年前

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

        5
  •  0
  •   MikeyE    9 年前

    我一开始只有编程经验,没有OpenGL经验。我用了雷·温德里奇的教程网站。那里提供的信息一流,易于理解。他删去了大部分多余的信息,并提供了你所需要知道的,以迅速提高工作效率。我强烈推荐本教程作为起点: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

    Learning OpenGL ES for iOS book cover art

        6
  •  0
  •   ucMedia    6 年前

    有很多在线教程,你可以遵循,但对于初学者来说,没有什么可以取代这一个: A real Open GL ES 2.0 2D tutorial