2009-07-24 9 views
40

Tôi đang làm việc trên một khuôn khổ chơi trò chơi và là người mới tham gia OpenGL. Hầu hết các sách dường như không đưa ra câu trả lời rõ ràng cho câu hỏi này và tôi muốn phát triển trên máy tính để bàn của mình bằng cách sử dụng OpenGL, nhưng thực thi mã trong môi trường OpenGL ES 2.0. Câu hỏi của tôi là gấp đôi sau đó:OpenGL vs OpenGL ES 2.0 - Ứng dụng OpenGL có thể được chuyển dễ dàng không?

  1. Nếu tôi nhắm mục tiêu khuôn khổ cho OpenGL trên máy tính để bàn, nó sẽ chạy mà không sửa đổi trong môi trường OpenGL ES 2.0?
  2. Nếu không, thì có một trình mô phỏng tốt ở ngoài đó, PC hoặc Mac; là có một kịch bản mà tôi có thể chạy mà sẽ chuyển đổi mã OpenGL của tôi vào mã OpenGL ES, hoặc cờ những điều đó sẽ không hoạt động?

Trả lời

38

Nó được khoảng ba năm kể từ khi tôi đã làm bất kỳ công việc ES cuối cùng, vì vậy tôi có thể đã lỗi thời hay đơn giản là ghi nhớ một số nội dung không chính xác.

  1. Không, nhắm mục tiêu OpenGL cho máy tính để bàn không bằng nhắm mục tiêu OpenGL ES, vì ES là tập hợp con. ES không thực hiện các chức năng chế độ ngay lập tức (glBegin()/glEnd(), glVertex*(), ...) Các mảng Vertex là cách chính để gửi nội dung vào đường ống.

    Ngoài ra, tùy thuộc vào cấu hình bạn đang nhắm mục tiêu: ít nhất là trong tiểu sử Lite, ES không cần triển khai các hàm dấu phẩy động. Thay vào đó bạn nhận được các hàm điểm cố định; suy nghĩ số nguyên 32 bit trong đó 16 bit đầu tiên có nghĩa là chữ số trước dấu thập phân và 16 bit sau có nghĩa là chữ số sau dấu thập phân.

    Nói cách khác, ngay cả mã đơn giản thể được unportable nếu nó sử dụng phao nổi (bạn phải thay thế các cuộc gọi đến gl*f() chức năng với các cuộc gọi đến gl*x() chức năng.

    Xem cách bạn có thể giải quyết vấn đề này trong Trolltech's example (đặc biệt là các tập tin qtwidget.cpp; nó là một ví dụ Qt, nhưng vẫn ...) Bạn sẽ thấy họ thực hiện cuộc gọi này:

    q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));

    này có nghĩa là để thay thế cuộc gọi đến glClearColo. rf(). Ngoài ra, họ sử dụng macro f2vt() - có nghĩa là float sang loại đỉnh - tự động chuyển đổi đối số từ phao sang loại dữ liệu chính xác.

  2. Trong khi tôi đang phát triển một số bản trình diễn nhỏ cách đây ba năm cho một công ty, tôi đã thành công khi làm việc với PowerVR's SDK. Nó dành cho Visual C++ trong Windows; Tôi đã không thử nó dưới Linux (không cần vì tôi đã làm việc trên PC của công ty).


Một bản cập nhật nhỏ để phản ánh những kinh nghiệm gần đây của tôi với ES. (07 tháng sáu năm 2011)

  • Hôm nay của các nền tảng có thể không sử dụng hồ sơ cá nhân Lite, vì vậy bạn có lẽ không cần phải lo lắng về việc cố định điểm thập phân
  • Khi porting mã máy tính để bàn của bạn cho điện thoại di động (ví dụ như iOS) , khá có thể là bạn sẽ phải làm chủ yếu này, và không có nhiều khác:
    • thay glBegin()/glEnd() với mảng đỉnh
    • thay thế một số cuộc gọi đến các chức năng như glClearColor() với các cuộc gọi như glClearColorf()
    • 012.
    • ghi lại hệ thống cửa sổ và hệ thống nhập của bạn
    • nếu nhắm mục tiêu OpenGL ES 2.0 để có chức năng đổ bóng, bây giờ bạn sẽ để thay thế hoàn toàn hành vi được tích hợp sẵn với các trình đổ bóng - ít nhất là cơ bản thực hiện lại cố định- function pipeline
  • Thực sự quan trọng: trừ khi hệ thống di động của bạn không bị hạn chế về bộ nhớ, bạn thực sự muốn xem xét sử dụng nén kết cấu cho chip đồ họa của mình; ví dụ: trên thiết bị iOS, bạn sẽ tải lên dữ liệu được nén PVRTC vào chip
