2013-03-29 12 views
11

OpenGL ma a number of functions, które bezpośrednio pobierają wskaźniki. Niektóre z nich to: read data from those pointers, inne write data to those pointers.Kiedy OpenGL kończy pracę ze wskaźnikami w funkcjach?

Jednak funkcje OpenGL często nie są wykonywane natychmiast. Zwykle, gdy coś rysujesz, ukończenie rysunku trwa chwilę.

Skąd mam wiedzieć, kiedy OpenGL jest zakończony ze wskaźnikiem, który podaję?

+2

+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! –

Odpowiedz

11

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).

Powiązane problemy