2012-01-29 9 views
9

Mamy opracować scenę przewijania/powiększania w OpenGL ES na Androida, bardzo podobną do poziomu w Angry Birds, ale bardziej przypominającą poziom w World Of Goo. Bardziej jak ten drugi, ponieważ świat nie będzie składał się z powtarzających się warstw, jak w Angry Birds, ale o dużym obrazie. Ponieważ scena musi przewijać/powiększać i dlatego wiele z nich nie będzie widocznych, zastanawiałem się nad najbardziej efektywnym sposobem implementacji renderowania, skupiając się wyłącznie na środowisku (tj. Nie na obiektach na świecie, ale na warstwach tła).Przewijanie/powiększanie sceny w OpenGL i poddziale

Będziemy używać rzutowania ortograficznego.

Pierwszą rzeczą, która przychodzi do głowy, jest utworzenie dużego 4 prostokątnego prostokąta w rozmiarze światowym, który ma przypisaną do niego teksturę tła i tłumaczenie/skalowanie za pomocą glTranslatef/glScalef. Zastanawiałem się jednak, czy niewidoczny obszar poza granicami ekranów nadal jest renderowany przez OpenGL, ponieważ nie jest on wybierany (utracisz widoczny obszar, a są tylko 4 wierzchołki). Czy zatem bardziej efektywne byłoby dzielenie tego prostokąta, aby można było usunąć niewidoczne mniejsze prostokąty?

Inną opcją byłoby utworzenie 4 prostokątnego prostokąta, który wypełniłby ekran, a następnie przesunięcie tła poprzez dostosowanie jego współrzędnych tekstury. Sądzę jednak, że napotkalibyśmy problemy podczas budowania większych światów, biorąc pod uwagę limit rozmiaru tekstury. Wydaje się, że jest to fajna implementacja dla powtarzających się środowisk, takich jak AngryBirds.

Może jest inny sposób ..?

Jeśli ktoś ma pomysł na temat tego, jak można to zrobić w Angry Birds/World of Goo, prosimy o podzielenie się z nimi, co chciałbym usłyszeć. Wydaje się, że zaimplementowali system, który pozwala na płynne przesuwanie i powiększanie świata (WorldOfGoo = VERY).

+0

Właściwie uważam, że celem uboju jest wysłanie mniejszej liczby wierzchołków do potoku grafiki. Jeśli podzielisz zbyt dużo prostokąta, będziesz wysyłać więcej wierzchołków. Ogólnie rzecz biorąc, procesor graficzny powinien dobrze znać klipy - to część przetwarzania. – Jake

Odpowiedz

2

Jest to prawdopodobnie Twój najlepszy zakład na implementation.

Z mojego doświadczenia wynika, że ​​zachowanie dużej ilości tekstury w pamięci jest bardzo drogie na Androida. Dostałbym kilka wyjątków OutOfMemoryError dla tekstury tła, zanim przeniosłem się do kafelkowania.

Myślę, że największym wąskim gardłem renderowania będzie szybkość transferu i szybkość wypełniania zamiast obliczeń graficznych.

Edit: Wyjazd 53:28 tego presentation z Google I/O 2009

+1

Jesteś tego pewien? Na przykład. drugi akapit 10.040 FAQ OpenGL (http://www.opengl.org/resources/faq/technical/clipping.htm) otwiera się słowami "Kiedy prymityw leży częściowo poza oknem, często przekracza granicę objętości widoku. OpenGL musi przypiąć dowolny prymityw, który przekracza granicę woluminu widoku. " – Tommy

+0

Nie jestem pewien, teraz go przywołasz. Nigdy nie polegałam na OpenGL, aby wykonać obcinanie. Zrobię edycję. – Jasoneer

+0

Ale to oznaczałoby dużo wiązania tekstur. To jedna z najdroższych operacji w OpenGL, prawda? –

0

Mogłeś prostokąt podzielony na mniejsze prostokąty tła, tak że OpenGL renderuje tylko widocznych prostokątów. Nie będziesz mieć dużego prostokąta z dużą ładownością, ale zmniejszysz prostokąty z mniejszymi teksturami, które możesz załadować/rozładować, w zależności od tego, co jest widoczne na ekranie ...

0

Afaik nie będzie spadku wydajności z powodu w przypadku dużych obszarów renderowanych poza ekranem, dzielenie i usuwanie jest zwykle wykonywane tylko po to, aby zmniejszyć liczbę wierzchołków, ale w rzeczywistości dodawałbyś go tutaj.

Odkładając to na bok; ze sposobu, w jaki sformułowałeś pytanie, nie jestem pewien, czy masz dużą teksturę tła, czy małą powtarzającą się. Jeśli jest duży, to i tak będziesz musiał dokonać podziału ze względu na ograniczenia rozmiaru tekstury, więc pytanie jest dyskusyjne! Jeśli jest mały, sugerowałbym drugą metodę, dopasować quad do ekranu i przesunąć tło, zmieniając współrzędne tekstury.

Czuję, że mogłem coś przeoczyć, ponieważ nie jestem pewien, dlaczego wspomniałeś o problemie z ograniczeniem rozmiaru tekstury, gdy mówisz o metodzie współrzędnych tekstury, a nie o dużej quadzie. Z pewnością dla obu nie jest to problem dla powtarzając tekstury jak można użyć trybu struktura opasania GL_REPEAT ...

Ale zarówno ona jest problem dla jednej dużej tekstury chyba podziału, który może sprawić, że współrzędna tekstury taktyka jest bardziej skomplikowana niż to konieczne. W tym przypadku najlepiej byłoby podzielić siatkę wzdłuż podziałów tekstur, a także oddzielić sekcje poza ekranem. Podejmowanie decyzji o tym, które części do uboju powinno być trywialne przy użyciu tej techniki.

Pozdrawiam.