Android OpenGL ES 및 2D 싶다. 2D 게임 을 개발하기 위해

음, 여기 내 요청이 있습니다. 나는 이미 OpenGL을 모른다. 그리고 그것을 배우고 싶지 않다. 그러나 나는 안드로이드 개발을 목표로하고 있기 때문에 OpenGL ES를 직접 배우고 싶다. 2D 게임 을 개발하기 위해 OpenGL ES를 배우고 싶습니다 . 공연 목적으로 선택했습니다 (기본 SurfaceView 드로잉은 RT 게임과 관련하여 그다지 효율적이지 않기 때문입니다). 제 질문은 어디에서 시작할까요? 한 달 이상 Google을 검색하고 어디서나 찾은 튜토리얼 / 예제를 읽고 / 시도했지만 솔직히 말해서 큰 도움이되지 않았고 두 가지 이유가 있습니다.

  1. 내가 본 거의 모든 기사 / 튜토리얼은 3D와 관련이 있습니다 (2D 스프라이트 그리기를 수행하는 방법 만 배우고 싶습니다).
  2. 모든 기사가 “삼각형을 그리는 방법 (정점 포함)”, “메시를 만드는 방법”… 등과 같은 특정 항목을 대상으로하기 때문에 시작할 기초가 없습니다.

일부 소스 코드도 읽으려고했지만 (예 : 복제 섬) 코드가 너무 복잡하고 필요하지 않은 많은 것들이 포함되어 있습니다. 결과 : 이상한 클래스 이름과 물건을 가진 100 개의 .java 파일 사이에서 길을 잃었습니다.

제가 찾고있는 코스와 같은 코스는 없다고 생각합니다.하지만 누군가 제가하고있는 일을 배울 수있는 가이드 라인과 링크를 줄 수 있다면 매우 기쁩니다 (OpenGL ES 2D Sprites 렌더링 만 가능! ).



답변

나는 비슷한 상황에 처해 있었다.
내가 openGL을 시작한 방법은 매우 기본적인 GLSurfaceView 샘플 / 데모를 살펴 보는 것입니다.

먼저 앱 활동을 설정하고 기본 캔버스를 설정합니다.

복제 섬 소스 코드 파일 : GameRenderer.java에서 2D (스프라이트) 렌더링을위한 적절한 GL 플래그로 캔버스를 설정하는 방법을 알아보십시오. 복제 섬의 동일한 작성자가 만든 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/


답변

2D 프로그래밍은 평면에 제한된 3D 프로그래밍입니다. 3D를 배울 수밖에 없지만 사용할 때는 z = 0으로 설정하면됩니다.

OpenGL ES에 대한 공식적인 책이 있습니다. 다음과 같은 인트로를 얻을 수 있습니다.
http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/


답변

나는 확실히 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 to Android, 나 자신이 좋아하고 프로그래밍 수준을 좋아하며 더 개발을 시작하면 그 이유를 알게 될 것입니다.

OpenGL : 확인-Nehe Productions

그만한 가치가 있고 무료로 제공되는 몇 가지 앱은 다음과 같습니다. OpenGL Demo, min3d Framework, RedBook Sample


답변

프로젝트를 볼 수 있습니다 :
https://github.com/ChillingVan/android-openGL-canvas/blob/master/README-en.md
이것은 OpenGL로 캔버스를 구현합니다. 순수한 Java입니다. 일반 캔버스가 할 수있는 부분을 구현합니다.


답변

이미 많은 좋은 정보가 제공된 것 같습니다. OpenGLE를 빠르게 익힐 수있는 사이트를 공유하고 싶었습니다! 몇 달 밖에 걸리지 않았고 데카르트 좌표계를 기반으로하는 사용자 지정 좌표계가있었습니다. 증강 현실 기술을 사용하여 카메라없이 3D 개체를 렌더링 할 수있었습니다.

저는 OpenGL 경험이없는 프로그래밍 경험만으로 시작했습니다. Ray Wenderlich의 튜토리얼 사이트를 사용했습니다. 거기에 제공된 정보는 최고 수준이며 이해하기 쉽습니다. 그는 대부분의 불필요한 정보를 잘라내어 신속하게 생산하기 위해 알아야 할 정보를 제공합니다. 이 튜토리얼을 시작점으로 적극 권장합니다 : http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

제가 추천하고 싶은 다른 리소스는 iOS 용 OpenGL ES 학습이라는 제목의 Erik M Buck의 책입니다.

어떤 사람들은 그것이 너무 단순하다고 비판했습니다. 그러나 그것이 바로 제가 찾던 것입니다. 모든 기본 사항을 이해하는 데 도움이되었고 더 고급 정보를 배우기 위해 다음에 어디로 가야할지에 대한 아이디어를 얻었습니다. 하지만 당연히 Ray의 사이트와 Erik의 책에서 배운 간단한 기술을 사용하여 증강 현실 앱을 구축 할 수있었습니다. 둘 다 공유해 주셔서 감사합니다 !!!


답변

따라 할 수있는 온라인 튜토리얼이 많이 있지만 초보자에게는이 튜토리얼을 대체 할 수있는 것이 없습니다. 실제 Open GL ES 2.0 2D 튜토리얼