Android OpenGL ES và 2D


95

Đây là yêu cầu của tôi. Tôi chưa biết OpenGL và tôi không sẵn sàng học nó, tuy nhiên, tôi muốn học OpenGL ES trực tiếp vì tôi đang nhắm mục tiêu phát triển của mình sang android. Tôi muốn học OpenGL ES để phát triển các trò chơi 2D của mình . Tôi đã chọn nó cho mục đích biểu diễn (vì bản vẽ SurfaceView cơ bản không hiệu quả khi nói đến trò chơi RT). Câu hỏi của tôi là: bắt đầu từ đâu? Tôi đã dành hơn một tháng duyệt Google và đọc / thử một số hướng dẫn / ví dụ mà tôi đã tìm thấy ở bất cứ đâu nhưng thành thật mà nói, nó không giúp được gì nhiều và điều này là vì hai lý do:

  1. Hầu hết tất cả các bài viết / hướng dẫn tôi đã xem đều có liên quan đến 3D (tôi chỉ muốn học cách vẽ Sprites 2D của mình)
  2. Không có cơ sở nào để bắt đầu vì tất cả các bài báo đều nhắm đến một số thứ cụ thể như: "Cách vẽ một hình tam giác (với các đỉnh)", "Cách tạo một Lưới" ... v.v.

Tôi cũng đã cố đọc một số mã nguồn (ví dụ: đảo bản sao) nhưng các mã này quá phức tạp và chứa nhiều thứ không cần thiết; kết quả: Tôi bị lạc giữa 100 tệp .java có tên và nội dung lớp lạ.

Tôi đoán không có khóa học nào giống khóa học mà tôi đang tìm kiếm, nhưng tôi sẽ rất vui nếu ai đó có thể cung cấp cho tôi một số hướng dẫn và một số liên kết có thể để tìm hiểu những gì tôi đang làm (chỉ hiển thị OpenGL ES 2D Sprites! Không có gì 3D ).


33
and I'm not willing to learn itĐó không phải là một cách rất tốt để bắt đầu một câu hỏi ở đây
Falmarri

62
Vui lòng đọc toàn bộ câu hỏi của tôi, bạn đã lấy một phần nhạy cảm của nó và để lại phần hoàn thành quan trọng nhất: "Tôi chưa biết OpenGL và tôi không sẵn sàng học nó, tôi muốn học OpenGL ES trực tiếp vì tôi nhắm mục tiêu phát triển của tôi tới android "Học OpenGL có ích gì nếu tôi chỉ làm việc với OpenGL ES trên các thiết bị nhúng? Cheers
CoolStraw

5
Cho rằng OpenGL ES chủ yếu là một tập con của OpenGL, tôi không thấy lý do gì khi nói rằng bạn sẽ không học OpenGL, vì theo định nghĩa thì bạn sẽ phải học.
dash-tom-bang

2
BTW- Đảo Replica là nơi có khá nhiều nơi để tìm. Bạn có thể bắt đầu với điều đó và bắt đầu bằng cách thay đổi nó. Dải điều ra rằng bạn không muốn hoặc nhu cầu, và sau đó 100 lớp học trở thành 99 rồi 98 rồi 97 ...
dash-tom-bang

Câu trả lời:


85

Tôi đã ở trong tình trạng tương tự.
Cách tôi bắt đầu với openGL bắt đầu bằng cách xem các mẫu / demo GLSurfaceView rất cơ bản.

Bắt đầu, bằng cách thiết lập hoạt động ứng dụng của bạn và thiết lập canvas cơ bản.

Tham gia chiến lợi phẩm tại tệp mã nguồn đảo sao: GameRenderer.java để biết cách thiết lập canvas của bạn với các cờ GL thích hợp cho kết xuất 2D (sprite). Bạn thực sự nên xem qua SpriteMethodTest của cùng một tác giả của đảo sao: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

Xem câu hỏi này nơi tôi đã đăng mã của riêng mình: Sử dụng OpenGL để thay thế Canvas - Android

Sau khi thiết lập canvas, bạn bắt đầu bằng cách gọi một cái gì đó như: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

Sau đó, bạn đã sẵn sàng để kết xuất một sprite. Trước tiên, bạn sẽ cần tải sprite vào một kết cấu: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Tuy nhiên, đây là hướng dẫn thực sự giúp tôi tải sprites: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

Đây là cách tôi thực hiện, tôi có một lớp tên là 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;
 }
}

Sau đó, trong phương thức onDrawFrame () của tôi, tôi chỉ cần thực hiện:

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

Điều đó sẽ giúp bạn vẽ các sprite 2D trên canvas openGL. Tôi nhận thấy rằng thực sự không có hướng dẫn đơn giản về điều này. Hy vọng rằng trong tương lai tôi sẽ đăng một bài lên blog nhà phát triển của mình: http://developingthedream.blogspot.com/


