- Ile vbos powinienem użyć?
Tak mało jak to możliwe. Przełączanie VBO ma niewielki, ale mierzalny koszt. Ogólnie spróbujesz pogrupować podobne dane w VBO. Na przykład w grze FPS wszystkie rodzaje śmieci leżące na ulicy, małe rekwizyty itp. Będą zwykle znajdować się w tej samej lub tylko niewielkiej liczbie VBO.
Sprowadza się również do rysowania wielkości partii. glDraw…
wywołania, które renderują mniej niż około 100 prymitywów są nieoptymalne (tak było zawsze, nawet 15 lat temu). Więc jeśli to możliwe, chcesz wsadowo co najmniej 100 prymitywów. Ale jeśli pojedyncza siatka ma tylko, powiedzmy 20 trójkątów (niskie rekordy polikountu dla instancji lub inne), każdy w swoim własnym VBO nie może dłużej wsadać więcej.
glGenBuffers → glBindBuffer → glBufferData
UPDATE można przekazać null wskaźnik do parametru glBufferData data
zainicjować obiekt bufora bez ustawiania danych.
- Jak zaktualizować dane vbos, jeżeli wielkość danych nie jest ustalona?
Tworzenie VBOs z grubszej ziarnistości rozmiarze niż rozmiar danych jest. Twój system operacyjny robi to mimo to dla danych twojego hosta, nazywa się to stronicowaniem. Również jeśli chcesz użyć obiektu glMapBuffer tworząc obiekt bufora, wielość rozmiaru strony hosta jest bardzo dobra dla całego systemu.
Zwykły rozmiar strony w obecnych systemach wynosi 4kiB. Tak więc wybrałem ziarnistość VBO. AKTUALIZACJA: Możesz zapytać BTW systemu operacyjnego, jakiego rozmiaru strony używa. To zależy od systemu operacyjnego, chciałbym zadać na to jeszcze jedno pytanie.
Zaktualizuj dane za pomocą glBufferSubData lub zmapuj je za pomocą glMapBuffer, modyfikuj pamięć zmapowaną po stronie hosta, a następnie glUnmapBuffer.
Jeśli dane wyrastają z bufora, utwórz nowy, większy i skopiuj za pomocą glCopyBufferSubData. Zobacz akapit lase.
- Jak powinienem renderować vbos?
glBindBuffer → glDraw ...
- Jak należy sobie radzić z danymi vbos że nie chcę, aby uczynić więcej?
Jeśli dane zużywa tylko część VBO i akcji z innymi danymi i nie jesteś na wyczerpaniu pamięci wtedy, cóż, po prostu nie do niego dostęp. Najlepiej trzymać się jakiegoś indeksu, w którym będziesz śledzić, które VBO ma, które części są dostępne dla jakiego rodzaju zadania. Jest to bardzo podobne do zarządzania pamięcią, a konkretnie do schematu zwanego stosami obiektów (warstwami).
Jednak może okazać się sensowne kompaktowanie istniejącego obiektu buforowego. W tym celu utworzysz nowy obiekt bufora, wiążąc go jako cel zapisu, ze starym obiektem buforowym wybranym jako cel do odczytu. Następnie użyj polecenia glCopyBufferSubData, aby skopiować zawartość do nowego, zaostrzonego obiektu buforowego. Oczywiście będziesz musiał zaktualizować wszystkie odniesienia do nazwy obiektu buforowego (= ID OpenGL) i przesunięć.
Z tego powodu sensowne jest napisanie cienkiej warstwy abstrakcji na wierzchu obiektów bufora OpenGL, który śledzi rzeczywiste wpisane dane w obiektach bez przezroczystych obiektów OpenGL.
Nie ma prawidłowej odpowiedzi na wiele pytań. Wszelkie takie odpowiedzi będą specyficzne dla sprzętu. –