Wszystkie funkcje OpenGL, z wyjątkiem opisanym poniżej, zostaną zakończone przy pomocy dowolnego wskaźnika, który zostanie nadany po powrocie tej funkcji. Tak więc glReadPixels
zakończy po odczytaniu wszystkich odczytów pikseli i konwersji formatu. Właśnie dlatego asynchronous pixel transfer jest tak ważny dla operacji czytania. Pozwala to OpenGL na nie zrobić, aby nie synchronizować się z GPU.
Jedynym wyjątkiem od tej reguły jest każda funkcja, która kończy się słowem "wskaźnik". Rzeczy takie jak glVertexAttribPointer
, glTexCoordPointer
i podobne. Kiedy używasz pamięci po stronie klienta z tymi funkcjami (nie są już legalne w podstawowym profilu OpenGL 3.2+), te funkcje przechowują wskaźnik do tej pamięci. Dlatego należy upewnić się, że wskaźnik ten jest ważny tak długo, jak zamierzasz renderować za pomocą tych atrybutów wierzchołków.
Po każdym wywołaniu renderowania za pomocą pamięci klienckiej, OpenGL wymaga, aby implementacja zakończyła odczyt z pamięci klienta do czasu powrotu funkcji renderowania. Możesz więc zadzwonić pod numer glDrawArrays
, a następnie usunąć wskazane wskaźniki. I dopóki nie wykonasz kolejnego połączenia, dopóki nie zmienisz tych wskaźników, wszystko jest w porządku. Oznacza to, że OpenGL musiał skopiować wszystkie istotne dane werteksów do czasu powrotu wywołania renderującego (jeden z powodów, dla których użycie obiektów buforowych jest szybsze).
+1 Za inicjatywę opublikowania pary pytań i odpowiedzi wyłącznie w celach edukacyjnych. Sam się tym interesowałem i miło jest mieć konkretne referencje na wypadek, gdyby potrzebowałem odświeżenia. Kontynuuj dobrą pracę Nicol! –