2012-01-14 26 views
8

Tôi đang cố gắng chuyển boolean vào trình đổ bóng đỉnh lần đầu tiên; Tôi đã chỉ sử dụng phao nổi cho đến bây giờ.OpenGL ES (2.0) Shading Language: Làm cách nào để nhập boolean vào vertex shader và chuyển đến shader fragment?

Boolean được đề cập là nguyên thủy cụ thể để không thể được chuyển thành bộ đồng phục. Tuy nhiên nó có cùng giá trị cho tất cả các đỉnh của bất kỳ nguyên thủy nào.

Dường như từ thông số kỹ thuật của Khronos rằng 'thay đổi' là cách duy nhất để chuyển dữ liệu vào trình đổ bóng phân mảnh, nhưng không ngạc nhiên khi khai báo 'bool my_bool khác nhau'; gây ra lỗi trình phân tích cú pháp khi được xác định trong trình đổ bóng đỉnh của tôi.

Tôi đang đi qua các boolean vào vertex shader của tôi là:

attribute bool a_my_bool; 

tôi xác định một khác nhau trong một nỗ lực để vượt qua các shader đoạn:

varying bool v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

Ai đó có thể xin vui lòng cho tôi biết thế nào Tôi có thể đạt được những gì tôi có ý định?

Trả lời

12

Từ §4.3.5 của The OpenGL® ES Shading Language version 1.0.17 (PDF):

Các vòng loại khác nhau có thể được sử dụng với các kiểu dữ liệu nổi, vec2, vec3, vec4, mat2, mat3, và mat4, hoặc mảng trong số này.

Và từ §4.3.3:

Các vòng loại thuộc tính có thể được sử dụng với các kiểu dữ liệu nổi, vec2, vec3, vec4, mat2, mat3, và mat4. Biến thuộc tính không thể được khai báo là mảng hoặc cấu trúc.

Vì vậy, bạn không thể có attribute bool, hãy để một mình varying bool, theo thông số kỹ thuật.

Nếu bạn thực sự cần giá trị boolean trên mỗi đỉnh, bạn có thể sử dụng 0.0 cho giá trị false và 1.0 cho giá trị true. Khi thử nghiệm, hãy kiểm tra x > 0.5.ví dụ:

// vertex shader 
attribute float a_my_bool; 
varying float v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

// fragment shader 
varying float v_my_bool; 
void main() { 
    if (v_my_bool > 0.5) { 
     // my_bool is true 
     // ... 
    } else { 
     // my_bool is false 
     // ... 
    } 
} 

Miễn là tất cả các đỉnh trong mỗi tam giác đều có cùng giá trị, điều này sẽ hoạt động. Nếu chúng không nhất quán, thì bạn sẽ kết thúc với các mảnh khác nhau cho cùng một hình tam giác hoạt động khác nhau. (Nếu bạn gắn vào 0,0 và 1,0 phần tư hình tam giác gần nhất với góc "lẻ" sẽ hoạt động khác với phần còn lại.)

3

Tôi đặc biệt khuyên bạn không nên sử dụng thuộc tính và chuyển nó thành đồng phục mặc dù boolean được gắn với nguyên thủy đã cho. Với Uniform bạn thiết lập nó một lần và sử dụng nhiều lần, với thuộc tính bạn tăng rất nhiều băng thông bộ nhớ cần thiết trong mỗi trận hòa. Ý nghĩa duy nhất tôi thấy trong điều này là nếu bạn thực hiện một loạt các nguyên thủy của bạn nhưng ngay cả trong trường hợp đó, lợi ích thực sự của giải pháp này phải được đánh giá cẩn thận vì rủi ro là đạt được hiệu ứng ngược lại.

Về các biến khác nhau, một trong những sai lầm phổ biến là không khai báo khác nhau trong cả hai Vertex và Fragment shaders và bỏ lỡ một trong những 2.

Điều này sẽ nâng cao một lỗi liên kết và bạn sẽ nhận ra điều này bằng cách kiểm tra các biên dịch và liên kết kết quả.

Một khía cạnh khác tôi sẽ kiểm tra ở vị trí của bạn là đảm bảo các biến được gán và sử dụng trong mã của bạn vì trình biên dịch không sử dụng nội dung không sử dụng (tối ưu hóa mã chết) và kết quả là một vấn đề rất phổ biến.

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