2013-04-14 32 views
9

Có ai biết cách thực hiện cú pháp switchcase trong trình đổ bóng phân đoạn trên Samsung Galaxy S2 không? Tôi gặp lỗi biên dịch: Expected literal or '(', got 'switch'.Android OpenGL ES 2.0: Cú pháp "chuyển đổi" có thể có trong trình đổ bóng đoạn GLSL trên Samsung Galaxy S2 không?

cú pháp của tôi là như sau:

switch(i){ 
    case 0: x = alphas[0]; break; 
    case 1: //...etc. 
} 

này hoạt động tốt trên Nexus 7, nhưng trên Galaxy S2 tôi nhận được lỗi trên. Có phải switchcase hướng dẫn đơn giản là không thể trên Galaxy S2? Lý do tại sao tôi muốn sử dụng chúng dường như cải thiện hiệu suất trên ifelse trên Nexus 7. Nếu chúng không thể trên Galaxy S2, có cách truy vấn thiết bị và sử dụng switchcase nếu có, và ifelse nếu không?

Trả lời

7

switch tuyên bố không được hỗ trợ trong OpenGL ES 2.0. Từ OpenGL ES Shading Language 1.0.17 đặc tả 3.7:

The following are the keywords reserved for future use. Using them will result in an error:

asm class union enum typedef template this packed goto switch default ...

4

GLSL ES dựa trên phiên bản 1.10 của GLSL trên máy tính để bàn, nhưng câu lệnh 'switch case' được thêm vào vesrion 1.30, vì vậy bạn không thể giả định rằng thiết bị sẽ hỗ trợ nó.

Ngoài ra, tôi khuyên bạn nên tránh phân nhánh trong phân đoạn đổ bóng khi nó chạm vào perfomanace nặng.

+0

Làm thế nào tôi có thể tránh nhánh nếu tôi cần phải animate màu sắc của các đối tượng riêng biệt trong shader mảnh và GPU không hỗ trợ truy cập mảng bởi biến (chỉ hằng thời gian biên dịch) ? – Navigateur

+3

Bạn có thể thử chuẩn bị các shaders khác nhau cho các loại đối tượng khác nhau (không có _switch_, với mã cho _case_ inlined thích hợp) và gọi glUseProgram (GLint aObjectShaderID) trước khi vẽ, khi thay đổi kiểu. Đây là những gì tôi sử dụng ngay bây giờ, tốc độ phụ thuộc vào tần suất tôi phải thay đổi shader (đối tượng vẽ nên được sắp xếp theo shaders để giảm thiểu thay đổi shader) và phức tạp như thế nào là phân nhánh, nhưng quy tắc vàng là để tránh phân nhánh ở tất cả các chi phí và proflie sau triển khai từng tối ưu hóa. – zombo

+0

zombo, điều này có yêu cầu một lệnh gọi 'drawElements' riêng biệt cho mỗi chương trình không? Điều này không mang chi phí của riêng nó và làm thế nào để bạn biết nó không đắt hơn so với phân nhánh trong shader fragment? – Navigateur

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