2012-07-11 38 views
5

Tôi muốn có cùng một nguồn đổ bóng cho OpenGL ES và OpenGL (Windows). Để thực hiện điều này, tôi muốn xác định các kiểu dữ liệu tùy chỉnh và chỉ sử dụng các hàm OpenGL ES.OpenGL ES và OpenGL shaders tương thích

Một cách tiếp cận là để xác định:

#define highp 
#define mediump 
#define lowp 

cho Windows shader và viết shader như nó là dành cho OpenGL ES.

cách tiếp cận khác là xác định kiểu dữ liệu tùy chỉnh như thế này cho OpenGL ES:

#define hvec2 highp vec2 

và như thế này dành cho Windows

#define hvec2 vec2 

Bạn nghĩ gì là tốt hơn? Bạn có các giải pháp khác cho vấn đề này không?

Trả lời

4

Giải pháp của tôi đã được để viết mã shader đó là tương thích với cả hai API, và sau đó khi tải lên các đoạn mã nguồn đổ bóng để OpenGL ES chỉ thêm vào trước dòng sau:

precision mediump float; 

Đó đặt mặc định nổi điểm chính xác đến trung bình. Trong các trình đổ bóng đoạn OpenGL ES, không có mức độ chính xác mặc định cho các giá trị dấu phẩy động, có nghĩa là bạn cần chỉ định độ chính xác trên mọi khai báo dấu phẩy động hoặc đặt độ chính xác mặc định. Thay vào đó, bạn có thể sử dụng lowp hoặc highp nếu điều đó có ý nghĩa hơn cho ứng dụng của bạn.

Để biết thêm chi tiết xem mục 4.5.3 của đặc tả OpenGL ES Shading Language: http://www.khronos.org/files/opengles_shading_language.pdf

Bạn cũng có thể trộn phương pháp này với cách tiếp cận #define của bạn nếu bạn cần kiểm soát tốt hơn độ chính xác trong shaders của bạn.

4

Bạn có thể sử dụng http://www.opengl.org/registry/specs/ARB/ES2_compatibility.txt

Phần mở rộng này thêm hỗ trợ cho tính năng của OpenGL ES 2.0 mà bị thiếu từ OpenGL 3.x. Việc bật các tính năng này sẽ giảm bớt quá trình chuyển các ứng dụng từ OpenGL ES 2.0 sang OpenGL.

+0

Có ai biết cách này hoạt động không? Tôi đã lướt qua spec nhưng không thể tìm thấy bất cứ điều gì liên quan đến cách một GLSL ES (phiên bản 100) và GLSL (phiên bản 150) sẽ tương thích ở tất cả. –

+0

Để tham khảo trong tương lai, tôi phát hiện ra rằng dưới ES2_compatibility một OpenGL 3.2> context có thể tải các shaders ES 2.0 với #version 100 ở trên cùng. –

1

tôi quản lý nó bằng cách chỉ định sau đây tại bắt đầu của mỗi shader khi shader chạy trên cửa sổ:

#define lowp 
#define mediump 
#define highp 

bổ sung i cung cấp cho các shader thông tin mà plattform được sử dụng (WINDOWS, MOBILE, IOS) có thể được sử dụng theo cách này:

#ifdef WINDOWS 
precision mediump float; 
#endif 
+0

Tăng cường cho phần trên cùng của nhận xét - Tôi nghĩ rằng có nhiều giá trị hơn để có các công cụ sửa đổi chính xác và loại bỏ chúng trên các nền tảng không liên quan hơn là không bao gồm chúng và gây thiệt hại hiệu suất ở nơi khác. Nhưng '#ifdef GL_ES' (và' # ifndef') là cách dễ nhất để biên dịch có điều kiện, được tích hợp sẵn. – Tommy

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