2014-07-19 17 views
6

Tôi có một trình đổ bóng với bộ đồng phục _color và một bộ lấy mẫu. Bây giờ tôi muốn vẽ với _color ONLY nếu mẫu không được thiết lập. Có cách nào để nhận ra rằng trong bóng râm của chúng ta? (Thật không may mẫu thử trả về 1,1,1,1 khi không được gán, mà làm cho nó trộn qua alpha không thể)Làm thế nào để kiểm tra xem một sampler là null trong glsl?

Trả lời

7

Bạn không thể làm điều đó. Các mẫu là một xử lý đục mà chỉ tham chiếu một đơn vị kết cấu. Tôi không chắc chắn nếu spec đảm bảo rằng (1,1,1,1) khi lấy mẫu từ một đơn vị mà không có kết cấu bị ràng buộc, hoặc nếu đó là hành vi không xác định.

Những gì bạn có thể làm là chỉ sử dụng một bộ đồng phục khác để chuyển đổi betwenn bằng cách sử dụng mẫu hoặc màu đồng nhất hoặc chỉ sử dụng các trình đổ bóng khác nhau và chuyển đổi giữa chúng. Ngoài ra còn có các khả năng của chương trình con ở đây, nhưng tôi không biết liệu đó có phải là thẩm định đúng cho một vấn đề đơn giản như vậy hay không.

1

Tôi đã vấp phải câu hỏi này đang cố giải quyết vấn đề tương tự.

Kể từ GLSL 4,30

int textureQueryLevels(gsamplerX sampler); 

Là một chức năng xây dựng-in. Trong thông số GLSL. p. 151 nó nói

Giá trị 0 sẽ được trả lại nếu không có kết cấu hoặc kết cấu không hoàn chỉnh được liên kết với mẫu.

Trong OpenGL-Forms Tôi tìm thấy một entry cho câu hỏi này gợi ý để sử dụng

ivecY textureSize(gsamplerX sampler,int lod); 

và thử nghiệm nếu kích thước kết cấu là lớn hơn không. Nhưng đây là, theo hiểu biết của tôi, không được đề cập trong tiêu chuẩn. Trong phần 11.1.3.4 của đặc tả OpenGL người ta nói rằng

Nếu mức hình ảnh kết cấu tính toán nằm ngoài phạm vi [levelbase, q], kết quả là không xác định ...

Sửa : Tôi chỉ thử phương pháp này trên vấn đề của mình và hóa ra nvidia có một số vấn đề với hàm này, dẫn đến giá trị không bằng 0 khi không có kết cấu nào bị ràng buộc. (Xem nvidia bug report từ năm 2015)

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