Android OpenGL ES และ 2D


96

นี่คือคำขอของฉัน ฉันไม่รู้จัก OpenGL อยู่แล้วและฉันไม่ต้องการเรียนรู้ฉันต้องการเรียนรู้ OpenGL ES โดยตรงเนื่องจากฉันกำหนดเป้าหมายการพัฒนาไปที่ Android ฉันต้องการเรียนรู้ OpenGL ES เพื่อพัฒนาเกม2Dของฉัน ฉันเลือกมันเพื่อการแสดง (เนื่องจากการวาด SurfaceView พื้นฐานนั้นไม่ค่อยมีประสิทธิภาพเมื่อพูดถึงเกม RT) คำถามของฉันคือจะเริ่มที่ไหนดี? ฉันใช้เวลามากกว่าหนึ่งเดือนในการท่อง Google และอ่าน / ลองใช้แบบฝึกหัด / ตัวอย่างที่ฉันพบที่ไหนก็ได้ แต่พูดตามตรงมันไม่ได้ช่วยอะไรมากนักและนี่คือเหตุผลสองประการ:

  1. บทความ / บทช่วยสอนเกือบทั้งหมดที่ฉันเจอเกี่ยวข้องกับ 3D (ฉันต้องการเรียนรู้วิธีวาดภาพ 2D Sprites ของฉันเท่านั้น)
  2. ไม่มีฐานที่จะเริ่มต้นเนื่องจากบทความทั้งหมดกำหนดเป้าหมายไปที่สิ่งต่างๆเช่น "วิธีวาดสามเหลี่ยม (ด้วยจุดยอด)" "วิธีสร้างตาข่าย" ... ฯลฯ

ฉันพยายามอ่านซอร์สโค้ดด้วย (เช่นเกาะจำลอง) แต่รหัสซับซ้อนเกินไปและมีหลายสิ่งที่ไม่จำเป็น ผลลัพธ์: ฉันหลงทางในไฟล์. java 100 ไฟล์พร้อมชื่อคลาสแปลก ๆ

ฉันเดาว่าไม่มีหลักสูตรเหมือนที่ฉันกำลังมองหา แต่ฉันจะดีใจมากถ้ามีใครสามารถให้แนวทางและลิงค์บางอย่างเพื่อเรียนรู้สิ่งที่ฉันกำลังทำอยู่ (เฉพาะ OpenGL ES 2D Sprites เรนเดอร์ไม่มีอะไร 3D ).


33
and I'm not willing to learn itนั่นไม่ใช่วิธีที่ดีในการตั้งคำถามที่นี่
Falmarri

62
โปรดอ่านคำถามทั้งหมดของฉันคุณใช้ส่วนที่ละเอียดอ่อนส่วนหนึ่งและทิ้งความสมบูรณ์ที่สำคัญที่สุดไว้: "ฉันไม่รู้จัก OpenGL แล้วและฉันไม่เต็มใจที่จะเรียนรู้ฉันต้องการเรียนรู้ OpenGL ES โดยตรงเนื่องจากฉัน กำหนดเป้าหมายการพัฒนาของฉันไปที่ Android "อะไรคือประโยชน์ของการเรียนรู้ OpenGL ถ้าฉันจะทำงานเฉพาะกับ OpenGL ES บนอุปกรณ์ฝังตัว Cheers
CoolStraw

5
เนื่องจาก OpenGL ES ส่วนใหญ่เป็นส่วนย่อยของ OpenGL ฉันไม่เห็นประเด็นที่จะบอกว่าคุณจะไม่เรียนรู้ OpenGL เนื่องจากตามคำจำกัดความแล้วคุณจะต้องทำ
รีบเถิดเทิง

2
BTW- เกาะจำลองเป็นสถานที่ที่น่ามองมาก คุณอาจเริ่มต้นด้วยสิ่งนั้นและเริ่มต้นด้วยการเปลี่ยนแปลงมัน ตัดสิ่งที่คุณไม่ต้องการออกไปแล้ว 100 คลาสกลายเป็น 99 แล้ว 98 แล้วก็ 97 ...
แดชเถิดเทิง

คำตอบ:


85

ฉันอยู่ในสถานการณ์ที่คล้ายกัน
วิธีที่ฉันเริ่มต้นด้วย openGL โดยเริ่มจากการดูตัวอย่าง / สาธิต GLSurfaceView ขั้นพื้นฐาน

เริ่มต้นด้วยการตั้งค่ากิจกรรมแอปของคุณและตั้งค่าพื้นที่ทำงานพื้นฐาน

จับรางวัลที่ไฟล์ซอร์สโค้ดเกาะจำลอง: 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);

สิ่งนี้จะช่วยให้คุณไปกับการวาดสไปรต์ 2 มิติบนผืนผ้าใบ openGL ฉันสังเกตเห็นว่าไม่มีบทช่วยสอนที่ตรงไปตรงมาเกี่ยวกับเรื่องนี้ หวังว่าในอนาคตฉันจะโพสต์ไว้ในบล็อกนักพัฒนาของฉัน: http://developingthedream.blogspot.com/


