GlEnableClientState и glDisableClientState OpenGL

В чем смысл glEnableClientState и glDisableClientState в OpenGL? До сих пор я обнаружил, что эти функции включают или отключают некоторые возможности клиентской стороны.

Хорошо, что здесь представляет собой клиент или сервер? Я запускаю свою программу OpenGL на ПК, так что это значит? Почему нам даже нужно отключать определенные возможности?... и более интригует его о какой-то связанной с массивом вещи?

Вся картина очень серая для меня.

Ответы

Ответ 1

Исходная терминология проистекает из нотации X11, где сервер является фактической системой отображения графики:

  • Серверная программа, обеспечивающая доступ к некоторому экранному устройству

и

  • Клиенты, подключающиеся к серверу для рисования на отображаемом устройстве,

glEnableClientState и glDisableClientState установить состояние части клиента. Вершинные массивы раньше располагались в памяти клиентского процесса, поэтому рисование с использованием вершинных массивов было локальным процессом клиента.

Сегодня у нас есть Buffer Objects, которые помещают данные в память сервера, делая континентность всей клиентской терминологии вершинных массивов. Было бы разумно отбрасывать состояния клиента и включать/отключать массивы вершин с помощью обычных функций glEnable/glDisable, например, с объектами фреймбуфера и текстурами.

Ответ 2

Если вы рисуете свою графику, передавая буферы в OpenGL (glVertexPointer() и т.д.) вместо прямых вызовов (glVertex3f()), вам нужно указать OpenGL, какие буферы использовать.

Поэтому вместо вызова glVertex и glNormal вы создадите буферы, привяжите их и используйте glVertexPointer и glNormalPointer, чтобы указать OpenGL на ваши данные. Впоследствии вызов glDrawElements (или тому подобного) будет использовать эти буферы для рисования. Тем не менее, еще один требуемый шаг - сообщить драйверу OpenGL, который буферисты вы действительно хотите использовать, в котором находится glEnableClientState().

Это все очень волнистые руки. Вам нужно прочитать объекты вершинного буфера и попробовать их.

Ответ 3

В терминологии OpenGL клиент - это ваше приложение, а сервер - графическая карта (или драйвер), я думаю. Единственными возможностями на стороне клиента являются массивы вершин, поскольку они хранятся в памяти ЦП и, следовательно, на стороне клиента или, более конкретно, они управляются (распределяются и освобождаются) вашим приложением, а не драйвером.

Объекты буфера Vertex - это другая история. Они могут использоваться как массивы вершин, но контролируются драйвером, поэтому слово "состояние клиента" больше не имеет большого смысла при работе с буферами.