2012-11-23 27 views
6

Trình đổ bóng của tôi thường chia sẻ nhiều chức năng giống nhau. Ví dụ tính toán của ánh sáng khuếch tán/gương. Tôi muốn viết một lần này và sau đó sử dụng lại mã trên các trình đổ bóng khác nhau.Làm cách nào để viết mã glsl có thể tái sử dụng?

Glsl không có kiến ​​thức về tệp và không hỗ trợ cho chỉ thị tiền xử lý #include giống như c.

Tôi biết glsl có hỗ trợ cho việc biên dịch nguồn từ nhiều cstrings, nhưng làm thế nào bạn có thể biết cstrings để bao gồm? Bạn có triển khai phiên bản bao gồm của riêng mình không? Hoặc bạn có tạo ra một số loại siêu dữ liệu cho mỗi trình đổ bóng của bạn không?

Trả lời

4

Trong các dự án lớn, trình đổ bóng thường được lắp ráp ở lần chạy đầu tiên (hoặc khi tùy chọn đồ họa thay đổi) để chúng bao gồm tất cả chức năng của nhà cung cấp cụ thể và được tối ưu hóa cho máy và cài đặt người dùng. Và không chỉ shader mà còn một số giai đoạn render đường ống.
Bạn có thể coi GLSL là mã HTML \ CSS \ JavaSript mà tập lệnh PHP phát sinh theo yêu cầu. Và bạn có thể sử dụng cùng một kỹ thuật như tampleting, mã tiêm (ví dụ số lượng tra cứu kết cấu) trong vòng lặp. Và nó cũng tốt cho các nhà thiết kế đồ họa bởi vì họ có quyền kiểm soát đơn giản trên nguồn shader thông qua tham số hóa - sổ séc, các lĩnh vực đầu vào vv và nó có thể tạo ra đổ bóng độc đáo cho các trường hợp duy nhất.

1

Tôi có giải pháp tùy chỉnh dựa trên http://blackpixel.com/blog/494/xcode-using-includes-in-opengl-shaders/ [404 ngay bây giờ]. Về cơ bản nó nói rằng bạn có thể sử dụng công cụ m4 để xử lý trước các tập tin.

Trong file nguồn GLSL chỉ bao gồm các mảnh mong muốn bạn muốn sử dụng lại:

include(Utils.glsl) 
include(Colors.glsl) 

... 

void main (void) { 
    ... 
} 

Trong Xcode, thêm tất cả glsl file “Sao chép Bundle Tài”.

Thêm một “Run Script” giai đoạn với shell script này:

#!/bin/sh 

cd ${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME} 
find . -name "*.fsh" | while read file; do 
    echo Preprocess $file 
    m4 "$file" > "$file.tmp" 
    mv "$file.tmp" "$file" 
done 

exit 0 

Kịch bản giả định shaders bạn có .fsh mở rộng. Việc chỉnh sửa nó để phù hợp với tiện ích của trình tạo bóng của bạn là tầm thường.

Được cảnh báo: các trình tạo bóng của bạn sẽ dễ dàng truy cập được đối với hầu hết mọi người. Bạn có thể sử dụng nó để phát triển và chuyển đổi chúng thành chuỗi trước khi phát hành chúng (không phải là sự bảo vệ thực sự trừ khi bạn mã hóa nó ...).

Ngoài ra, nếu không có nhiều chia sẻ giữa các trình đổ bóng, bạn sẽ kết thúc với nhiều mã không sử dụng. Tôi đoán trình biên dịch đổ bóng sẽ chăm sóc nó nhưng tôi không chắc chắn 100% nếu có một số hình phạt về hiệu suất.

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