2012-07-08 28 views
6

Tôi đang phát triển một ứng dụng OpenGL cho iPhone. Trong shader vertex của tôi, tôi cần một cách để thay đổi màu sắc của một số lượng lớn (nhưng không phải tất cả) của các đỉnh của tôi, cùng một lúc, vì vậy tôi quyết định lập chỉ mục màu. Điều này sẽ cho phép tôi để lại VBO tĩnh, và sửa đổi một biến thống nhất duy nhất thay vì lặp qua mỗi đỉnh và sửa đổi thông tin màu sắc giữa mỗi khung.Cung cấp số nguyên cho chỉ mục mảng trong OpenGL ES 2.0?

Kế hoạch của tôi là tạo đồng phục với mảng màu, thêm số nguyên chứa chỉ mục trong thuộc tính. Đây là vertex shader của tôi:

uniform mat4 u_mvp_matrix; 
uniform vec4 u_color_array[]; 

attribute vec4 a_position; 
attribute int a_colorIndex; 

varying lowp vec4 v_color; 

void main() 
{ 
    v_color = u_color_array[a_colorIndex]; 

    gl_Position = u_mvp_matrix * a_position; 
} 

Điều này đặt ra một lỗi:

int can't be an in in the vertex shader

tôi đã làm một số nghiên cứu. IPhone hỗ trợ OpenGL ES 2.0 chậm nhất, có nghĩa là nó hỗ trợ GLSL 1.2 mới nhất, và các số nguyên dường như chỉ được hỗ trợ trong GLSL 1.3 trở lên. Tôi đã thử thay đổi a_colorIndex thành một phao. Tôi không mong đợi nó hoạt động, và nó không.

Làm cách nào để chỉ định chỉ mục màu cho mỗi đỉnh?

+0

Có thể xem xét tra cứu kết cấu, trong đó chỉ mục của bạn là hình mờ, thay vì tra cứu mảng? Hoặc bạn có thể đúc/vòng phao vào một int? – Tim

+1

"có nghĩa là nó hỗ trợ GLSL 1.2 mới nhất" Không, không. GL ES 2.0 có nghĩa là nó hỗ trợ ngôn ngữ tô bóng GLSL *** ES ***, có * khác * từ ngôn ngữ GLSL trên máy tính để bàn. GLSL ES dựa trên GLSL 1.2, nhưng chúng * không giống nhau. * –

Trả lời

4

Chỉ định thuộc tính làm phao. Bạn có thể sử dụng phao như các chỉ mục thành các mảng.

+0

Tôi nhận được lỗi này "Biểu thức chỉ mục có loại 'float' nhưng phải có loại tích phân" nếu tôi làm những gì bạn nói. Có an toàn để làm mảng [int (fIndex)] hoặc nó sẽ chạy vào lỗi chính xác? – weezor

+0

Tôi nhận được vào cùng một vấn đề như weezor ("... nên có loại tích phân") (ít nhất là trong một số trường hợp). Nó sẽ là tốt đẹp để làm rõ. –

+0

Đặc tả ngôn ngữ ES2 cho biết: "Các phần tử mảng được truy cập bằng biểu thức có loại là số nguyên." Vì vậy, có, cast để int (nền tảng khoan dung làm một diễn viên tiềm ẩn, vì vậy câu trả lời có thể hoạt động trên máy của người trả lời). – kiwibonga

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