2010-06-10 35 views
5

Tôi biết rằng kết cấu OpenGL trên iphone được yêu cầu là sức mạnh của 2, điều này có đúng với OpenGL 2.0 không? Nếu tôi có một hình ảnh có kích thước 320 x 480 và muốn vẽ toàn màn hình thì có thể thực hiện điều này bằng OpenGL.Kết cấu toàn màn hình iPhone OpenGL ES

Cảm ơn

Trả lời

10

Kết cấu NPOT được hỗ trợ trên phần cứng SGV PowerVR nhưng có giới hạn. Kết cấu NPOT không thể sử dụng mipmaps, phải là 2D (không có bản đồ khối lập phương hoặc họa tiết 3D) và phải sử dụng GL_CLAMP_TO_EDGE cho gói kết cấu ở cả hai chiều; này được hỗ trợ bởi mặc định trong OpenGL ES 2.0 và dưới ES 1.1 bởi phần mở rộng GL_APPLE_texture_2D_limited_npot

Đối ES 1.1, bạn có thể kiểm tra trong thời gian chạy để xem nếu phần mở rộng này hiện diện với mã này:

const char* extensions = (char*) glGetString(GL_EXTENSIONS); 
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0; 

Vì đây chỉ xuất hiện trên SGX chứ không phải MBX, lưu ý rằng dựa vào hỗ trợ kết cấu NPOT sẽ giới hạn bạn với các thiết bị SGX mới hơn. Tất nhiên, dựa vào ES 2.0 sẽ làm tương tự, vì vậy nếu đó là mục tiêu dự định của bạn, hỗ trợ NPOT là điểm moot và bạn có thể tiếp tục với kết cấu NPOT.

Đây là giải pháp thay thế cho phép bạn tiếp tục sử dụng ES 1.1 và duy trì hỗ trợ đầy đủ thiết bị. Đặt kết cấu 320x480 bên trong 512x512, điền khoảng trống với các ô nền, hình chữ nhật hoặc họa tiết khác sẽ được vẽ cùng một lúc (để tránh nhiều cuộc gọi glBindTexture) và sau đó sử dụng một trong các tiện ích mở rộng ES 1.1 yêu thích của tôi, GL_OES_draw_texture, nhanh chóng sao chép phần 320x480 vào chế độ xem:

int rect[4] = {0, 0, 480, 320}; 
glBindTexture(GL_TEXTURE_2D, texBackground); 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect); 
glDrawTexiOES(0, 0, z, 480, 320); 

Sidebar: Bản thân OpenGL ES 2.0 không chỉ định bất kỳ hạn chế nào đối với kết cấu NPOT; trừ khi tôi bị nhầm lẫn, Apple đang áp đặt những hạn chế - tất nhiên, trong thế giới ES 1.1, hỗ trợ NPOT không tồn tại chút nào, do đó, nó là một bổ sung ở đó.

+0

Cảm ơn Chris, thông tin rất tốt. Xin lỗi vì đã là một noob, nhưng tham số z trong glDrawTexiOES() là gì? chiều sâu? Tôi không thể tìm thấy bất kỳ tài liệu nào. Cảm ơn –

+0

@Ben: Rất tiếc, xin lỗi về điều đó. Z là độ sâu của hình chữ nhật - 0 là mặt phẳng gần, 1 là mặt phẳng xa và giá trị thập phân cho bạn biết phần trăm khoảng cách giữa chúng. Trong ví dụ trên, nó cho một cảnh 2D nghiêm chỉnh quản lý chiều sâu của riêng nó với thuật toán "họa sĩ" để z = 0; đối với hầu hết việc sử dụng nguồn gốc, bạn sẽ muốn z = 1 trừ khi bạn đã đảo ngược phạm vi chiều sâu của mình. Trang thông số OpenGL đưa ra một chút tốt hơn: (http://www.khronos.org/registry/gles/extensions/OES/OES_draw_texture.txt - khoảng một nửa xuống dưới trang) Rõ ràng là bùn? :) –

1

Giả sử bạn không có quá nhiều kết cấu toàn màn hình, bạn chỉ có thể sử dụng một kết cấu 512x512 và chỉ sử dụng 320x480 của nó. Nó chắc chắn sẽ hoạt động.

1

Tôi đoán điều đó phụ thuộc vào phần cứng. Tôi đã sử dụng để tạo ra sức mạnh gần nhất của 2 kết cấu tức là nếu kết cấu của tôi là 320x480 thì tôi sẽ tạo ra một kết cấu 512x512 sẽ có dữ liệu kết cấu gốc. điều này đảm bảo tính di động nhưng tiêu thụ nhiều bộ nhớ hơn;)

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