Android OpenGL ES和2D


96

好吧,这是我的要求。我还不太了解OpenGL,也不愿意学习它,但是我想直接学习OpenGL ES,因为我的开发目标是android。我想学习OpenGL ES,以便开发自己的2D游戏。我出于性能考虑选择它(因为基本的SurfaceView绘图在RT游戏中效率不高)。我的问题是:从哪里开始?我花了一个多月浏览Google并阅读/尝试了一些我在任何地方都可以找到的教程/示例,但老实说,它并没有太大帮助,这有两个原因:

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

我也尝试阅读一些源代码(例如:副本岛),但是代码太复杂了,包含了很多不必要的东西。结果:我在100个.java文件中迷路了,它们具有奇怪的类名和内容。

我猜没有像我正在寻找的课程那样的课程,但是如果有人可以给我一些指导和一些链接来学习我的知识,我将非常高兴(只有OpenGL ES 2D Sprites渲染!没有3D渲染) )。


33
and I'm not willing to learn it这不是在这里提出问题的好方法
Falmarri

62
请阅读我的整个问题,其中一部分是您的敏感内容,最重要的部分留了下来:“我已经不了解OpenGL,而且我不愿意学习它,我想直接学习OpenGL ES,因为将我的开发面向Android”如果只在嵌入式设备上使用OpenGL ES,学习OpenGL有什么意义?干杯
CoolStraw 2010年

5
鉴于OpenGL ES主要是OpenGL的子集,我看不出要学习OpenGL的意思,因为根据定义,您将必须学习。
dash-tom-bang 2010年

2
顺便说一句-复制岛是一个不错的地方。您可以从此开始,然后对其进行更改。剔除您不需要或不需要的东西,然后100个班级变成99个,然后是98个班级,然后是97个……
dash-tom-bang 2010年

Answers:


85

我也有类似情况。
我从看待最基本的GLSurfaceView样本/演示开始,就开始使用openGL。

首先,设置您的应用活动,然后设置基本画布。

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

在我张贴自己的代码的地方看到这个问题:使用OpenGL替换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/


7
杜德非常感谢您!我从来没有得到过这样的指示,这正是我想要的!我会继续关注您的博客,希望你能提供给我们的未来一个伟大的教程:),再次非常感谢你
CoolStraw

1
在与OP相同的情况下,也感谢他为您解答。祝您的游戏/博客好运。再次
感谢

1
谢谢@Miguel Morales,我已经厌倦了用GL寻找2D绘图。正如CoolStraw所说,其中有太多教程,其中包含许多不必要的内容。答案像水晶一样清晰。
Evren Ozturk 2012年

@Miguel Morales经过大量尝试,我无法绘制任何东西,我的纹理显示为黑色。我问了一个问题stackoverflow.com/questions/9624260 / ...可以看看吗?
Evren Ozturk 2012年

12

2D编程只是受限于平面的3D编程。除了学习3D之外,您别无选择,但是在使用3D时,只需将z设置为0即可。

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


8
要学究,仍然使用Z,以便让硬件为您进行排序。最大的变化是(可能)2D应用程序将使用正交视图而不是透视视图。
dash-tom-bang 2010年

非常感谢您的回答,您的陈述告诉我,我对Opengl和Opengl ES定义是错误的。
CoolStraw 2010年

3

我一定要结帐Android-Chris Pruett Google IO讲座为Android Redux编写实时游戏

也抓PDF

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

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

另一个取决于技能水平的选择是Android的Flash + Adob​​eAIR,我自己喜欢和喜欢编程水平,随着您进一步开始开发,您会发现原因。

OpenGL:检查-Nehe Productions

您可能想在手机上放一些值得且免费的应用程序是:OpenGL演示,min3d框架,RedBook示例



0

我看到已经提供了很多很好的信息。我想分享一个有助于快速掌握OpenGLE的网站!仅用了几个月,便有了基于笛卡尔坐标系的自定义坐标系。我能够使用增强现实技术在没有相机的情况下渲染3D对象。

我最初只有编程经验,没有OpenGL经验。我使用了Ray Wenderlich的教程站点。此处提供的信息一流,易于理解。他介绍了大多数多余的信息,并提供了快速生产所需的知识。我强烈推荐本教程作为起点:http : //www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

我推荐的另一本资源是Erik M Buck的书,名为《学习iOS的OpenGL ES》。

学习适用于iOS的OpenGL ES书籍封面

有人批评它太简单了。但这正是我想要的。它帮助我理解了所有基础知识,并让我对下一步应该去学习更高级的知识有所了解。但是毫不奇怪,我能够使用从雷(Ray)的网站和埃里克(Erik)的书中学到的简单技术来构建增强现实应用程序。感谢他们俩的分享!!!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.