2012-02-21 9 views
5

Używam OpenGL i GLSL do rysowania tekstury na prostej siatce.glUniform nie ustawił wartości próbnika

Mój problem polega na tym, że kiedy używam glUniform1i do ustawienia wartości samplera sampler2D, nie było ono ustawione. Na przykład w poniższy kod:

glUseProgram(programObject); 

glUniform1i(glGetUniformLocation(programObject, "texture"), 1); 
GLint val; 
glGetUniformiv(programObject, 
       glGetUniformLocation(programObject, "texture"), 
       &val); 
printf("Value is %d\n", val); 

Wartość wydrukowane na zewnątrz linii poleceń jest 0. Po sprawdzeniu, że shadery są kompilowane poprawnie, a program jest połączony prawidłowo. glGetUniformLocation wyprowadza indeks> 0. Ponadto glGetError nie generuje żadnego błędu w żadnym momencie.

Dzieje się tak tylko, gdy mundur jest próbnikiem. Ponieważ tekstura nie jest ustawiona, zapytanie w module cieniującym zawsze powraca (0, 0, 0, 1). (Sprawdziłem również, używając apitrace, że moja tekstura jest poprawnie powiązana z GL_TEXTURE1, która jest wykonywana natychmiast po pokazanym kodzie).

Mam obszerne wyszukiwanie tego problemu i znalazłem tylko jedno wystąpienie czegoś podobnego do tego here. Rozwiązaniem było zainicjowanie GLEW, ale to nie działało dla mnie.

Z przyjemnością udzielę wszelkich potrzebnych dodatkowych informacji (lub śledzenie z apitrace).

Edit

Oto shader:

uniform sampler2D texture; 

varying vec2 textureCoord; 

void main() { 
    gl_FragColor = texture2D(texture, textureCoord); 
} 

Rozwiązanie

udało mi się rozwiązać problem po jakimś pracy.

Jak się okazało, problem ten nie wynikał z braku ustawienia jednolitego, ponieważ zawsze zwracanie 0 dla próbników, niezależnie od rzeczywistej wartości, wydaje się być dziwactwem implementacji gl. Stało się to tylko w przypadku sterownika Intela dla Sandy Bridge. Testowanie kodu w innych implementacjach zawsze zwróciło poprawną wartość próbnika.

Problem powrotu tekstury (0, 0, 0, 1) zawsze był spowodowany błędem, który popełniłem podczas generowania tekstury.

Teraz glGerUniformiv nadal zwraca 0, ale użyta tekstura jest poprawna.

+0

Należy również opublikować moduł cieniujący. –

+2

Czy próbowałeś nazywać to coś innego (tekstura jest również wbudowaną funkcją GLSL, podczas gdy technicznie nie jest słowem kluczowym, nie gwarantuję, że to zadziała). – KillianDS

+0

Próbowałem zmienić nazwę munduru na "myTexture", ale wynik jest taki sam, niestety. – fescrb

Odpowiedz

3

Rozwiązanie

udało mi się rozwiązać problem po jakimś pracy.

Jak się okazało, problem ten nie wynikał z braku ustawienia jednolitego, ponieważ zawsze zwracanie 0 dla próbników, niezależnie od rzeczywistej wartości, wydaje się być dziwactwem implementacji gl. Stało się to tylko w przypadku sterownika Intela dla Sandy Bridge. Testowanie kodu w innych implementacjach zawsze zwróciło poprawną wartość próbnika.

Problem powrotu tekstury (0, 0, 0, 1) zawsze był spowodowany błędem, który popełniłem podczas generowania tekstury.

Teraz glGerUniformiv nadal zwraca 0, ale użyta tekstura jest poprawna.