2012-10-25 13 views
16

Dobrze, więc te tekstury naprawdę mnie mylą. Spoglądałem na samouczek this (który moim zdaniem jest świetny), szczególnie na obrazie opatrzonym napisem "Możesz zdefiniować do 32 jednostek tekstur, ale tylko do 8 tekstur na moduł cieniowania.". Jak rozumiem, oto jak to działa:OpenGLES 2 - kiedy do glBindTexture i kiedy do glActiveTexture?

Aktywujesz jednostkę tekstur. Następnie wiążemy obiekt tekstury (analogiczny do kostek "Dane tekstury" na obrazku) do określonego celu w obrębie tej jednostki. Tak więc, glGenTextures, aby uzyskać obiekty & uzyskać ich nazwy, a następnie glBindTexture, aby związać tę teksturę z TEXTURE_2D lub czymś (nie jestem zainteresowany innymi celami w tym momencie). Następnie możesz określić dane tekstury za pomocą glTexImage2D.

Teraz. Używam 3 programów cieniujących, z których każdy wymaga różnych tekstur. Oto, co chcę zrobić:

W fazie inicjalizacji, idę przez każdy z moich jednostek tekstur i przejdź

  • glActiveTexture
  • glBindTexture (działa na aktywnej jednostce tekstury)
  • glTexImage2D (działa na aktualnie oprawionym obiekcie)

, a dla shaderów, dopasowuję się do jednolitego w każdym shaderze do wartości "i" określonej w GL_TEXTUREi glActiveTexture. Potrzebuję w sumie tylko czterech tekstur i są one dość małe.

Teraz, podczas renderowania, powinienem móc przełączać programy w porządku, i wszystko działa, prawda? Każdy program ma już uniform określający, której jednostki użyć, a każda jednostka ma już obiekt związany z celem TEXTURE_2D, a każdy obiekt ma dane określone przez glTexImage2D, prawda? Czy w mojej funkcji renderowania nie są wymagane żadne jednostki wiążące ani aktywujące? Przynajmniej tak to zrozumiałem, ale dostaję niewłaściwe tekstury narysowane w niewłaściwych miejscach.

Ponadto, w jednym z moich programów chcę przełączać się między trzema teksturami dla pojedynczej powierzchni. Więc pomyślałem, że ładuję każdą z tekstur do obiektu, i wiążę każdy z obiektów z jednostką, a następnie w renderowaniu mogę po prostu glUniform powiedzieć programowi, z której jednostki tekstury się korzysta.

Zastanawiam się więc, czy źle zrozumiałem podstawową strukturę teksturowania w OpenGL, czy też powiązania obiektów z jednostkami wygasają po zmianie programów lub coś w tym stylu. Albo czy muszę wielokrotnie wiązać teksturę - ale kiedy i dlaczego?

+1

Wydaje mi się, że masz dobry pomysł, nie widzę wady. Być może mógłbyś podać ** minimalny ** przykład, w którym rysujesz błędne tekstury, abyśmy mogli zobaczyć, czy nie popełniłeś błędu? – Tim

+1

Spojrzałem na to pytanie, gdy miałem podobny problem. Mój problem był spowodowany zmienną statyczną, która nie powinna być statyczna. Pracuję dla systemu iOS i udało mi się go znaleźć za pomocą debuggera OpenGL w Xcode. Nie wiem, czy korzystasz z systemu iOS, ale jeśli dopiero zaczynasz korzystać z samouczków, pomyślałem, że warto zwrócić uwagę na ten debugger: http://developer.apple.com/library/mac/#recipes/ xcode_help-debugger/articles/debugging_opengl_es_frame.html – GingerBreadMane

+0

@Shitesh - czy kiedykolwiek rozwiązałeś swój problem? – nbubis

Odpowiedz

11

Nie zapomnij ustawić glTexParameteri dla każdego obiektu tekstury.

void loadTextures() { 
    GLint texture_object_handles[3]; 
    glGenTextures(3, texture_object_handles); 

    for (int i = 0 ; i < 3 ; ++i) { 
     glActiveTexture(GL_TEXTURE0 + i); 
     glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexImage2D(GL_TEXTURE_2D, ...); 
    } 
    return; 
} 


void draw() { 
    // Draw three different materials without rebinding any textures. 
    for (i = 0 ; i < 3 : ++i) { 
     ... specify other uniforms and attributes 
     glUniform1i(texture_location, i); 
     ... 
     glDrawElements(...); 
    } 
    return; 
}  
+0

Należy zauważyć, że domyślnym ustawieniem dla MAG_FILTER jest GL_LINEAR, więc nie trzeba go ustawiać. – Tim

+0

Dzięki. Zmieniono go, aby przykład był bardziej zwięzły. – umlum

Powiązane problemy