Если program содержит шейдерные объекты типа GLJ/ERTEX_SHADER_ARB, но не содержит объектов типа GL_FRAGMENT_SHADER_ARB, выполняемый модуль будет установлен только на вершинном процессоре, а для фрагментного будет использоваться стандартная функциональность. Точно так же, если program содержит шейдерные объекты типа GL_FRAGMENT_SHADER_ARB, но не содержит объектов типа 6L_VERTEX SHADER_ARB, выполняемый модуль будет установлен только на фрагментном процессоре, а для вершинного будет использоваться стандартная функциональность. Если program - 0, программируемые процессоры не используются, а вершины и фрагменты будут обрабатываться стандартным способом.

Успешная установка выполняемого модуля на программируемом процессоре автоматически блокирует соответствующую стандартную функциональность. Если выполняемый модуль устанавливается на вершинном процессоре, блокируется функциональность, описанная в разделе 4.1. Если выполняемый модуль устанавливается на фрагментном процессоре, блокируется функциональность, описанная в разделе 4.2.

После установки программного объекта можно изменять, компилировать, отсоединять присоединенные шейдерные объекты или присоединять новые, удалять любые шейдерные объекты или даже программный объект, и все это не повлияет на выполняемые модули. Но повторная компоновка в случае, если она прошла успешно, переустановит эти программы. После установки программного объекта можно работать с любыми состояниями OpenGL, влияющими на блокированную стандартную функциональность.

7.4. Удаление данных

Если объекты больше не нужны, их необходимо удалять. Это можно сделать функцией

void glDeleteObjectARB(GLhandleARB object)

Эта функция освобождает память и делает недействительным идентификатор объекта object, Она аннулирует объекты, созданные функциями gl Creates hader Ob jectARB или gl CreateProgramOb jectARB, Если удаляемый шейдерный объект присоединен к программному объекту, он будет отмечен для удаления, но не удален до тех пор, пока не отсоединится от всех программных объектов, к которым он был присоединен. А если удаляемый программный объект имеет присоединенные шейдерные объекты, они автоматически отсоединяются, но не удаляются (если только они не были ранее отмечены для удаления функцией gl DeleteObjectARB), Чтобы определить, помечен ли какой-либо объект для удаления, можно вызвать glGetObjectParameterARB с аргументами object и GL_OBJECT_DEL£TE_STATLIS_AR0, Шейдерный объект отсоединяется от программного объекта функцией void glDetachObjectARB(GLhandleARB program. GLhandleARB shader)

Ею программируется отсоединение шейдерного объекта shader от программного объекта program. Эта команда отменяет действие ранее выполненной команды glAttachObjectARB.

Интересный программный прием, связанный с удалением объектов, состоит в том, чтобы удалять шейдерные объекты сразу же после присоединения их к программному. Тогда они не будут удаляться сразу, но будут помечены для удаления, и чтобы удалить все их сразу, нужно будет всего лишь удалить программный объект, к которому они присоединены. Тогда все шейдерные объекты будут автоматически отсоединены и удалены.


⇐ вернуться назад | | далее ⇒