Android OpenGL ES and 2D

后端 未结 6 1704
感情败类
感情败类 2021-01-29 17:10

Well, here\'s my request. I don\'t know OpenGL already, and I\'m not willing to learn it, I want to learn OpenGL ES directly since I\'m targeting my development to android, howe

6条回答
  •  暖寄归人
    2021-01-29 18:03

    I was in a similar situation.
    The way I started with openGL with start by looking at the very basic GLSurfaceView samples/demos.

    Start, by setting up your app activity, and set up the basic canvas.

    Take a loot at the replica island source code file: GameRenderer.java for how to setup your canvas with the proper GL flags for 2D (sprite) rendering. You should really take a look at SpriteMethodTest by the same author of replica island: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

    See this question where I posted my own code: Using OpenGL to replace Canvas - Android

    After you have your canvas set up, you start by calling something like: gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    After that you're ready to render a sprite. First, you'll need to load the sprite into a texture: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

    However, this is the tutorial that really helped me out with loading sprites: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

    This is how I do it, I have a class named 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;
     }
    }
    

    Then in my onDrawFrame() method I simply do:

    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);
    

    That should get you going with drawing 2D sprites on an openGL canvas. I've noticed that there is really no straightforward tutorial on this. Hopefully in the future I will post one in my dev blog: http://developingthedream.blogspot.com/

提交回复
热议问题