2011-12-20 12 views
6

Zamiast używać glGenTextures(), aby uzyskać nieużywany identyfikator tekstury. Czy mogę losowo wybrać liczbę, powiedzmy 99999 i użyć jej?Czy można użyć losowego identyfikatora tekstury?

będę, oczywiście, zapytań:

glIsTexture(m_texture) 

i upewnij się, że to fałszywy przed kontynuowaniem.

Oto niektóre tła:

Zajmuję się tworzeniem aplikacji pokaz obrazu dla Mac. Podgląd pokazu slajdów jest bezbłędny. Aby zapisać pokaz slajdów, renderuję do operatora FBO. Tworzę kontekst AGL, tworzę teksturę z glGenTextures() i renderuję do bufora ramki. Wszystko w porządku, z wyjątkiem drobnego problemu.

Po zapisaniu pokazu slajdów i powrocie do głównego okna wszystkie moje miniatury obrazów są szare, tzn. Tekstury zostały wyczyszczone.

Zbadałem to i okazało się, że miniatury obrazów i moja struktura FBO mają w pewnym sensie ten sam identyfikator tekstury. Kiedy usuwam teksturę FBO na końcu operacji zapisu pokazu slajdów, tekstury miniaturek są również tracone. To dziwne, ponieważ podczas zapisywania mam kontekst AGL, a główny interfejs ma inny kontekst AGL, prawdopodobnie stworzony w tle przez Core Image i na który nie mam wpływu.

więc moje opcje, jak ja to widzę teraz, jest:

  1. Nie usuwać FBO tekstury.
  2. Losowo wybierz wysoki identyfikator tekstury w nadziei, że główny interfejs nie będzie go używał.

Właściwie czytałem, że niekoniecznie trzeba usunąć teksturę, jeśli usuwa się kontekst AGL OpenGL. Ponieważ usunięcie kontekstu OpenGL powoduje automatyczne usunięcie wszystkich powiązanych tekstur. Czy to prawda? Jeśli tak, opcja 1 ma więcej sensu.

Zdaję sobie sprawę, że zdarzają się zabawne rzeczy, których naprawdę nie potrafię wyjaśnić. Na przykład po zapisaniu pokazu slajdów z obrazem do pliku .mov usuwam kontekst, który został utworzony w tej samej klasie. Z prawej strony nie powinno to wpływać na tekstury utworzone w innym kontekście. Ale tak jest, a ja na poważnie nie mogę tego wyjaśnić.

Odpowiedz

11

Pozwolę sobie najpierw odpowiedzieć na podstawowe pytanie: tak, jest legalne w OpenGL 2.1, aby wybrać dowolną nazwę tekstury i użyć jej jako tekstury. Zauważ, że jest to , a nie legalne w rdzeniu 3.2. Fakt, że OpenGL ARB usunął tę umiejętność, powinien pomóc zilustrować, czy jest to dobry pomysł, czy nie.

Wygląda na to, że natrafiłeś na dziwny błąd. glGenTextures nie powinien nigdy zwracać nazwy tekstury, która jest już używana. Po tym wszystkim jest to, do czego służy. Wygląda na to, że otrzymujesz tekstury, które już są w użyciu. Nie wiem, jak to się dzieje.

Kontekst OpenGL, po zniszczeniu, usunie wszystkie zasoby specyficzne dla tego kontekstu. Jeśli utworzyłeś drugi kontekst, który współużytkuje zasoby z pierwszym, usunięcie drugiego kontekstu spowoduje usunięcie współdzielonych zasobów (tekstur, buforów itp.). Usunie to niepodzielone zasoby (VAO itp.), Ale wszystko inne pozostanie.

Proponuję ciągłe tworzenie i usuwanie tekstury FBO. Po prostu utwórz go podczas uruchamiania aplikacji. W najgorszym przypadku będziesz musiał ponownie przydzielić miejsce na obiekt w razie potrzeby (przez glTexImage2D), jeśli potrzebujesz innego rozmiaru lub czegoś.

+0

Dzięki za odpowiedź. Ręczne przypisanie identyfikatora tekstury nie wchodzi w grę, ponieważ musimy obsługiwać OpenGL 1.4 aż do wersji 3.2. Teraz najlepiej jest nie usuwać tekstury. Przy okazji nie mogę głosować na twoją odpowiedź, ponieważ nie mam wystarczającej liczby punktów. –

+0

@Nicol: Twój drugi akapit wydaje się raczej * niekompletny *. – genpfault

+0

@genpfault: Naprawiono. Dzięki! –

0

Dla każdego, kto ma ten problem, upewnij się, że twój kontekst jest w pełni zainicjalizowany; dopóki nie zostanie zwrócony glGenTextures 0. Nie zdawałem sobie sprawy z tego, co działo się na początku, ponieważ wydaje się, że 0 nadal jest prawidłowym identyfikatorem tekstury.

Powiązane problemy