Android OpenGL ES 및 2D


96

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

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

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

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


33
and I'm not willing to learn it즉 여기에 질문을 시작하는 아주 좋은 방법이 아니다
Falmarri

62
제 질문 전체를 읽어주세요. 그 중 한 가지 민감한 부분을 선택하고 가장 중요한 완료를 남겼습니다. "이미 OpenGL을 모르고 배우고 싶지 않습니다. 저는 OpenGL ES를 직접 배우고 싶습니다. 내 개발을 Android로 타겟팅 "임베디드 장치에서 OpenGL ES로만 작업하려는 경우 OpenGL을 배우는 이유는 무엇입니까? 건배
CoolStraw

5
OpenGL ES가 대부분 OpenGL의 하위 집합이라는 점을 감안할 때 정의에 따라 OpenGL을 배우지 않을 것이라고 말할 수는 없습니다.
dash-tom-bang

2
BTW- Replica Island는 볼만한 곳입니다. 그것으로 시작하여 변경하는 것부터 시작할 수 있습니다. 원치 않거나 필요하지 않은 것을 제거하면 100 개의 수업이 99, 98, 97이됩니다 ...
dash-tom-bang

답변:


85

나는 비슷한 상황에 처해 있었다.
내가 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/


7
야 정말 고마워! 나는 이런 방향을 본 적이 없다. 정확히 내가 찾던 것이다! 그리고 나는 다시, 대단히 감사합니다 :) 희망 당신은 미래에 좋은 자습서를 제공합니다, 블로그에 눈을하겠습니다
CoolStraw

1
OP와 같은 상황에서 대답 해주셔서 감사합니다. 게임 / 블로그에 행운을 빕니다. thx 다시
unR

1
@Miguel Morales 감사합니다. GL로 2D 드로잉을 찾는 것에 지쳤습니다. CoolStraw가 말했듯이 불필요한 것이 많은 튜토리얼이 너무 많습니다. 그 대답은 수정처럼 분명했습니다.
Evren Ozturk

@Miguel Morales 많은 시도 후에도 아무것도 그릴 수 없습니다. 내 텍스처가 검은 색으로 나타납니다. 질문을했습니다. stackoverflow.com/questions/9624260/… 살펴볼 수 있습니까?
Evren Ozturk

12

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

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


8
현명 해지려면 여전히 Z를 사용하여 하드웨어가 자동으로 정렬하도록 할 수 있습니다. 큰 변화는 (아마도) 2D 응용 프로그램이 원근법 대신 직교 뷰를 사용한다는 것입니다.
dash-tom-bang

귀하의 답변에 감사드립니다. 귀하의 진술은 내가 Opengl 및 Opengl ES 정의에 대해 틀렸다는 것을 보여줍니다.
CoolStraw

3

나는 확실히 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



0

이미 많은 좋은 정보가 제공된 것 같습니다. 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의 책입니다.

iOS 용 OpenGL ES 책 표지 아트 배우기

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.