7
Dude cảm ơn bạn rất nhiều! Tôi chưa bao giờ nhận được chỉ đường như thế này, đó chính xác là những gì tôi đang tìm kiếm! Và tôi sẽ theo dõi blog của bạn, hy vọng bạn sẽ cung cấp cho chúng tôi những hướng dẫn tuyệt vời trong tương lai :), Một lần nữa, cảm ơn bạn rất nhiều
CoolStraw 10/09/10

1
Cùng hoàn cảnh với OP và rất cảm ơn anh ấy vì bạn đã trả lời. Chúc may mắn với Game / Blog của bạn. thx một lần nữa
unR

1
Cảm ơn @Miguel Morales Tôi đã chán tìm bản vẽ 2D với GL. Như CoolStraw đã nói có quá nhiều hướng dẫn với rất nhiều thứ không cần thiết trong đó. Câu trả lời đó rõ ràng như pha lê.
Evren Ozturk

@Miguel Morales Sau rất nhiều lần thử, tôi không thể vẽ được gì vì các kết cấu của tôi hiển thị màu đen. Tôi đã hỏi một câu hỏi stackoverflow.com/questions/9624260/…, bạn có thể xem được không?
Evren Ozturk

12

Lập trình 2D chỉ là lập trình 3D bị giới hạn trong một mặt phẳng. Bạn sẽ không có lựa chọn nào khác ngoài việc học 3D, nhưng khi sử dụng nó chỉ cần đặt z = 0.

Có một cuốn sách chính thức về OpenGL ES. Điều đó có thể cung cấp cho bạn phần giới thiệu mà bạn đang theo dõi: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/


8
Để trở nên phổ biến, bạn vẫn sử dụng Z để có thể để phần cứng phân loại cho bạn. Thay đổi lớn là (có thể) ứng dụng 2D sẽ sử dụng chế độ xem trực quan thay vì chế độ xem phối cảnh.
dash-tom-bang,

Cảm ơn bạn rất nhiều về câu trả lời của bạn, tuyên bố của bạn cho tôi thấy rằng tôi đã sai về định nghĩa Opengl và Opengl ES.
CoolStraw

3

Tôi chắc chắn sẽ kiểm tra Android - Chris Pruett Bài giảng IO của Google Viết trò chơi thời gian thực cho Android redux

lấy PDF cũng

nó thực sự hữu ích ở nhiều cấp độ, Chris có trải nghiệm thực sự tuyệt vời với việc tạo trò chơi cho thiết bị di động

nhưng nếu bạn thực sự tập trung vào 2D thì hãy bắt đầu với Canvas http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

Một lựa chọn khác phụ thuộc vào trình độ kỹ năng là Flash + AdobeAIR cho Android, bản thân tôi thích và cấp độ lập trình luv và khi bạn bắt đầu phát triển hơn nữa, bạn sẽ tìm ra lý do.

OpenGL: Kiểm tra - Nehe Productions

Một số ứng dụng bạn có thể muốn cài đặt trên điện thoại của mình đáng giá và chúng miễn phí là: OpenGL Demo, min3d Framework, RedBook Sample



0

Tôi thấy rất nhiều thông tin tốt đã được cung cấp. Tôi muốn chia sẻ một trang web giúp tăng tốc độ trên OpenGLE nhanh chóng! Chỉ mất vài tháng và đã có một hệ tọa độ tùy chỉnh dựa trên hệ tọa độ Descartes. Tôi có thể kết xuất vật thể 3D mà không cần máy ảnh bằng kỹ thuật Thực tế tăng cường.

Tôi bắt đầu chỉ với kinh nghiệm lập trình, không có kinh nghiệm OpenGL. Tôi đã sử dụng trang web hướng dẫn của Ray Wenderlich. Thông tin được cung cấp ở đó là đỉnh cao và dễ hiểu. Anh ấy cắt bỏ hầu hết thông tin thừa và cung cấp những gì bạn cần biết để làm việc hiệu quả nhanh chóng. Tôi thực sự khuyên bạn nên sử dụng hướng dẫn này như là điểm khởi đầu: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

Tài nguyên khác mà tôi muốn giới thiệu là một cuốn sách của Erik M Buck, có tiêu đề Học OpenGL ES cho iOS.

Học OpenGL ES cho iOS bìa sách

Một số người chỉ trích nó nói rằng nó quá đơn giản. Nhưng đó chính xác là những gì tôi đang tìm kiếm. Nó đã giúp tôi hiểu tất cả những điều cơ bản và cho tôi ý tưởng về nơi tôi nên đến tiếp theo để học những thứ nâng cao hơn. Nhưng không có gì ngạc nhiên khi tôi đã có thể xây dựng ứng dụng thực tế tăng cường của mình bằng cách sử dụng các kỹ thuật đơn giản mà tôi đã học được từ trang web của Ray và cuốn sách của Erik. Cảm ơn cả hai đã chia sẻ !!!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.