2013-04-16 37 views
7

GLSL'de değişken dizinleri kullanarak sorun yaşıyorum. Foliolama GLSL kodu NVidia kartlarında iyi çalışıyor. Ama onun benim işimde değil, onun üzerinde çalışmıyorum. Bu, Shader-Derleyici Hatası yok. Bu program sadece glUseProgram GLSL döngü dizisi dizini

adresinde çökertilmiştir.

Düzenleme:

uLightCount ve uLightsPos olan üniformalar:

#define MAX_LIGHTS 10 
uniform float uLightCount; 
uniform vec3 uLightsPos[MAX_LIGHTS]; 

Düzenleme 2:

#define i0 0 
#define i1 1 
#define i2 2 
... 

for(int i=0;i<int(uLightCount);++i) 
{ 
    vec3 lightPos; 

    if (i==i0) 
     lightPos = uLightsPos[i0]; 
    if (i==i1) 
     lightPos = uLightsPos[i1]; 
    .... 
} 
: Garip bir çözüm bulduk

Bunun neden işe yaradığı hakkında bir fikrin var mı?

+0

(sen? Genellikle bu çok eski OpenGL ve GLSL uygulamalarını son bootcamp sürücüsü ile –

+0

destekleyen tümleşik kartlar Shader Model Intel kartları tarafından desteklenen ne olduğunu kontrol etmelidir olabilir kendisinin yazmak mümkün değildir MacBook Air'ımda) OpenGL 4.0 destekleniyor – Bastl

+0

glGetError()? –

cevap

1

Dizin sabit olmalı. Bu yüzden çözümünüz işe yarıyor.

Yani

for(int i=0;i<10;++i) 
{ 
    result += uLightsPos[i]; 
} 
+3

Hayır, çağdaş kartları dinamik dallanma ve döngüler ikisini de destekler. Birçok havai ayrıca uygulama ve iplik sapma üzerinde olabilir bağlı olarak söylediklerini aksine küçük ol. "glUseProgram" çökmemelidir. Bu bir sürücü hatasıydı. – jozxyqk

+0

Yukarıdakileri, birçok durumda, yanıtta olduğu gibi derleme zamanı sabitlerini sağlayarak açma döngülerinin derleyicinin çok sayıda optimizasyon yapmasına izin verebileceğini de belirtmek zorundayım. – jozxyqk

+0

hmm, Son zamanlarda WebGL üzerinde GLSL ile bu sorunu vardı. Kilitlenme değil, gölgelendirici derlemesi başarısız oldu. Aslında benim kodum daha fazlaydı (ve belki bana bir tavsiyede bulunabilirsiniz): void func() {for (int i = 0; i <10; ++ i) {func2 (i); }} '' void func2 (int endeksi) {float değeri = myArray [index]; ...} ' – Dave