+0

2/http: //www.imgtec.com/PowerVR/insider/sdkdownloads/ lưu trữ cho nền tảng Linux? Tôi chắc chắn chúng ta có thể mô phỏng glBegin trên đầu trang của thực hiện GLES – RzR

+0

@ rzr: Thi đua glBegin() chắc chắn có thể, nhưng có thể là một ý tưởng tồi. Thay vào đó, bạn có thể muốn cấu trúc lại mã. Trên trang web đó, bạn sẽ muốn tải xuống bản lưu trữ "Mô phỏng PC" cho OpenGL ES 1.1 hoặc OpenGL ES 2.0. –

+0

mục tiêu là đảm bảo khả năng tương thích nguồn đầu tiên, không quan tâm đến hiệu suất, chỉ muốn xây dựng các ứng dụng cũ ... - http://rzr.online.fr/q/opengl – RzR

2

Từ hiểu biết của tôi OpenGL ES là một tập con của OpenGL. Tôi nghĩ rằng nếu bạn không sử dụng các công cụ chế độ tức thì, như glBegin() và glEnd(), bạn sẽ ổn thôi. Tôi đã không làm nhiều với OpenGL trong vài tháng qua, nhưng khi tôi làm việc với ES 1.0 miễn là tôi đã không sử dụng glBegin/glEnd tất cả các mã tôi đã học được từ OpenGL tiêu chuẩn làm việc.

Tôi biết trình mô phỏng iPhone chạy mã OpenGL ES. Tôi không chắc về Android.

Đây là Windows emulator.

+0

Trình mô phỏng SDK Android chắc chắn sẽ chạy mã OpenGL ES, tùy thuộc vào phiên bản API mà thiết bị ảo của bạn hỗ trợ. Chậm hơn nhiều so với các thiết bị thực tế mặc dù. – davenpcj

+0

Hơn nữa, trình giả lập Android chỉ có thể xử lý OpenGL ES 1.x. Nó ném một ngoại lệ nếu được cấp mã OpenGL ES 2.0. Điều đó đã được thử nghiệm trên một thiết bị hỗ trợ 2.0. Điều này có thể thay đổi trong vài tuần với Ice Cream Sandwich, nhưng tôi không tin vào nó: thái độ của các nhà phát triển là nó đơn giản hơn để thử nghiệm trên thiết bị, vì vậy việc cập nhật trình giả lập không quan trọng. –

4

Trong OpenGL ES 2.0, đó là tiện ích mới sử dụng, bạn cũng phải cung cấp các trình đổ bóng và phân đoạn của riêng mình vì đường ống chức năng cố định cũ đã biến mất. Điều này có nghĩa là bạn phải tự mình thực hiện bất kỳ tính toán bóng nào, những thứ sẽ khá phức tạp, nhưng bạn có thể tìm thấy các triển khai hiện có trên hướng dẫn GLSL.

Tuy nhiên, vì GLES là một tập con của OpenGL trên máy tính để bàn, bạn có thể chạy cùng một chương trình trên cả hai nền tảng.

+3

+1 Đây là một điều rất tốt câu trả lời có thể sẽ dẫn đến cách tiếp cận hiệu quả nhất (tránh tái cấu trúc, viết mã như lập trình với các VBO ngay từ đầu). –

+1

ES2 không phải là một tập hợp con nghiêm ngặt của máy tính để bàn GL, ES3. –

3

tôi biết hai dự án để cung cấp GL dịch giữa máy tính để bàn và ES:

  • glshim: đường ống dẫn cố định đáng kể để 1.x hỗ trợ, cơ bản ES 2.x hỗ trợ.

  • Regal: Bất kỳ điều gì đến ES 2.x.

+0

Tôi đã tìm thấy Regal gần đây quá, có vẻ khá tốt đẹp. –

+0

Tôi thấy Regal đau đớn khi sử dụng, tuy nhiên :( – lunixbochs

0

Tùy chọn 3) Bạn có thể sử dụng thư viện như Qt để xử lý mã OpenGL của mình bằng chức năng trình bao bọc sẵn. Điều này cung cấp cho bạn tùy chọn sử dụng một cơ sở mã (hoặc các cơ sở mã tối thiểu khác nhau) cho OpenGL và xây dựng cho hầu hết mọi nền tảng bạn muốn. Bạn sẽ không cần phải chuyển nó cho mỗi nền tảng khác nhau mà bạn muốn hỗ trợ. Qt thậm chí có thể chọn ngữ cảnh OpenGL dựa trên các chức năng mà bạn sử dụng.