Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (DOC) (1124366), страница 18
Текст из файла (страница 18)
Б.4- Пример 3: Текстурирование и анимация
193
glRotatef (CurAng / 2, 1, 0, 1);
// Чтобы тетраэдр вращался вокруг центра, его // надо сдвинуть вниз по оси oz glTranslatef (0, -0.33, 0);
// Задаем цвет диффузного отражения для тетраэдра glColor3fv(mat_diff2);
// Проводим построение тетраэдра glCallList (TETR_LIST); }
void Display (void)
{
// Инициализация (очистка) текущего буфера
// кадра и глубины
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Построение объектов
DrawFigures ();
// Перестановка буферов кадра
glutSwapBuffers (); }
void Redraw (void)
{
// Увеличение текущего угла поворота CurAng+=l;
// Сигнал для вызова процедуры создания изображения // (для обновления) glutPostRedisplay (); }
int main(int argc , char **argv) {
194 Приложение Б. Демонстрационные программы
// Инициализация функций библиотеки GLUT glut Init (&argc , argv );
// Задание режима с двойной буферизацией, // представление цвета в формате RGB, // использование буфера глубины glutInitDisplayMode(GLUT_DOUBLE |
GLUT_RGB |
GLUT_DEFTH); // Создание окна приложения
glutCreateWindow ("Examplewof „using^OpenGL" ); // Регистрация функции построения изображения glutDisplayFunc( Display ) ;
// Регистрация функции обновления изображения glutldleFunc (Redraw); // Инициализация функций OpenGL Init ();
// Цикл обработки событий glutMainLoop () ; return 0;
}
Рис. Б.З.
Результат работы программы Б.5.
Б. 5. Класс для работы с OPENGL в WIN32
195
Б.5. Класс для работы с OpenGL в Win32
Программа Б.6. Файл glrc.li.
#ifndef _GLRC_H_ #define _GLRC_H_
// заголовки OpenGL ^include <gl/gl.h> ^include <gl/glu.h>
class GLRC
{ public :
// создание из идентификатора окна GLRC( HWND wnd );
// деструктор ~GLRC() ;
// удаление, (также вызывается из деструктора) void Destroy () ;
// Создание контекста рисования.
// Необходимо вызвать до использования OpenGL
bool Create ();
// Создан ли контекст рисования? bool IsCreated ();
// Является ли контекст рисования текущим? bool IsCurrentQ const;
// Делает контект текущим bool MakeCurrent () ;
196 Приложение Б. Демонстрационные программы
// Вызывается в конце рисования, // показ созданного изображения void SwapBuffers () ;
private:
// создан ли контекст
bool m_created;
// окно, для которого контекст
HWND m_wnd;
// контекст устройства
HDC m_dc;
// контекст рисования OpenGL
HGLRC m_glrc;
};
#endif
Программа Б.7. Файл glrc.cpp.
T^include <windows.h> T^include "glrc.h" T^include "assert, h"
GLRC: :GLRC(HWND wnd) : m_created ( false )
{
assert( wnd );
m_wnd = wnd;
m_dc = : : GetDC ( wnd );
assert ( m_dc ); }
GLRC::~GLRC()
{ _
if (m_created)
Б. 5. Класс для работы с OPENGL в WIN32 197
Destroy () ; }
void GLRC:: Destroy ()
{
wglDeleteContext (m_glrc) ;
: : ReleaseDC (m_wnd, m_dc) ;
m_created = false ; }
bool GLRC::MakeCurrent()
{
assert ( m_created );
if (IsCurrent ()) return true ;
BOOL res = wglMakeCurrent (m_dc, m_glrc); return (res != FALSE);
}
bool GLRC:: Create ()
{
assert ( !m_created );
int nPixelFormat = 0;
DWORD flags ; flags = Pro_DRAW_TO_WJNDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
static PKELFORMATDESCRIPTOR pfd =
{
sizeof (PLXELFORMATDESCRIPTOR) ,
1,
198
Приложение Б. Демонстрационные программы
flags ,
PFD_TYPE_RGBA, 24,
О, О, О, О, О, О,
1,
о, о, о, о, о, о,
32,
о, о,
PFD_MAIN_PLANE,
О,
О, О, О
};
pfd . cAlphaBits = 8;
nPixelFormat = ChoosePixelFormat ( m_dc, &pfd );
BOOL res =
SetPixelFormat ( m_dc, nPixelFormat, &pfd ) ;
if (res = FALSE) return false ;
m_glrc = wglCreateContext ( m_dc );
m_created = true ;
return MakeCurrent (); }
void GLRC:: SwapBuffers ()
{
assert (m_created ) ; : : SwapBuffers (m_dc);
Б. 5. Класс для работы с OPENGL в WIN32 199
}
bool GLRC : : IsCurrent () const
{
assert ( m_created );
return :: wglGetCurrentContext () = m_glrc; }
bool GLRC:: IsCreatedQ
{
return m_created;
}
Приложение В.
Примеры практических заданий
В.1. Cornell Box
Целью задания является создание изображения заданной трехмерной статичной сцены средствами OpenGL с использованием стандартных геометрических примитивов.
Требуется создать изображение сцены Cornell Box. Эта классическая сцена представляет собой комнату кубического вида, с отсутствующей передней стенкой. В комнате находятся геометрические предметы различных форм и свойств (кубы, параллелепипеды, шары), а также протяженный источник света на потолке. Присутствует также камера с заданными параметрами (обычно она расположена так, чтобы была видна вся комната).
В одной из лабораторий Корнельского университета такая комната существует в реальности, и ее фотографии сравниваются с изображениями, построенными методами трассировки лучей для оценки точности методов. На странице лаборатории (http://graphics.cornell.edu) можно найти описание геометрии сцены в текстовом формате.
201
202 Приложение В. Примеры практических заданий

Рис. В.1. Пример сцены Cornell Box.
Реализации сцены, приведенной на рисунке В.1, достаточно для выполнения задания, хотя возможно введение новых предметов дополнительно к существующим или вместо них. Приветствуется использование примитивов библиотек GLUT и GLU. Внимание! Сцена не должна превращаться в набор разнородных предметов. Эстетичность и оригинальность выполненного задания принимается во внимание.
Протяженный источник света на потолке комнаты можно эмулировать несколькими точечными источниками.
За простейшую реализацию сцены ставится 7 баллов.
Реалистичность сцены можно значительно повысить за счет разбиения многоугольников. Суть этого в том, что в модели освещения OpenGL освещенность вычисляется в вершинах многоугольника с учетом направления нормалей в этих вершинах, а затем линейно интерполируется по всей поверхности. Если используются относительно большие многоугольники, то, очевидно, невозможно получить действительно плавные переходы и за-
B.l. CORNELL BOX
203
тенения. Для преодоления этого недостатка можно разбивать большие грани (стены, например) на множество меньших по размерам. Соответственно разброс в направлении нормалей в вершинах одного многоугольника не будет столь велик и затенение станет более плавным (1 балл).
Наложение текстур на объекты сцены поощряется 2-мя баллами.
Дополнительными баллами оценивается присутствие в сцене теней. Один из простейших алгоритмов наложения теней приведен в разделе 8.2. За его реализацию можно получить до 2 баллов. Использование более продвинутых алгоритмов (например, shadow volumes) будет оценено дополнительными баллами.
Реализация устранения ступенчатости (antialiasing) методом, предложенным в разделе 8.1 или каким-либо другим, оценивается в 2 балла.
За введение в сцену прозрачных объектов и корректный их вывод дается 1 балл. Механизм работы с прозрачными объектами описан в разделе 7.1.
Задание оценивается, исходя из 15 баллов.
В приведенной ниже таблице указано распределение баллов в зависимости от реализованных требований:
Простейший вариант сцены (только освещение) | 7 баллов |
Разбиение полигонов | +1 балл |
Использование текстур | +2 балла |
Наложение теней | +2 балла |
Устранение ступенчатости | +2 балла |
Использование прозрачных объектов | +1 балл |
Дополнительные баллы можно получить за хорошую оптимизацию программы, необычные решения, эстетичность и т.д.
204 Приложение В. Примеры практических заданий
В.2. Виртуальные часы
Целью задания является создание трехмерной интерактивной модели аналоговых часов.
Рис. В.2. Пример трехмерных виртуальных часов. Обязательные требования к программе:
-
Программа должна демонстрировать на экране трехмерную модель часов. Часы могут быть любые, от наручных до кремлевских. Проявите в полной мере Вашу фантазию и чувство меры! Постарайтесь сделать как можно более реалистичную сцену. Поощряется подробная детализация элементов часов.
-
Часы на экране обязательно должны иметь минутную и часовую стрелки. Секундная — по желанию, но очень приветствуется (иначе трудно будет определить, ходят часы или нет).
В.2. Виртуальные часы
205
-
Время на часах должно совпадать с системным временем компьютера. Часы обязательно должны ходить, т.е. стрелки должны двигаться, и скорость их движения не должна зависеть от производительности компьютера, а определяться только текущим временем.
-
Сцена должна быть интерактивной, т.е. давать приемлемую частоту кадров в секунду (>10) при визуализации на машине с аппаратным ускорителем трехмерной графики. Если программа будет работать медленно, баллы могут быть снижены.
-
Необходимо реализовать вращения часов (или, возможно, камеры) с помощью мыши (предпочтительно) или клавиатуры. Можно также предусмотреть режимы с автоматическим вращением.
Пожелания к программе:
-
Поощряется введение дополнительной геометрии. Например, ремешков, маятников и т.д. Можно сделать часы с кукушкой, будильник и т.п.
-
Желательно наличие возможностей для управления процессом визуализации. Например, наличие/отсутствие текстур, режимы заливки, детализации и т.д.
-
Приветствуется выполнение задания в виде демонстрации, т.е. с возможностью работы в полноэкранном режиме и немедленным выходом по клавише Escape. Можно написать программу как Screen Saver.
-
Постарайтесь использовать максимум возможностей библиотеки OpenGL. Блики, отражения, спецэффекты — за все это обязательно даются дополнительные баллы.
206 Приложение В. Примеры практических заданий
• Проявите вкус — сделайте так, чтобы нравилось прежде всего Вам. Но не увлекайтесь — оставайтесь реалистами.
Максимальная оценка — 20 баллов. За минимальную реализацию требований ставиться 10 баллов. Еще до 10 баллов можно получить за использование в работе возможностей OpenGL (текстур, прозрачности, сферического текстурированяи и пр.), оригинальных и продвинутых алгоритмов, количество настроек, а также за эстетичность и красоту сцены.
В.З. Интерактивный ландшафт
Рис. В.З. Пример трехмерного ландшафта.
Целью данного задания является генерация и вывод с помощью OpenGL поверхности ландшафта, а также обеспечение интерактивного передвижения над ней.