Używam OpenGL
do zaimplementowania pewnego rodzaju partii rysunku. W tym celu tworzę vertex buffer
do przechowywania danych.OpenGL. Aktualizowanie bufora wierzchołków za pomocą glBufferData
Uwaga: ten bufor zazwyczaj będzie aktualizowany na każdej klatce, ale nigdy nie zmniejszy rozmiaru (ale nadal może wzrosnąć).
Moje pytanie brzmi: czy technicznie poprawne jest użycie glBufferData
(z s treaming write-only mode
) do aktualizacji (zamiast np. glMapBuffer
)? Przypuszczam, że nie ma potrzeby mapowania, ponieważ pełne dane są aktualizowane, więc po prostu wysyłam pełny pakiet na raz. A jeśli bieżący rozmiar bufora jest mniejszy niż wysyłam, automatycznie wzrośnie, prawda? Jestem po prostu pewny, jak to działa naprawdę (może będzie odtworzyć bufor przy każdym wywołaniu, nie?).
Dziękuję za odpowiedź! Ale to było trochę inaczej: niemożliwe jest stworzenie bufora o maksymalnym rozmiarze. Ale prawdopodobieństwo zmiany jego rozmiaru jest niewiarygodnie niskie, więc to teraz problem. Jeśli chodzi o zakresy rysunku - to właśnie teraz robię. Ale czy mogę zadać pytanie o twoją drugą opcję (aby zaktualizować tylko zakres wersetów): w tym przypadku zawsze mam moje dane przechowywane w ciągłym bloku (na CPU), tak żebym mógł po prostu zaktualizować bufor z tym samym glBufferData , ale o mniejszym rozmiarze - ten sam wynik? Czy nie zrujnuje bufora ani nie odtwarza go? Dziękujemy – Celestis
Na pewno uzyskasz lepszą wydajność pomiędzy procesorem graficznym a procesorem, usuwając bufor z każdej klatki i tworząc nowy? Czy aktualizacja bufora, który może być w użyciu, nie spowoduje potencjalnego zablokowania, jeśli GPU aktualnie go używa? – Robinson
Oto kilka interesujących linków: http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html, istnieje również funkcja glMapBufferRange, która może pomóc. – fen