2012-04-30 35 views
26

Hai câu hỏi thực sự ...Sự khác nhau giữa GLSL và GLSL ES 2

  1. là GLSL ES 2 một ngôn ngữ hoàn toàn riêng biệt, hoặc một phiên bản đặc biệt của GLSL?
  2. Sự khác biệt giữa chúng, về các chức năng, cú pháp và khả năng của "thư viện chuẩn"?

Tôi viết các trình đổ bóng cho ứng dụng được nhắm mục tiêu tại Windows, Mac và iPad và tôi không muốn thêm nhiều phiên bản của mỗi trình đổ bóng - các trình đổ bóng đơn giản hơn.

+5

Ngoài câu trả lời của Nicol, tôi thấy thuận tiện khi xem các thẻ tham chiếu nhanh cho các phiên bản API khác nhau để xem một chức năng hoặc khả năng cụ thể có ở đó hay không. Phiên bản OpenGL ES 2.0 được đặt tại đây, ví dụ: http://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf –

Trả lời

26

GLSL ES 2 là ngôn ngữ hoàn toàn riêng biệt hay phiên bản đặc biệt của GLSL?

Mỗi phiên bản GLSL cuối cùng là "ngôn ngữ hoàn toàn riêng biệt;" một số thậm chí không tương thích ngược với các phiên bản trước. Tuy nhiên, biến thể ES của GLSL thậm chí còn là moreso.

Hãy coi đó là một nhánh của GLSL trên máy tính để bàn. Một ngã ba của GLSL từ sáu phiên bản trước đây, hãy nhớ bạn.

Sự khác nhau giữa chúng, về chức năng "thư viện chuẩn", cú pháp và khả năng?

Giữa các phiên bản nào?

Lý do duy nhất bạn có thể phải cố gắng chia sẻ shader giữa các nền tảng này là nếu bạn đang cố gắng chia sẻ mã OpenGL giữa chúng. Vì vậy, bạn phải hạn chế bản thân với chức năng OpenGL 2.1 trên máy tính để bàn.

Điều đó có nghĩa là bạn đang sử dụng GLSL phiên bản máy tính để bàn 1.20. Điều này tương tự như phiên bản GLSL ES 1.00 (phiên bản GLSL không được cung cấp cùng số với phiên bản GL phù hợp. Cho đến khi máy tính để bàn GL 3.3/4.0 và GLSL 3.30/4.00), nhưng vẫn khác nhau. Trong ES, bạn có rất nhiều vòng loại chính xác mà máy tính để bàn GLSL 1.20 không xử lý.

Cách tốt nhất để xử lý đó là sử dụng chuỗi đổ bóng "lời mở đầu". Xem, glShaderSource có nhiều chuỗi đổ bóng, mà nó tát cùng nhau và biên dịch thành một. Bạn có thể lấy chuỗi đổ bóng chính của mình (main và mã khác nhau của nó, attribute định nghĩa, uniforms, v.v.) và dán một chuỗi đổ bóng "tiền tố" trước đó. Lời mở đầu sẽ khác nhau tùy thuộc vào những gì bạn đang biên dịch.

bạn ES GLSL 1.00 lời mở đầu sẽ trông như thế này:

#version 100 //Must start with a version specifier. 

GLSL của bạn máy tính để bàn 1,20 lời mở đầu sẽ trông như thế này:

#version 120 
#define lowp 
#define mediump 
#define highp 

Và có lẽ một vài khác đắn #defines. Bằng cách này, trình đổ bóng của bạn có thể có các bộ định tính chính xác được đặt và chúng sẽ chỉ là #define d khi sử dụng GLSL trên máy tính để bàn.

Điều này giống như mã hóa nền tảng trung lập trong C/C++, nơi bạn thường có một số tiêu đề nền tảng cụ thể làm thay đổi định nghĩa và/hoặc có #define s mà bạn có thể điều kiện mã dựa trên.

+2

"Shader không bao gồm # chỉ thị phiên bản sẽ là được coi là nhắm mục tiêu phiên bản 1.10. Những người chỉ định #version 100 sẽ được coi là nhắm mục tiêu phiên bản 1.00 của Ngôn ngữ bóng mờ OpenGL ES, là tập hợp con nghiêm ngặt của phiên bản 1.50. " Từ khả năng tương thích ES2 –