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.
Należy również opublikować moduł cieniujący. –
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
Próbowałem zmienić nazwę munduru na "myTexture", ale wynik jest taki sam, niestety. – fescrb