2011-08-02 18 views
5

Vì GLSL không có tùy chọn bao gồm tệp tôi đang cố gắng thêm bằng cách sử dụng trình phân tích cú pháp "#pragma include". (Tôi muốn điều này bởi vì tôi có một số phương pháp chung mà tôi muốn thực hiện chỉ một lần nhưng có thể sử dụng trong nhiều trình đổ bóng khác nhau, như cách mượt mà của Ken Perlin)OpenGL/GLSL - sử dụng glShaderSource với nhiều nguồn để hỗ trợ bao gồm các tệp

Phân tích cú pháp tệp shader để nhận các tệp được bao gồm hoạt động tốt. Nhưng khi thiết lập ShaderSource với nhiều tệp nguồn, tôi luôn gặp sự cố; vì shader chính của tôi thường bắt đầu bằng "#version 330" và # version-line luôn luôn là dòng đầu tiên trong trình đổ bóng, tôi chỉ có thể thêm tệp chính của mình làm tệp đầu tiên trong chuỗi các chuỗi được chuyển tới glShadersource và sau tất cả các tệp được bao gồm. Nhưng sau đó tập tin chính của tôi không thể sử dụng bất kỳ chức năng nào được thực hiện trong các tệp đó, vì chúng về cơ bản sẽ được ghép nối sau tệp chính của tôi để trình biên dịch phàn nàn rằng nó không biết các chức năng mà tệp chính của tôi đang sử dụng. Cách duy nhất tôi có thể nghĩ để làm cho nó hoạt động là đọc tệp chính, phân tích cú pháp bao gồm pragma, và sau đó thay thế dòng pragma đó với nội dung của tệp cần được đưa vào (đệ quy áp dụng cùng một phương pháp này cho tất cả các tệp có thể bao gồm các tệp khác) - nhưng điều đó có nghĩa là các bộ đệm trong các lỗi biên dịch sẽ không khớp với các bộ đệm thực của tệp chính nữa.

Có ai đã thiết lập một số loại chức năng "bao gồm" cho GLSL hoạt động và giữ bộ đồ lót không? Và nếu vậy - làm thế nào?

Trả lời

2

Còn phân tích cú pháp cho thẻ #version và tạo chuỗi này là chuỗi nguồn riêng biệt (và đầu tiên) thì sao? Bằng cách này, bạn cũng có thể có các thẻ phiên bản khác nhau trong phần bao gồm (tùy thuộc vào yêu cầu chức năng của chúng) và chỉ giảm chúng xuống một thẻ phiên bản (thẻ có số phiên bản cao nhất).

+0

Bạn, thưa bạn, là một thiên tài! Không có ý tưởng tại sao tôi không nghĩ về điều đó, nhưng tôi nghĩ rằng đây sẽ là cách để đi cho tôi. \ o/ – Pygmy

1

Trước tiên, có chỉ thị tiền xử lý #line đặt dòng nguồn hiện tại được báo cáo trong thông báo lỗi trình biên dịch. Sử dụng chỉ thị tiền xử lý này, bạn có thể làm cho nó dễ dàng trong việc bao gồm các dòng nguồn bên ngoài. Điều này sẽ giải quyết vấn đề của bạn.

Ngoài ra, tôi đã đọc phần mở rộng shading_language_include, giúp bạn hỗ trợ chức năng "bao gồm". Nếu trình điều khiển của bạn đã không triển khai nó, bạn vẫn có thể hỗ trợ cú pháp mà phần mở rộng giới thiệu, vì vậy bạn có thể hỗ trợ các trình đổ bóng một cách duyên dáng yêu cầu phần mở rộng đó.

-1

Nếu trình đổ bóng của bạn có trong tệp, bạn có thể sử dụng cpp (hoặc gcc -E) để xử lý chúng (và xử lý bất kỳ chỉ thị #include nào) trước khi chuyển chúng sang openGL. Bạn thậm chí có thể có một số thứ như popen("cpp -P main.glsl", "r") để đọc và xử lý trước trình đổ bóng của bạn ...

+0

Sử dụng công nghệ này là cần thiết để thiết lập các ký hiệu tiền xử lý được xác định bởi khung công tác glsl (__VERSION__ chẳng hạn). – Luca