Поделиться через


Указание обратных вызовов

Для тесселяции можно указать до пяти функций обратного вызова. Все функции, которые не указываются, не вызываются во время тесселяции, и вы не получаете никакой информации, которую они могли вернуть. Вы указываете функции обратного вызова с помощью gluTessCallback.

Функция gluTessCallback связывает функцию обратного вызова с объектом tessellation tessobj. Тип обратного вызова определяется типом параметра, который может быть GLU_BEGIN, GLU_EDGE_FLAG, GLU_VERTEX, GLU_END или GLU_ERROR. Пять возможных функций обратного вызова имеют следующие прототипы.

Функция обратного вызова Прототип
GLU_BEGIN void begin(тип GLenum);
GLU_EDGE_FLAG void edgeFlag(GLbooleanflag );
GLU_VERTEX void vertex(*void **void **data );
GLU_END void end(void);
GLU_ERROR ошибка void(GLenumerrno );

 

Чтобы изменить функцию обратного вызова, вызовите gluTesSCallback с новой функцией. Чтобы исключить функцию обратного вызова, не заменив ее новым, передайте в gluTessCallback пустой указатель для соответствующей функции.

По мере продолжения тесселяции функции обратного вызова вызываются таким образом, как вы будете использовать функции OpenGL glBegin, glEdgeFlag, glVertex и glEnd.

Функция обратного вызова GLU_BEGIN вызывается одним из трех возможных параметров:

  • GL_TRIANGLE_FAN
  • GL_TRIANGLE_STRIP
  • GL_TRIANGLES

После вызова функции обратного вызова GLU_BEGIN и перед вызовом функции обратного вызова, связанной с GLU_END, вызывается некоторая комбинация GLU_EDGE_FLAG и GLU_VERTEX обратных вызовов. Связанные вершины и пограничные флаги интерпретируются точно так же, как они находятся в OpenGL между glBegin(GL_TRIANGLE_FAN), glBegin(GL_TRIANGLE_STRIP), или glBegin(GL_TRIANGLES**)** и соответствующим glEnd.

Поскольку флаги края не имеют смысла в вентиляторе треугольника или полосе треугольников, если есть функция обратного вызова, связанная с GLU_EDGE_FLAG, обратный вызов GLU_BEGIN вызывается только с GL_TRIANGLES. Функция обратного вызова GLU_EDGE_FLAG работает аналогично функции OpenGL glEdgeFlag .

Если во время тесселяции возникает ошибка, вызывается функция обратного вызова ошибки. Функция обратного вызова ошибки передается номер ошибки GLU. Вы можете получить символьную строку, описывающую ошибку с помощью функции gluErrorString.