2010-08-30 45 views
8

Tôi đang cố gắng thay thế hệ thống hiển thị dựa trên Canvas mà tôi đã có với bề mặt nhanh hơn, tuy nhiên, dường như tôi không có trình kết xuất đồ hoạ OpenGL để phù hợp với cách nó hoạt động như trường 2d, chứ không phải là chế độ xem phối cảnh.Sử dụng OpenGL để thay thế Canvas - Android

mã hiện tại của tôi cho các renderer trông như sau:

 @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrthof(0.0f, width, 0.0f, height, 0.0f, 1.0f); 

     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glEnable(GL10.GL_BLEND); 
     gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
     gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 

     gl.glClearColor(0.5f, 0.5f, 0.5f, 1); 
     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glDisable(GL10.GL_DEPTH_TEST); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 

     gl.glDisable(GL10.GL_DITHER); 
     gl.glDisable(GL10.GL_LIGHTING); 

     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
    } 

Làm thế nào tôi thiết lập các renderer để việc chuyển dịch sẽ phù hợp với các điểm ảnh trên màn hình? (do đó dịch 5 sang bên phải sẽ di chuyển 5 pixel)

+0

Tại sao không chỉ sử dụng vượt qua một cá thể GL cho hàm tạo Canvas. http://developer.android.com/reference/android/graphics/Canvas.html –

+0

Điều đó có giữ lại lợi ích tốc độ của OpenGL so với Canvas cơ bản khi vẽ Bản đồ bitmap không? – GuyNoir

+0

Không sử dụng Canvas cho nó. Nó không hoạt động ngay cả khi được ghi lại. Ngoài ra, theo các cuộc đàm phán tại IRC, Nhà phát triển Canvas đã xóa nó khỏi API cho các phiên bản sau này. – Moncader

Trả lời

9

Xin lưu ý rằng trong openGL, Y phối hợp được đảo ngược. Nếu không thì tất cả đều giống nhau.
Đối với cờ đúng, tôi khuyên bạn nên kiểm tra đảo mã nguồn mở Android trò chơi replica: http://code.google.com/p/replicaisland/

Dưới đây là những gì tôi sử dụng trong mã của riêng tôi:

public void onSurfaceChanged(GL10 gl, int width, int height) 
{ 
    mViewWidth = width; 
    mViewHeight = height; 

    gl.glViewport(0, 0, mViewWidth, mViewHeight); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0); 
} 

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{ 
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 

    gl.glViewport(0, 0, mViewWidth, mViewHeight); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 

    GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0); 
} 

đâu mViewWidth & mViewHeight là kích thước của màn hình hiển thị.

+0

Tôi có, tuy nhiên mã rất dày với tối ưu hóa và hệ thống dựa trên gạch, mà nó khá nhiều useless để tìm mã đơn giản tôi cần cho vẽ một vài kết cấu cho màn hình. – GuyNoir

+0

Tôi đã có một vấn đề tương tự và không có vấn đề tìm kiếm một phần mà tác giả của các hòn đảo bản sao thiết lập các vải gl. Nó nằm trong tệp có tên GameRenderer.java. Tôi đã chỉnh sửa phản hồi ban đầu của mình để bao gồm mã thiết lập tôi sử dụng. –

+0

Được rồi, cảm ơn. Mặc dù nó vẫn không hoàn toàn làm việc trong việc chuyển đổi cấu trúc mã tổng thể của tôi. Có cách nào để lưu trữ họa tiết ở kích thước không phải là cơ sở-2 không? Nếu không có nó thực sự không có giá trị rắc rối của việc sử dụng anyways openGL (tôi đang đẩy giới hạn bộ nhớ của Android đã). – GuyNoir

Các vấn đề liên quan