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?
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
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
@Shitesh - czy kiedykolwiek rozwiązałeś swój problem? – nbubis