2010-03-04 40 views
19

GLSL có bộ tiền xử lý kiểu C đầy đủ. Điều duy nhất không hoạt động là #include. Một trong những tính năng tuyệt vời là bạn có thể sử dụng #ifdef để bình luận các chức năng và do đó tạo ra một shader có thể được làm mỏng ra nếu một số tính năng không được sử dụng.Xác định bên ngoài Macro tiền xử lý trong GLSL

Câu hỏi của tôi là:

Có cách nào để xác định một macro từ mã C?

Dường như không có cách nào để làm điều đó với giao diện OpenGL. Việc hack nhanh là thêm một vài dòng với #define FOO trước khi tệp biểu mẫu được nạp mã. Nhưng có vẻ như ngược lại.

Trả lời

23

Bạn không thực sự cần phải thêm nó vào mã bạn đã tải. Đó là lý do tại sao có nhiều chuỗi trong API glShaderSourceARB.

giống như sau làm những gì bạn đang tìm kiếm:

char *sources[2] = { "#define FOO\n", sourceFromFile }; 
glShaderSourceARB(shader, 2, sources, NULL); 
+4

Đây là giải pháp hợp lệ, nhưng không tốt hơn nhiều so với việc thêm mã nguồn. – rioki

+2

tốt, nó phụ thuộc vào những gì bạn đang sau. Điều này là tốt để ngăn chặn một số phân bổ bộ nhớ bổ sung và sao chép (đó là lý do tại sao tôi sẽ xem xét các giải pháp hack trước). Điều gì sẽ tốt hơn cho bạn, và tại sao? – Bahbar

+1

Tôi nghĩ nhiều hơn dọc theo dòng 'glDefine (" Moo "," Foo ")' ... nhưng có vẻ như tôi đã nghiên cứu các thông số kỹ thuật đúng cách ... – rioki

6

Đây là những gì tôi sử dụng để tránh #version vấn đề. Nó là Java và không được tối ưu hóa cho perfo, nhưng nó hoạt động hoàn hảo:

// extract shader sourcecode from file 
StringBuilder shaderSource = Tools.readTextRessource(shaderSrcFile.url); 

// apply defined values 
int versionIndex = shaderSource.indexOf("#version"); 
if(versionIndex == -1) err("missing #version xxx in shader "+shaderSrcFile.name()); 
int defineInsertPoint = shaderSource.indexOf("\n", versionIndex)+1; 

for (int i = defined.size() - 1; i >= 0; --i) 
    shaderSource.insert(defineInsertPoint, "#define " + defined.get(i) + "\n"); 
Các vấn đề liên quan