7
เพื่อนขอบคุณมาก! ฉันไม่เคยได้รับคำแนะนำแบบนี้นั่นคือสิ่งที่ฉันกำลังมองหา! และฉันจะคอยติดตามบล็อกของคุณหวังว่าคุณจะให้บทเรียนดีๆแก่เราในอนาคต :) ขอขอบคุณอีกครั้ง
CoolStraw

1
ในสถานการณ์เดียวกันกับ OP และขอบคุณเขาสำหรับคำตอบ ขอให้โชคดีกับเกม / บล็อกของคุณ thx อีกครั้ง
unR

1
ขอบคุณ @Miguel Morales ฉันเบื่อที่จะมองหาการวาด 2D ด้วย GL ดังที่ CoolStraw กล่าวว่ามีบทเรียนมากเกินไปและมีสิ่งที่ไม่จำเป็นมากมายอยู่ในนั้น คำตอบนั้นชัดเจนเหมือนคริสตัล
Evren Ozturk

@Miguel Morales หลังจากลองมาหลายครั้งฉันไม่สามารถวาดอะไรเลยพื้นผิวของฉันจะเป็นสีดำ ฉันถามคำถามstackoverflow.com/questions/9624260/…ลองดูหน่อยได้ไหม
Evren Ozturk

12

การเขียนโปรแกรม 2D เป็นเพียงการเขียนโปรแกรม 3 มิติที่ จำกัด อยู่บนระนาบ คุณจะไม่มีทางเลือกอื่นนอกจากเรียนรู้ 3D แต่เมื่อคุณใช้เพียงแค่ตั้งค่า z = 0

มีหนังสืออย่างเป็นทางการเกี่ยวกับ OpenGL ES นั่นอาจทำให้คุณได้อินโทรที่คุณต้องการ: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/


8
เพื่อความอวดดีคุณยังคงใช้ Z เพื่อให้ฮาร์ดแวร์สามารถจัดเรียงให้คุณได้ การเปลี่ยนแปลงครั้งใหญ่คือ (น่าจะเป็น) แอปพลิเคชั่น 2D จะใช้มุมมองออร์โธกราฟิกแทนมุมมอง
รีบเถิดเทิง

ขอบคุณมากสำหรับคำตอบคำพูดของคุณแสดงให้ฉันเห็นว่าฉันผิดเกี่ยวกับนิยาม 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 สำหรับ Android ตัวฉันเองชอบและระดับการเขียนโปรแกรม luv และเมื่อคุณเริ่มพัฒนาต่อไปคุณจะพบว่าทำไม

OpenGL: ตรวจหา - Nehe Productions

แอพสองตัวที่คุณอาจต้องการติดตั้งบนโทรศัพท์ของคุณที่คุ้มค่าและฟรีคือ: OpenGL Demo, min3d Framework, RedBook Sample



0

ฉันเห็นว่ามีการให้ข้อมูลดีๆมากมายแล้ว ฉันต้องการแชร์ไซต์ที่ช่วยเร่งความเร็วบน OpenGLE อย่างรวดเร็ว! ใช้เวลาเพียงไม่กี่เดือนและมีระบบพิกัดที่กำหนดเองตามระบบพิกัดคาร์ทีเซียน ฉันสามารถเรนเดอร์วัตถุ 3 มิติโดยไม่ใช้กล้องถ่ายรูปโดยใช้เทคนิค Augmented Reality

ฉันเริ่มต้นด้วยประสบการณ์การเขียนโปรแกรมเพียงอย่างเดียวโดยไม่มีประสบการณ์ OpenGL ฉันใช้ไซต์บทช่วยสอนของ Ray Wenderlich ข้อมูลที่ให้ไว้มีความสำคัญและง่ายต่อการเข้าใจ เขาตัดผ่านข้อมูลที่ไม่จำเป็นส่วนใหญ่และให้สิ่งที่คุณจำเป็นต้องรู้เพื่อให้เกิดประสิทธิผลอย่างรวดเร็ว ขอแนะนำบทช่วยสอนนี้เป็นจุดเริ่มต้น: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

แหล่งข้อมูลอื่นที่ฉันแนะนำคือหนังสือของ Erik M Buck ชื่อ Learning OpenGL ES สำหรับ iOS

การเรียนรู้ OpenGL ES สำหรับหน้าปกหนังสือ iOS

บางคนวิพากษ์วิจารณ์ว่ามันง่ายเกินไป แต่นั่นคือสิ่งที่ฉันกำลังมองหา มันช่วยให้ฉันเข้าใจพื้นฐานทั้งหมดและทำให้ฉันมีความคิดว่าฉันควรจะไปที่ไหนต่อเพื่อเรียนรู้ขั้นสูงเพิ่มเติม แต่ไม่น่าแปลกใจเลยที่ฉันสามารถสร้างแอปเติมความเป็นจริงโดยใช้เทคนิคง่ายๆที่ฉันได้เรียนรู้จากเว็บไซต์ของเรย์และหนังสือของ Erik ขอบคุณทั้งคู่สำหรับการแบ่งปัน !!!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.