2012-04-07 16 views
5

Próbuję pobrać próbkę tekstury liczb całkowitych z mojego modułu cieniującego geometrii działającego na GeForce 330m. Wydaje się, że zwraca inne wartości, niż mogę załadować do tekstury. Używam tego kodu (zasadniczo) do tworzenia i ładowania Tekstura:Cieniowanie OpenGL GeoHigter integer tekstury nie działa.

glGenTextures(1, &textureId); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_INT, <some 0-initialized large enough buffer>); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
    int data[] = { 3, 0, 36, 400 }; 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 3, 1, 1, GL_RGBA, GL_INT, data); 
glBindTexture(GL_TEXTURE_2D, 0); 

Chodzi o to, że jeden piksel w szczególnych ustawiony jest mieć w-wartość 400. Następnie używać to w moim geometry shader:

#version 330 
#extension GL_EXT_gpu_shader4 : require 
uniform isampler2D models; 

void main() 
{ 
    ivec4 modelstats4 = texelFetch2D(models, ivec2(0, 3), 0); 
// ivec4 modelstats4 = ivec4(3, 0, 36, 400); 
    if (modelstats4.w > height) { 
     // emit something 
    } 
} 

Użycie skomentowanych ustalonych wartości, które powinny być równe, powoduje, że coś jest emitowane (IE, jeden punkt). Jeśli użyję rzeczywistego pobierania tekseli, to nic nie zwróci. Wszystkie wartości, które znam, mogą mieć wpływ, są teraz zakodowane na stałe, więc nie rozumiem, dlaczego to nie działa. To nie jest pełny kod (konfiguracja OO, dość dużo do przejrzenia), ale są to odpowiednie wywołania OpenGL z odpowiednimi danymi.

+0

Powinieneś odpowiedzieć na pytanie lub je usunąć. Ponieważ pozostaje tylko na liście pytań bez odpowiedzi :) – kravemir

+0

Dzięki Miro, nie wiedziałem o tym. – dascandy

Odpowiedz

4

Znaleziono rozwiązanie dzięki liberalnemu posypywaniu glGetErrors. Błąd był w każdym glTexImage w tym przykładzie kodu - najwyraźniej w przypadku tekstur całkowitych nie wolno używać GL_RGBA, ale GL_RGBA_INTEGER.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data); 

To teraz działa. Pobieranie tekstur również jest OK.