Autor Wątek: Modyfikacja VBO - zasięg widzenia kamery.  (Przeczytany 2742 razy)

Vipa

  • Gość
# Luty 04, 2010, 16:49:29
Mam VBO z powiedzmy, żeby nie komplikować sprawy, powierzchnią 1000x1000 quadów.
Stożek pola widzenia kamery ograniczyć może ich ilość, która ma zostać wyświetlona.

Pytanie: jak zmodyfikować zawartość VBO tylko do tych widocznych pól? Budowanie VBO co zmiana pola widzenia kamery (a więc praktycznie co ramkę) raczej brzmi idiotycznie.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Luty 04, 2010, 16:54:45
może podzielić VBO na sektory, przed aktualizacją wyliczyć które sektory trzeba zmienić (usunąć nadając wierzchołkom wartości limitowe) i updateować pamięć zajmowaną tylko przez nie. W sumie to logiczne rozwiązanie, nietestowane przeze mnie jeszcze.

Offline Kuba D.

  • Użytkownik

# Luty 04, 2010, 16:56:14
A nie prościej podzielić tę powierzchnię na kilka/kilkanaście vbo ? I renderować tylko te vbo które aktualnie są widoczne.

Offline Dab

  • Moderator
    • blog

# Luty 04, 2010, 17:06:50
Najlepiej trzymać to w jednym buforze i manipulować jedynie indeksami.

Offline _OskaR

  • Użytkownik

# Luty 04, 2010, 17:20:19
Można też obliczyć widoczność w VS, a potem pominąć trójkąt w GS. Im mocniej będzie obciążony FS, tym większy powinien być zysk, choć sporo liczymy w VS, więc lepiej użyć wielu zestawów indeksów.

Offline Dab

  • Moderator
    • blog

# Luty 04, 2010, 17:28:14
To akurat bez sensu, użycie GS zamiast normalnego clippingu na pewno nie pomoże :)

Vipa

  • Gość
# Luty 04, 2010, 17:29:29
A nie prościej podzielić tę powierzchnię na kilka/kilkanaście vbo ? I renderować tylko te vbo które aktualnie są widoczne.
Na to też wpadłem, w ostateczności tak się zrobi.

Najlepiej trzymać to w jednym buforze i manipulować jedynie indeksami.
Mógłbyś rozwinąć?


Wszystko mam już dokładnie wyliczone. Wiem które vertexy, texcoords i normale przekazać, ale nie wiem jak bez budowania VBO od nowa.

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Luty 04, 2010, 17:38:48
Najlepiej trzymać to w jednym buforze i manipulować jedynie indeksami.
Mógłbyś rozwinąć?
Ustawić Verty w VBO tak by były podzielone na sektory :P
Przebadać które są widoczne, potem tylko DrawCall(początek_sektora,koniec_sektora,triangles); razy X, gdzie możesz regulować ilosć wywoałań / ilość geometrii.
Dodatkowo możesz też zrobić  "ynteligentne" wybieranie gdzie, wystarczy że dodasz ilość trójkątów w sektorach + prosty algo. ^^

Offline Dab

  • Moderator
    • blog

# Luty 04, 2010, 17:39:28
Możesz mieć jeden bufor wierzchołków + bufor indeksów podzielony na sektory. Wtedy rysujesz tylko potrzebne sektory.
Możesz też mieć statyczny VB i dynamiczny IB.

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Luty 04, 2010, 17:40:54
Ja dziele teren VBO na czesci i sprawdzam je w frustumie do tego indexuje z odlegloscia (taki niby lod) i sprawdza sie dosc dobrze




Minus Taki Ze jak w polu widzenia znajdzie sie lod wysoki i bardzo niski to czasami sa przeklamania typu złe łaczenia na Tilesetach Terenu
« Ostatnia zmiana: Luty 04, 2010, 17:50:43 wysłana przez .:NOXY:. »

Vipa

  • Gość
# Luty 04, 2010, 17:54:16
Czyli wszystko jasne. Wielkie dzięki.

Offline Kuba D.

  • Użytkownik

# Luty 04, 2010, 18:20:07
@.:NOXY:.
Możesz dopasowywać indeksy dla różnych lod-ów koło siebie ( każdy tiles ma indeksy dla środka i kilka różnych par indeksów dla boków np LOD1->LOD2; LOD1->LOD3 itd, wystarczy tylko sprawdzić jaki LOD ma konkretny sąsiad tilesa i odpowiedni zestaw indeksów wybrać). I nie będzie nieciągłości w geometrii. Albo zastosować tzw "spódniczkę" ;)

Btw. ja po zabawach z renderingiem terenu wybrałem inną ścieżkę. Mianowicie każdy, niezależnie jak skomplikowany teren dzielę na meshe o podobnej liczbie tri, robię do tego odpowiednie meshe o mniejszej szczegółowości ( dopasowywanie łączeń jest łatwiejsze bo ręcznie wszystko da się zrobić, nawet wierzchołki mogą być w innych miejscach dla poprawy wyglądu i spójności ), wszystko w Blenderze. Nie dość, że mam trochę mniej tri ( wierzchołki są tam gdzie powinny być, zależnie od geometrii i ukształtowania terenu a nie tylko dlatego, że jest to siatka równo-odległa), to i oczywiście można zaszaleć z texcoordami, ręcznie ustawianie lokalnych zagęszczeń tekstury np. na stromych zboczach jest znacznie prostsze.
« Ostatnia zmiana: Luty 04, 2010, 18:24:19 wysłana przez Kuba D. »

Offline _OskaR

  • Użytkownik

# Luty 04, 2010, 19:42:17
Możesz dopasowywać indeksy dla różnych lod-ów koło siebie ( każdy tiles ma indeksy dla środka i kilka różnych par indeksów dla boków np LOD1->LOD2; LOD1->LOD3 itd, wystarczy tylko sprawdzić jaki LOD ma konkretny sąsiad tilesa i odpowiedni zestaw indeksów wybrać). I nie będzie nieciągłości w geometrii. Albo zastosować tzw "spódniczkę" ;)
http://ati.amd.com/developer/SIGGRAPH07/Chapter5-Andersson-Terrain_Rendering_in_Frostbite.pdf ;)

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Luty 04, 2010, 20:05:53
Ja dziele teren VBO na czesci i sprawdzam je w frustumie do tego indexuje z odlegloscia (taki niby lod) i sprawdza sie dosc dobrze
Z tych screenów widać, że tak średnio to wychodzi - na drugim screenie w tle masz góry z pojedynczych trójkątów, podczas gdy tuż przy kamerze poświęcasz na oko 7 tysięcy trójkątów na kawałek płaskiej powierzchni. W tym przypadku powinno być chyba odwrotnie, nie? :)

Vipa

  • Gość
# Luty 04, 2010, 21:38:26
Jeszcze odświeżając wątek, zasugerowałem się także tym:
http://www.opengl.org/wiki/Vertex_Specification_Best_Practices#Dynamic_VBO
ostatni akapit.

Działa pięknie, jednakże:
 
  ... obliczanie widzialnych trójkątów (ww to ilość)...
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_vertex);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, ww*sizeof(GL_FLOAT), 0, GL_DYNAMIC_DRAW_ARB);
  glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, ww*sizeof(GL_FLOAT), vertices);
spowodowało znaczny spadek wydajności przy mniejszych powierzchniach. O dziwo przy większych, wzrost wydajności jest zauważalny dość mocno.

Jest to spowodowane czymś konkretnym?