2010-03-04 9 views
19

GLSL, tam bir C stili önişlemciye sahiptir. Çalışmıyor tek şey #include. En iyi özelliklerden biri, #ifdef işlevlerini yorumlamak ve böylece belirli özellikler kullanılmadığında inceltilebilen tek bir gölgelendirici oluşturmak için kullanabilmenizdir.Harici Önişlemci Makrolarını GLSL'de Tanımlayın

Benim Soru: C kodundan bir makro tanımlamak için bir yol

var mı?

OpenGL arabirimiyle bunu yapmanın bir yolu yoktur. Hızlı kesmek, kod yüklenen form dosyasından önce #define FOO ile birkaç satır eklemektir. Ama geriye doğru görünüyor.

cevap

23

Yüklediğiniz kodlara eklemeniz gerekmez. Bu yüzden glShaderSourceARB API'sinde birden çok dizge var. aşağıdaki gibi

Bir şey aradığınızı yapar:

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

Bu geçerli bir çözümdür, ancak kaynak kodun hazırlanmasından çok daha iyi değildir. – rioki

+2

iyi, neyin peşinde olduğunuza bağlı. Bu, bazı ek bellek ayırmalarını ve kopyalarını engellemek için iyidir (bu yüzden hazır çözme çözümünü dikkate alacağım). Size daha iyi ne olur ve neden? – Bahbar

+1

Daha fazla hat boyunca glDefine ("Moo", "Foo") 'yi düşünüyordum ... ama teknik özellikleri incelediğimden eminim ... – rioki

6

Ben #version sorunlardan kaçınmak için kullandığınız yöntemdir. Java'dır ve perfo için optimize edilmemiştir, ancak mükemmel çalışır:

// 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");