Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Контекст воспроизведения OpenGL. Связь контекстов



Контекст воспроизведения OpenGL чем-то напоминает контекст устройства Windows, но не является тем же самым. Контекст воспроизведения OpenGL является машиной состояний и хранит в себе текущие параметры воспроизведения. Для того чтобы рисовать в окне Windows, мы должны сначала запросить у системы контекст устройства (т.е. окна), который связан с конкретным устройством, на котором осуществляется рисование (т.е. окно, но может быть и не окном). Далее нужно создать контекст воспроизведения OpenGL, который необходимо связать с контекстом устройства в Windows, а потом выбрать его, т.е. сделать текущим. Зачем делать его текущим? Дело в том, что можно создать много контекстов воспроизведения, каждый из них будет связан со своим устройством отображения, но для того чтобы работать в OpenGL, надо выбрать только один (текущий) контекст. На следующем рисунке, это выражено понятнее:

 

На рисунке показан текущий поток (верхние блоки), т.е. путь по которому осуществляется визуализация. Этот путь можно описать следующим образом: команды, вырабатываемые конвейером OpenGL, поступают через контекст воспроизведения OpenGL дальше по цепочке, а контекст OpenGL запоминает изменения.

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

Переходим теперь к практической части. То есть к программированию под Windows. В распоряжения программиста предоставлено несколько команд для управления контекстами воспроизведения. Сначала необходимо создать контекст воспроизведения, делает это функция:

 

HGLRC wglCreateContext (HDC hdc);

 

Эта функция создаёт новый контекст воспроизведения OpenGL, который подходит для рисования на устройстве, определённом дескриптором hdc. В случае успешного завершения функция возвращает дескриптор созданного контекста воспроизведения, в случае неудачи возвращает значение NULL.

Следующая функция позволяет выбрать текущий контекст воспроизведения для потока воспроизведения. Если контекстов создано несколько, то надо выбрать один из них. Функция выглядит таким образом:

BOOL wglMakeCurrent (HDC hdc, HGLRC hglrc);

 

Контекст устройства задаётся параметром hdc, контекст воспроизведения OpenGL - параметром hglrc. Если функция выполняется успешно, то она возвратит TRUE, в противном случае возвратит FALSE.

Есть ещё две функции, которые носят информационный характер. Первая из них:

 

HGLRC wglGetCurrentContext (VOID);

 

Она возвращает дескриптор текущего контекста воспроизведения или NULL, если такового не существует. Другая функция позволяет получить контекст устройства, который ассоциирован с текущим контекстом воспроизведения:

HDC wglGetCurrentDC (VOID);

 

В случае успешного завершения (если в потоке существует контекст воспроизведения) функция возвратит контекст устройства, связанного с ним или NULL, в противном случае.

 

И ещё одна функция, которую в основном вызывают в конце работы с OpenGL:

 

BOOL wglDeleteContext (HGLRC hglrc);

 

Эта функция удаляет контекст воспроизведения. Необходимо также позаботиться об удалении контекста устройства Windows, связанного с этим контекстом воспроизведения, это делается Windows функцией:

BOOL DeleteDC (HDC hdc);

 

В случае успешного завершения функция wglDeleteContext возвращает TRUE, в противном же случае - FALSE.

 

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

Формат пикселя

Самым главным этапом в инициализации OpenGL под Windows является заполнение информации о формате пикселей. Таким образом, вы извещаете операционную систему о том, какую поверхность для вывода OpenGL информации конкретно вы хотите иметь. Здесь указывается такая информация как глубина цвета, различные флаги поверхности (двойная или одинарная буферизация), и т.д. Вся эта информация представляется в специальной структуре, которая называется PIXELFORMATDESCRIPTOR.

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

 

int ChoosePixelFormat (HDC hdc, CONST PIXELFORMATDESCRIPTOR *ppfd);

 

Как уже было сказано, функция просматривает в контексте устройства - hdc наиболее подходящий формат пикселей и выбирает его, ppfd - это указатель на нашу структуру. В случае успешного завершения функция возвращает индекс формата пикселей (значение начиная с 1) или возвращает 0 - в случае ошибки.

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

 

BOOL SetPixelFormat (HDC hdc, int iPixelFormat, CONST PIXELFORMATDESCRIPTOR *ppfd);

 

Параметры функции: hdc - контекст устройства, для которого устанавливается данный формат пикселей, iPixelFormat - индекс, который получен при помощи предыдущей функции, ppfd - указатель на структуру PIXELFORMATDESCRIPTOR, которая содержит логическую спецификацию формата пикселей, и эта структура никак не действует на функцию SetPixelFormat. В случае успеха функция возвратит TRUE, в случае неудачи - FALSE.

Существуют ещё функции, которые предоставляют информацию о формате пикселей для контекста устройства.

 

int GetPixelFormat (HDC hdc);

 

Функция возвращает текущий формат пикселей для контекста устройства hdc, т.е. возвращает значение больше 0, если произошла ошибка, функция возвратит 0.

10. Архитектура и синтаксис команд.(км)


Поделиться:



Популярное:

  1. IDEF1X - методология моделирования данных, основанная на семантике, т.е. на трактовке данных в контексте их взаимосвязи с другими данными.
  2. Автоматическая телеграфная связь
  3. Анатомия глотки. Физиология воспроизведения голоса. Резонаторная функция.
  4. Б. Напряженность и потенциал электростатического поля и связь между ними. Принцип суперпозиции
  5. Беременность в культурном контексте
  6. Билет 7 Внутренняя структура процесса обучения как взаимосвязь преподавания и учения
  7. БОБ НИКОГДА НЕ УСТАНАВЛИВАЛ СВЯЗЬ
  8. Большое значение для успешного развития художника имеет неразрывная связь теории с практикой в течение всей его изобразительной деятельности.
  9. Взаимная связь стихийных явлений.
  10. Взаимодействие права и политики / Взаимосвязь политики и права
  11. Взаимосвязь биологических и социальных факторов в психическом развитии личности
  12. Взаимосвязь внутренней и внешней политики государства


Последнее изменение этой страницы: 2017-03-03; Просмотров: 1717; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.013 с.)
Главная | Случайная страница | Обратная связь