2010-02-03 21 views
5

Tôi đang thực hiện một thử nghiệm nhỏ với OpenGL ES trên Nexus One. Có vấn đề về độ phân giải toàn màn hình. Có vẻ như tôi không bao giờ có được độ phân giải đầy đủ thực sự của Nexus One, là 480 * 800. Tôi đang sử dụng một chiếu trực giao và chỉ muốn vẽ một hình tam giác đơn giản với mô hình sắc xem ma trận:Không bao giờ có đầy đủ 480 * 800 khi sử dụng phép chiếu trực giao 2D trong opengl-es

@Override 
public void sizeChanged(GL10 gl, int width, int height) { 
     /* 
     * Set our projection matrix. This doesn't have to be done 
     * each time we draw, but usually a new projection needs to 
     * be set when the viewport is resized. 
     */   
     gl.glViewport(0, 0, width, height); 

     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity();   
     GLU.gluOrtho2D(gl, 0, width, 0, height);       
} 

Các tọa độ cho tam giác là:

float[] coords = { 
      // X, Y, Z 
      0.0f, 0.0f, 0, 
      200.0f, 200.0f, 0, 
      100.0f, 0.0f, 0, 
    }; 

Và tôi nhận được kết quả dưới đây:

alt text http://www.anddev.org/files/device_184.png

Kết quả này tương tự trên trình mô phỏng (480 * 800 res) và Nexus 1. Rõ ràng là tôi không có độ phân giải đầy đủ (vì đỉnh trên của hình tam giác đã gần với cạnh phải, nếu chiều rộng là 480 thực, điều này nên ở bên trái của nửa chiều rộng). Một sự khác lạ là ở sizeChanged (Tôi đang sử dụng GLSurfaceView, đây là phương thức ghi đè trong trình kết xuất theo yêu cầu của GLSurfaceView), tôi luôn nhận được width = 480 và height = 800 cho dù tôi có bắt đầu ứng dụng ở chế độ toàn màn hình hay không. Tôi đã mong đợi rằng với thanh tiêu đề ứng dụng và thanh trạng thái, kích thước được chuyển đến sizeChanged phải nhỏ hơn phải không? Ý tôi là nếu kích thước được chuyển đến phương pháp này không phải là kích thước thực tôi nhận được, thì làm cách nào tôi có thể thiết lập chế độ xem chính xác?

Tôi cũng đã thực hiện nhanh chóng bằng cách sử dụng GLUT trên Windows với cùng một thiết lập và vẽ hình tam giác giống hệt nhau. Tôi nhận được kết quả dưới đây, đó là kết quả mong đợi. Bất cứ ai cũng có thể giúp tôi tìm ra cách để có được kết quả tương tự trên điện thoại?

alt text http://www.anddev.org/files/glut_on_win_137.png

Tôi đã đặt

<supports-screens 
android:largeScreens="true" 
android:normalScreens="true" 
android:smallScreens="true" 
android:anyDensity="true"/> 

thẻ trong AndroidManifest.xml. Đặc biệt, tôi thấy rằng nó có vẻ như chỉ android: anyDensity = "true" | "false" vấn đề, vì điều này không thay đổi kết quả trả về. Những người khác không thay đổi kết quả. Ngoài ra dự án của tôi là trên SDK 1.6, được đề xuất cho việc phát triển các ứng dụng hỗ trợ màn hình điện thoại lớn hơn.

Các câu hỏi ban đầu cũng được yêu cầu ở đây: http://www.anddev.org/viewtopic.php?p=34832#34832

Trả lời

0

tôi biết có một chủ đề OpenGL bao gồm sự khác biệt giữa 16., 2.0 vv với các chi tiết tạo những trò chơi dev vv bạn sẽ phải Google nó trên chính trang google như việc tìm kiếm danh sách dev google hút

tôi cũng sẽ kiểm tra db lỗi như tất cả mọi người mà thấy lỗi OpenGL tedns đặt aorudns làm việc trong các báo cáo lỗi Trưởng Lão Ni Kệ trong đó có tôi

những nơi khác để kiểm tra lỗi db của dự án alien3d tại googlecode công cụ trò chơi android 3d của nó có thể họ chạy vào nó?

1

Khi chạy với SDK phiên bản 3, ứng dụng của bạn sẽ chạy trong "chế độ tương thích"

Nó sẽ sử dụng tiêu chuẩn 320x480 | 480x320 res

Dưới đây là làm thế nào tôi nhận được một số thông tin hiển thị:

// we get some display information 
    display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    scrPixelFormat = display.getPixelFormat(); 
    scrWidth = display.getWidth(); 
    scrHeight = display.getHeight(); 
    scrRefreshRate = display.getRefreshRate(); 

Để làm cho ứng dụng của tôi sử dụng điện thoại đầy đủ res bản xứ, tôi đã không tìm thấy bất cứ điều gì vì vậy đã phải chuyển sang sử dụng sdk phiên bản 6.

1

Một điều cần kiểm tra là đảm bảo rằng thuộc tính android: minSdkVersion của phần tử uses-sdk trong tệp kê khai của bạn là 4 hoặc cao hơn. Việc có thuộc tính android: targetSdkVersion trên phần tử đó với 4 hoặc cao hơn cũng sẽ hoạt động.

Câu hỏi của bạn nói rằng dự án của bạn là Android 1.6, là cấp API 4. Có thể có mục tiêu xây dựng là Android 1.6, tuy nhiên, nhưng vẫn có mức API cũ được chỉ định trong phần tử uses-sdk. Điều này thường xảy ra khi ai đó bắt đầu với dự án Android 1.5 và thay đổi mục tiêu xây dựng. Eclipse không cập nhật tệp kê khai khi thay đổi mục tiêu xây dựng.

4

Cảm ơn tất cả câu trả lời của bạn, họ đã giúp tôi rất nhiều. Tôi thấy mình cực kỳ lúng túng khi nói với bạn nguyên nhân thực sự của vấn đề này, mà tôi đã giải quyết ngay bây giờ. Lớp tam giác mà tôi đã sao chép từ một trong các mẫu thực sự mở rộng trên các tọa độ mà bạn xác định trong mảng vị trí theo hệ số là hai! Tôi vừa sửa đổi các tọa độ trong mảng và tôi không nhận thấy khi chúng được nạp vào bộ đệm đỉnh, chúng được thu nhỏ!

Tôi phạm tội ... Nhưng chúng ta hãy cẩn thận với nội dung được sao chép khi bạn tin tưởng điều gì đó theo cách bạn mong đợi, nhưng không phải, đây là lớp tam giác tôi đã sao chép mã từ http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/OpenGLES/Triangle/src/com/google/android/opengles/triangle/TriangleRenderer.java và lưu ý rằng trên dòng số 215, các vị trí được thu nhỏ bằng 2! Thực sự ác như một mẫu ...

Ngoài ra, khi sử dụng GLSurfaceView, hãy sử dụng android.opengl.GLSurfaceView thay vì GLSurfaceView.java trong thư mục mẫu của bạn sdk_root \ platforms \ android-1.1 \ samples \ ApiDemos \ src \ com \ example \ android \ apis \ graphics. Vì cái thứ hai là phiên bản đầu và có một số hành vi lạ.

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