Как известно, OpenGL в чистом виде обладает довольно ограниченными возможностями по сравнению, например, с DirectX. Так, в нем нет средств для работы с внеэкранными поверхностями, шейдерами и многого другого. Но зато с самого начала OpenGL обладал открытой архитектурой, которая заключается в поддержке расширений.
Если производитель обнаруживал, что OpenGL не может использовать все аппаратные возможности его "железа", он выпускал расширение для OpenGL с поддержкой новых возможностей. Причем это расширение, как правило, появлялось почти на год раньше, чем новая версия DirectX, поддерживающая новые возможности. Так, поддержка вершинных и пиксельных шейдеров для GeForce2 в OpenGL появилась намного раньше 8-й версии DirectX. А когда DirectX 8 все-таки вышел, то выяснилось, что про пиксельные шейдеры GeForce2 он ничего не знает:
Наряду с достоинствами этот подход имеет и недостатки — расширения OpenGL разных производителей часто несовместимы друг с другом, даже когда они выполняют одинаковые функции. Это становится настоящей головной болью, когда программа должна поддерживать большое количество разных видеокарт. С другой стороны, существует множество стандартных расширений, которые поддерживают практически все видеокарты (разумеется, при наличии аппаратной поддержки). Названия этих расширений обычно начинаются с GL_ARB, GL_EXT и GL_SGIS.
В этой статье я собираюсь рассмотреть использование OpenGL-расширений корпорации NVIDIA, но везде, где будет выбор между расширениями NVIDIA (GL_NV) и стандартными расширениями, выполняющими одинаковые функции, предпочтение будет отдаваться последним.
Для выполнения всех примеров вам потребуются Microsoft Visual C++ 6 и NVIDIA OpenGL SDK, который можно скачать с www.nvidia.com. В составе этого SDK имеется NVIDIA OpenGL Extension Specification, в котором описаны большинство расширений, которые поддерживаются NVIDIA.
Перед тем, как использовать любое OpenGL-расширение, его надо инициализировать. Для начала рассмотрим инициализацию WGL-расширений. Этот класс расширений предназначен для инициализации OpenGL в ОС семейства Windows, а также для выполнения некоторых функций, которые зависят от используемой операционной системы – например, работа со внеэкранными поверхностями (буферами пикселей). В приведенном ниже примере показывается, как проверить поддержку двух расширений WGL_ARB_pixel_format и WGL_ARB_pbuffer и подготовить их к использованию. Этот и все остальные примеры из статьи полностью можно скачать.
Для начала не забудьте настроить Visual C++ для работы с NVSDK (пропишите пути к включаемым файлам и библиотекам). Теперь создайте новый проект и настройте его для работы с OpenGL (подключите библиотеки opengl.lib, glu32.lib, glut32.lib, установите точку входа mainCRTStartup и т.д.)
Напишите простейшее GLUT-приложение, создающее окно:
Не забудьте директивой #include подключить заголовочные файлы glext.h (замена gl.h) и wglext.h. Перед началом работы с WGL-расширениями надо проверить поддержку расширения WGL_ARB_extensions_string, при помощи которого осуществляется инициализация остальных WGL-расширений.
Для это мы объявляем переменную, которая является указателем на функцию wglGetExtensionsStringARB. Обратите внимание, что название типа функции начинается с префикса PFN, далее идет название расширения, а затем окончание ARBPROC (в случае расширений ARB):
Теперь надо получить адрес этой функции. Для этого используется функция wglGetProcAddress. В качества параметра она принимает строку, содержащую название функции, адрес которой надо получить:
В случае удачного вызова она возвращает адрес функции, иначе – NULL.
Теперь при помощи этой функции можно получить список всех WGL-расширений, которые поддерживает данная платформа. Для этого следует вызвать эту функцию, передав ей в качестве параметра контекст текущего устройства WGL. Функция возвращает строку, оканчивающуюся нулем и содержащую список поддерживаемых WGL-расширений, разделенных пробелами. После этого проверим, поддерживаются ли требуемые нам расширения. Для этого можно использовать функцию strstr:
Если все прошло удачно, то, используя функцию wglGetProcAddress, можно получить адреса точек входа нужных нам функций:
Как видно, инициализировать WGL-расширения непосредственно через OpenGL API довольно неудобно, особенно если надо подключить больше десятка различных расширений, каждое из которых содержит больше десятка функций. Но в NV >
В этом случае, инициализировать все необходимые расширения можно с помощью одной функции glh_init_extensions, которой передается список необходимых расширений, разделенных пробелами. В случае успешного завершения функция возвращает True. В противном случае, используя функцию glh_get_unsupported_extensions(), можно получить список неподдерживаемых расширений:
Это все! Теперь вы можете вызывать функции указанных расширений как обычные функции.
В принципе, инициализация GL-расширений должна была выполняться очень просто, путем включения в проект файла glext.h. Но на практике это не так. Причина этого кроется в том, что файл opengl.lib, поставляемый с Visual C++ 6, не содержит функций GL-расширений (если бы он их содержал, программа бы отказывалась запускаться на видеокартах, драйверы которых не полностью поддерживают все GL-расширения).
Поэтому инициализация GL-расширений выполняется аналогично инициализации WGL-расширений с единственным отличием – для получения списка GL-расширений используется функция glGetString(GL_EXTENSIONS).
Если же вы используете NVIDIA OpenGL Helper Library, то никакой разницы в инициализации GL и WGL расширений нет – функция glh_init_extensions умеет инициализировать оба вида расширений.
Использование расширений OpenGL на примере GL_EXT_separate_specular_color
Рассмотрим небольшую программу, которая рисует на экране вращающийся чайник с нанесенной текстурой. Клавишей F1 можно включать/выключать вращение. При нажатой левой кнопке мыши можно вращать чайник, а при правой – перемещать. Клавишей F2 можно сменить плоскость, в которой перемещается чайник.
Текстура чайника хранится в файле wood.tga. Для его загрузки используется библиотека NV_UTIL из состава NVSDK, которая содержит множество процедур для работы с наиболее распространенными графическими форматами. Перед использованием этой библиотеки нужно подключить к проекту библиотеку nv_util.lib.
Функции для работы с файлами формата TGA находятся в файле nv_tga.h в пространстве имен tga. Следовательно, для доступа к ним надо использовать либо директиву using namespace tga, либо указывать перед названием функций и типов этой библиотеки префикс tga.
Загрузка файла в память осуществляется функцией tga::read, которой передается имя файла. Функция возвращает указатель на структуру tga::tgaImage. Нас интересуют следующие поля структуры:
· GLsizei width – ширина рисунка;
· GLsizei height – высота рисунка;
· GLubyte *pixels – указатель на массив пикселей;
· GLenum format – формат пикселей рисунка.
Помните, что эта функция возвращает указатель, поэтому не забывайте удалять его, когда информация станет ненужной. Иначе вы в скором времени столкнетесь с большой утечкой памяти (особенно при работе с текстурами большого размера).
Хотя в примерах NVSDK это нигде не показано, я считаю, что перед удалением указателя надо удалить из памяти еще и указатель на массив пикселей (pixels), иначе он останется находится в памяти до окончания работы программы.
Теперь можно использовать эту информацию для создания текстуры.
Рисунок 1.
Как видно из рис. 1, на экране отсутствуют блики. Это связано с тем, что при наложении текстуры для каждой точки на основе материала и источника цвета рассчитывается результирующий цвет, а потом на него накладывается текстура. Так как у нас диффузный цвет материала и блика совпадают, то блика просто не видно – он сливается с цветом материала, а затем на получившейся цвет накладывается текстура.
Но что делать, если надо получить блик именно белого цвета на деревянном чайнике. Одно из решений проблемы – наложение текстуры на чайник в 2 прохода. Сначала мы рисуем чайник с наложенной текстурой с отключенными бликами, а затем, на втором проходе, рисуем блики без текстуры. Пример реализации этого алгоритма можно найти в книге М. Красного "OpenGL. Графика в проектах Delphi" (глава 4, пример 83).
Однако самый оптимальный способ – использовать расширение GL_EXT_separate_specular_color, которое позволяет использовать новую модель освещения: SPEPARATE_SPECULAR_COLOR_EXT. В этом случае цвета вычисляются по другому алгоритму: сначала рассчитывается цвет материала без учета бликов, затем на полученный цвет накладывается текстура. После этого на результирующий цвет накладываются блики.
Для того чтобы заставить программу использовать эту модель освещения, в нее достаточно добавить всего несколько строк.
Прежде всего в процедуру Init() добавим инициализацию расширения и сроку для включения режима освещения GL_SEPARATE_SPECULAR_COLOR_EXT. Для этого используется процедура glLightModeli с новыми параметрами.
Параметр GL_SEPARATE_SPECULAR_COLOR_EXT включает режим наложения бликов после наложения текстуры. Для возвращения к классической схеме вычисления цвета достаточно вызвать функцию с параметром GL_SINGLE_COLOR_EXT.
Рисунок 2.
Как видно на рис. 2, результат говорит сам за себя. При этом скорость работы программы практически не изменяется, так как расширение осуществляет наложение бликов за 1 проход.
Расширение GL_SEPARATE_SPECULAR_COLOR_EXT поддерживается всеми видеокартами NVIDIA, за исключением видеокарт семейства Riva128/128ZX.
Заголовок
Сообщение
- Отменить
- Сохранить
- Цитата
- Войдите
- Цитата
- Править
- Удалить Удалено
- Вы уверены?
- Да
- Нет
- Восстановить
- Просмотреть в редакторе
Мы тестируем новую функцию, позволяющую видеть все комментарии в хронологическом порядке. Некоторые тестеры указали нам на ряд ситуаций, в которых линейный вид мог бы быть очень кстати, поэтому мы хотим посмотреть, как вы будете его использовать.
Настройки раздела Video:
- Список доступных плагинов.
- Test: проверка выбранного плагина на работоспособность.
- Configure: настройка выбранного плагина.
- about: информация о плагине и его разработчиках.
Настройки плагина Pete’s OpenGL2 Driver 2.9:
Настройки раздела Resolution & Colors:
- Fullscreen mode: работа в полноэкранном режиме.
- Desktop resolution: настройка разрешения для полноэкранного режима.
- Color depth: настройка глубины цвета.
- Window mode: работа в оконном режиме.
- Window size: настройка разрешения для оконного режима.
- Use Window size in Fullscreen mode (Widescreen fix): использование настроек разрешения оконного режима для работы в полноэкранном режиме.
- Internal X/Y resolution: настройка разрешения текстур. Высокие настройки обеспечивают более качественное изображение.
- Stretching mode: настройка масштабирования изображения.
- Render mode: настройка режима рендера.
Настройки раздела Textures:
- Texture filtering: настройка фильтрации текстур. Обеспечивает более качественное изображение. Может ухудшить графику в некоторых играх, которые используют 2D задники, например, Resident Evil.
- Hi-Res textures: настройка использования текстур высокого разрешения. Обеспечивает более качественное изображение.
- Gfx card vram: настройка объема памяти графического адаптера. По умолчанию установлено автоматическое определение (рекомендуется).
- Use pixel shader for ‘PSX texture window’ emulation: использовать пиксельные шейдеры для эмуляции текстурного окна.
Настройки раздела Framerate:
- Show FPS display on startup: показывать данные FPS при запуске.
- Кнопка ". ": настройка горячих клавиш для изменения настроек плагина "на лету".
- Default keys: сбросить настройки горячих клавиш по умолчанию.
- Show/hide gpu menu: показать/скрыть меню настроек плагина.
- Show/hide gpu infos: показать/скрыть окно с информацией о плагине.
- Toggle selected option up: переключить выбранную опцию на один пункт вверх.
- Toggle selected option down: переключить выбранную опцию на один пункт вниз.
- Select previous option: выбрать предудыщую опцию.
- Select next option: выбрать следующую опцию.
- Toggle pause: включить паузу.
- Turn off FPS limit while pressed: выключить ограничение FPS при зажатии клавиши.
Настройки раздела Compatibility:
- Off-Screen drawing: настройка закадровой отрисовки. Высокие настройки обеспечивают более лучшую совместимость.
- Framebuffer effects: настройка эффектов буфера кадров. Высокие настройки обеспечивают более лучшую совместимость.
- Framebuffer upload: настройка загрузки буфера кадров. Высокие настройки обеспечивают более лучшую совместимость.
Настройки раздела Full screen filters:
- Screen filtering: фильтр сглаживания изображения. Обеспечивает более качественное изображение.
- Shader effects: настройка шейдерных эффектов, которые различным образом влияют на изображение. Например, изменение цвета, сглаживание для 2D игр, добавление ЭЛТ эффектов, и т.д. Различные шейдеры можно найти в сети.
- Shader level: настройка степени интенсивности шейдера. При высокой интенсивности шейдер сглаживания будет сильнее сглаживать изображение, шейдер цветности будет выдавать более яркое изображение, и т.д.
- Flicker-fix border: настройка для исправления проблемы с мерцанием по краям экрана.
- Кнопка ". ": вручную указать папку с кастомными шейдерами.
Настройки раздела Misc:
- Scanlines: использования эффекта черезстрочной развёртки.
- MDEC filter: использование фильтрации для видеороликов. Обеспечивает более качественное изображение.
- Disable screensaver: отключает использование экранной заставки и режима пониженного энергопотребления.
- GF4/WinXP crash fix: исправление падения для видеокарт GeForce4 под Windows XP. Неактуальна, т.к. устарела.
- Special game fixes: использовать специальные исправления для некоторых игр.
- Кнопка ". ": включение/отключение специальных исправлений.
Настройки раздела Default Settings:
- Fast: набор настроек по умолчанию для "быстрой работы". Неактуальны, т.к. устарели.
- Nice: набор настроек по умолчанию для "красивой картинки". Неактуальны, т.к. устарели.
Настройки раздела Sound:
- Список доступных плагинов.
- Test: проверка выбранного плагина на работоспособность.
- Configure: настройка выбранного плагина.
- about: информация о плагине и его разработчиках.
- Sound enabled: настройка включения/отключения звука.
Настройки плагина P.E.Op.S. DSound Audio Driver 1.9:
Настройки раздела General settings:
- Mode: настройка режима работы плагина. По умолчанию установлен режим высокой совместимости (рекомендуется).
- Volume: настройка громкости.
- Reverb: настройка реверберации. Высокие настройки обеспечивают более качественный звук.
- Interpolation: настройка интерполяции. Высокие настройки обеспечивают более качественный звук.
Настройки раздела XA music:
- Enable XA playing: включить проигрывание музыки в формате XA.
- Change XA speed, if it is playing too fast: изменять скорость проигрывания музыки в формате XA, если она проигрывается слишком быстро.
Настройки раздела Misc:
- SPU IRQ – wait for CPU action: прерывания аудиопроцессора – ждать ответа (действий) ЦП. Данная настройка необходима для игр Valkyrie Profile и Metal Gear Solid со включенным режимом плагина "SPUasync".
- SPU IRQ – handle irqs in decoded sound buffer areas: прерывания аудиопроцессора – обрабатывать прерывания в декодируемых участках аудиобуфера.
- Mono sound mode: настройка проигрывания звука в монофоническом режиме.
- Enable developer debug mode: включить режим разработчика для отладки.
- Enable sound recording window: включить окно для записи звука.
Настройки раздела Cdrom:
- Список доступных плагинов.
- Test: проверка выбранного плагина на работоспособность.
- Configure: настройка выбранного плагина.
- about: информация о плагине и его разработчиках.
Настройки плагина ePSXe CDR WNT/W2K core 1.7.0:
- Select Cdrom letter: выбор дисковода, из которого эмулятор будет считывать диск PSX.
- Enable subchannel read from cdrom: включить чтение субканальных данных. Опция может помочь, если игра отказывается запускаться из-за защиты от копирования.
Настройки раздела Bios:
- Здесь отображается место, в котором располагается файл BIOS.
- Select: указать путь к файлу BIOS.
Настройки раздела Memcards:
- Здесь отображается место, в котором располагается файл карты памяти для первого и второго слота.
- Enable: включить использование карты памяти для первого и второго слота.
- Select: указать путь к файлу карты памяти для первого и второго слота.
Настройки раздела Game Pad:
Элементы раздела меню File:
- Run CDROM: запустить игру PSX из дисковода.
- Run ISO: запустить игру PSX из ISO образа.
- Run PS-EXE: запустить хомбрю приложение.
- Run BIOS: запустить BIOS.
- Change Disc: смена диска. (для игр на нескольких дисках)
- CDROM: опция смены диска для дисковода.
- ISO: опция смены диска для ISO образа.
Элементы раздела меню Run:
- Continue: продолжить работу эмулятора (в случае, если после запуска была нажата клавиша ESC).
- Reset: перезагрузить эмулятор.
- Save State (F1): аналог быстрого сохранения.
- Slot 1: выполнить "быстрое сохранение" в слот 1.
- Slot 2: выполнить "быстрое сохранение" в слот 2.
- Slot 3: выполнить "быстрое сохранение" в слот 3.
- Slot 4: выполнить "быстрое сохранение" в слот 4.
- Slot 5: выполнить "быстрое сохранение" в слот 5.
Элементы раздела Options:
- Auto load ppf files enabled: автоматически загружать файлы-патчи в формате ppf.
- Cheat codes: открыть окно с настройкой чит-кодов.
- Cheat Codes Available: список с доступными чит-кодами.
- Cheat Codes Enabled: список со включенными чит-кодами.
- Enable ->: включить выбранный чит-код.
- Инструкции / Playstation