Istnieje kilka aspektów tego problemu. Po pierwsze, jak rysujesz swoje 10000 bloków? Czy rysujesz je jako 10000 oddzielnych obiektów? Jeśli tak, to prawie na pewno twoja szyjka butelki, a nie brak wybijania okluzji. Powinieneś pogrupować te bloki w mniejszą liczbę oczek (być może kilka tysięcy na siatkę), aby zmniejszyć liczbę wywołań rysunkowych.
Jeśli chodzi o twoje aktualne pytanie, istnieją trzy rodzaje eliminacji okluzji, które przychodzą na myśl.
1) Bloki poza widokiem frustum. Oznacza to bloki, które są za tobą lub dwie z boku. Ogre już je usuwa poprzez ubijanie widoku frustum.
2) Bloki, które są „pod ziemią” lub całkowicie otoczone innymi blokami, dzięki czemu nie można ich zobaczyć pod żadnym kątem. Możesz je zidentyfikować, patrząc na sąsiednie bloki siz. Jeśli wszystkie są solidne, blok jest ukryty. GPU nigdy nie powinna nawet słyszeć o tych blokach - należy je pominąć, gdy budujesz siatkę reprezentującą twoją powierzchnię.
3) Bloki znajdujące się na powierzchni i widoczne z niektórych pozycji na poziomie, ale obecnie ukryte przez wzgórze (lub coś w tym rodzaju). Jest to najtrudniejszy przypadek, do którego sam się nie odniosłem, ale istnieje duża szansa, że w tym przypadku można zastosować zapytania dotyczące okluzji sprzętu.
Jest to bezwstydna wtyczka, ale mam dość dojrzałą bibliotekę, z której korzysta kilka osób do tworzenia klonów Minecraft, w tym niektóre wykorzystujące Ogre. Definiujesz zawartość objętości, która generuje siatkę powierzchni, którą możesz następnie renderować. Oto strona główna:
http://www.thermite3d.org/
A oto film przedstawiający projekt, który go używa:
http://www.youtube.com/watch?v=Jju6WRPEK7o
Jeśli masz 10000 oddzielnych obiektów, wąskim gardłem jest prawdopodobnie liczba pierwotna, a nie wierzchołek, wielokąt lub wypełnienie. Upiecz swoje obiekty w mniejszą liczbę obiektów o wyższych wielokątach, aby zwiększyć szybkość.
Minecraft ma pojęcie bloków kostek, ale w tej chwili nie mogę znaleźć odniesienia.
Oto moje eksperymenty na rysowaniu ton kostek różnymi technikami. Nie obejmuje pieczenia (jeszcze).
źródło
To, co robię, jest po utworzeniu mojej tablicy bloków, ale zanim utworzę wierzchołki, uruchamiam sub o nazwie UpdateBlockVisiblility.
Okręt podwodny po prostu sprawdza sąsiadów bloku i odpowiednio aktualizuje widoczną wartość logiczną bloków.
Następnie tworzę wierzchołki tylko dla twarzy, jeśli jest ona widoczna! Prosty :)
źródło