Курсовая работа (т): Компьютерная графика

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

ü  Видеокарта c поддержкой PixelShaderModel 1.1 минимум

ü  DirectX 9.0c и позднее

ü  MicrosoftFramework 3.5 и позднее

алгоритм визуализация интерактивный модель

4. ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ РЕШЕНИЯ ЗАДАЧИ.

4.1 Реализация построения интерактивной модели

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

Этап 1: Построение.

Сначала сохраняем текущую видовую матрицу. Создаем объект quadric-объект, который используется для упрощения построений некоторых поверхностей второго порядка. Устанавливаем стиль фигуры. GLU_FILL - фигура закрашивается полностью. Рисуется цилиндр с параметрами: маленький радиус, большой радиус, количество частей вокруг оси Z, количество частей вдоль оси Z. Освобождаем память, занимаемую под quadObj.

();= gluNewQuadric();(quadObj, GLU_FILL);(quadObj, .3, .6, 2, 20, 20);(quadObj);

Затем рисуем тор и сферу заданного радиуса и сдвигаем по оси Z.Устанавливаем цвет фигуры. Создаем quadObj объект. Рисуем диск с параметрами: маленький радиус, большой радиус, количество частей вокруг оси Z, количество частей вдоль оси Z. Освобождаем память, занимаемую под quadObj. Возвращаемся к сохраненной видовой матрице

auxSolidTorus(0.1, 0.5);

auxSolidTorus(0.1, 0.4);

glTranslated(0, 0, -.2);

auxSolidTorus(0.1, 0.3);

glTranslated(0, 0, -.6);

auxSolidSphere(.6);(0,0,2.6);(0.2, .7);(0,0,.3);(0.2, .7);(0,0,.2);d(1,0,0);= gluNewQuadric();(quadObj,0, .6, 20, 20);(quadObj);

glPopMatrix();

Этап 2: Текстурирование.

Текстура - растровое изображение, накладываемое на поверхность полигона, из которых состоят 3d-модели, для придания ей цвета, окраски или иллюзии рельефа. Качество поверхности текстуры определяется текселями - количеством пикселей на минимальную единицу текстуры.

Инициализируем текстуру. Определяет двумерный образ текстуры с параметрами: уровень блеска, компоненты блеска, ширина, высота, граница блеска, формат, тип, пиксели. Устанавливаем параметры текстуры. Первый параметр должен быть GL_TEXTURE_2D, второй - это какой атрибут надо поменять, третий - это значение, которое надо атрибуту присвоить. GL_TEXTURE_MAG_FILTER и GL_TEXTURE_MIN_FILTER говорят о качестве наложенных текстур. MAG_FILTER может быть только GL_NEAREST или GL_LINEAR. MIN_FILTER имеет еще несколько возсожных значений, но мы пока не будет на них заострять внимание. Затем включаем текстуры. Устанавливаем координаты текстур GL_TEXTURE_GEN_MODE - определяет символическое имя текстура-координатного поколения функциональные или функциональные параметры._OBJECT_LINEAR- определяет указатель в массив параметров поколения текстуры.

photo_image = auxDIBImageLoad("00.bmp");D(GL_TEXTURE_2D, 0, 3,_image->sizeX,_image->sizeY,

, GL_RGB, GL_UNSIGNED_BYTE,_image->data);(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);(GL_TEXTURE_2D);(GL_TEXTURE_GEN_S);(GL_TEXTURE_GEN_T);(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

Пример текстуры приведен на рисунке 1

Рисунок 1 - текстура для созданной фигуры.

4.2 Программная реализация

Графический интерфейс написан на Dev C++. Этапы реализации:

)        Инициализируем библиотеку OpenGl

#include <windows.h>

#include <gl/gl.h>

#include <gl/glu.h>

#include "glaux.h"

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

HWND hWnd;//Содержит дискриптор окнаhDC;//Приватный контекст GDI устройстваhRC//Постоянный контекст отображенияfigure;int photo_tex;//целое (число) без знака_RGBImageRec* photo_image;*quadObj;//Создаем quadObj объектmenu;alpha = 0;

foat   xrot = 0.0f;// Вращение по оси X

float yrot = 0.0f;// Вращение по оси Y

float zrot = 0.0f;// Вращение по оси Z

int Render(void)//рендеринг объекта на экран

{        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glLoadIdentity();d(1.,1.,1.);+=2.0f;//увеличить значение переменной вращения по X+=5.0f;//увеличить значение переменной вращения по Y+=8.0f;//увеличить значение переменной вращения по Z(xrot,0.0f,0.0f,1.0f);//вращение по оси X(yrot,0.0f,2.0f,0.0f);//вращение по оси Y(zrot,1.0f,0.0f,0.0f);//вращение по оси Z

CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - функция будет получать сообщения. которые Windows будет отсылать окну.

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);- включение использования.

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);- выключение использования._RGBImageRec* photo_image;- эта функция вызывается всякий раз, когда поступает сообщение от мыши.menu;- идентификатор строки меню, раскрывающееся меню или подменю, которое будет изменено.( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - очистка экрана и буфера глубины.(); - считывает текущую матрицу.

glColor3d(1.,1.,1.); - устанавливает новые RGBA компоненты для текущего цвета.

3)      Рисуем фигуры

// Рисуем ПЕШКУ

///////////////(figure == 0) {();= gluNewQuadric();(quadObj, GLU_FILL);(quadObj, .3, .6, 2, 20, 20);(quadObj);(0.1, 0.5);(0.1, 0.4);(0, 0, -.2);(0.1, 0.3);(0, 0, -.6);(.6);(0,0,2.6);(0.2, .7);(0,0,.3);(0.2, .7);(0,0,.2);d(1,0,0);= gluNewQuadric();(quadObj,0, .6, 20, 20);(quadObj);();

}

//конец пешки

/////////////

// ОФИЦЕР(figure == 1) {= gluNewQuadric();(quadObj, GLU_FILL);( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );();(quadObj, .2, .7, 3.2, 20, 20);(0,0,.4);(0,0,-.2);(quadObj, 0, .7, 15, 15);(0,0,-.1);(.1, .7);(0,0,-.1);(quadObj, 0, .7, 15, 15);(0,0,-.1);(.1, .4);(0,0,-.2);(.1, .4);(0,0,-.6);(quadObj, .7, .3, .6, 20, 20);(0,0,-.6);(quadObj, .3, .7, .6, 20, 20);(0,0,-.2);(quadObj, .3, .3, .3, 20, 20);(.1,.2);(0,0,-.1);(quadObj, 0, .2, 15, 15);(0,0,3.7);(0.2, .6);(0,0,.6);(0.3, .8);(0.3, .7);(0,0,.4);(0.3,.8);(0,0,.3);d(1,0,0);(quadObj,0, .8, 20, 20);

}

//конец офицеру

///////////////

//рисуем ЛАДЬЮ

////////////////(figure == 2) {= gluNewQuadric();(quadObj, GLU_FILL);( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );();(quadObj, .5, .6, 2.3, 20, 20);(0,0,.4);(0,0,-.3);(.1, .6);(0,0,-.3);(.2, .6);(0,0,-.5);(quadObj, .8, .5, .4, 20, 20);(quadObj, 0, .8, 15, 15);(0,-.6,-.1);(.3, .3, .2);(0,1.2,0);(.3, .3, .2);(0,-.6,0);(.6,0,0);(.3, .3, .2);(-1.2,0,0);(.3, .3, .2);(.6, 0,0);(0,0,2.8);(0.2, .6);(0,0,.6);(0.3, .8);(0.3, .7);(0,0,.4);(0.3,.8);(0,0,.3);d(1,0,0);(quadObj,0, .8, 20, 20);

}

//конец ладье

// ФЕРЗЬ(figure == 3) {= gluNewQuadric();(quadObj, GLU_FILL);( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );();(quadObj, .2, .7, 2.6, 20, 20);(0,0,.4);(0,0,-.2);(quadObj, 0, .7, 15, 15);(0,0,-.1);(.1, .7);(0,0,-.1);(quadObj, 0, .7, 15, 15);(0,0,-.1);(.1, .4);(0,0,-.2);(.1, .4);(0,0,-.8);(quadObj, .7, .3, 1, 20, 20);(quadObj, 0, .7, 15, 15);(0,0,-.1);(.1, .3);(0,0,-.1);(quadObj, 0, .3, 15, 15);(0,0,-.6);(.3, .3, 1);(.3, .6, .3);(0,0,4);(0.2, .6);(0,0,.6);(0.3, .8);(0.3, .7);(0,0,.4);(0.3,.8);(0,0,.3);d(1,0,0);(quadObj,0, .8, 20, 20);

}

//конец ферзя

///////////////

// КОРОЛЬ(figure == 4) {= gluNewQuadric();(quadObj, GLU_FILL);( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );();(quadObj, .2, .7, 2.6, 20, 20);(0,0,.4);(0,0,-.2);(quadObj, 0, .7, 15, 15);(0,0,-.1);(.1, .7);(0,0,-.1);(quadObj, 0, .7, 15, 15);(0,0,-.1);(.1, .4);(0,0,-.2);(.1, .4);(0,0,-.8);(quadObj, .7, .3, 1, 20, 20);(0,0,-.4);(quadObj, .2, .7, .4, 20, 20);(0,0,-.1);(.1,.2);(0,0,-.3);(.3);(0,0,4);(0.2, .6);(0,0,.6);(0.3, .8);(0.3, .7);(0,0,.4);(0.3,.8);(0,0,.3);d(1,0,0);(quadObj,0, .8, 20, 20);

}

//конец королю

///////////////(wglGetCurrentDC());0;

}

(wglGetCurrentDC()); - обмен буферов. WglGetCurrentDC функция получает ссылку на контекст устройства, связанный с текущей OpenGL рендеринг контексте вызывающего потока.

)        Создаем менюMenuCreate(HINSTANCE hinstance{

= CreateMenu();//создаем менюFigures = CreateMenu();(Figures, MF_STRING, 101, "Pawn");(Figures, MF_STRING, 102, "Bishop");(Figures, MF_STRING, 103, "Rook");(Figures, MF_STRING, 104, "King");(Figures, MF_STRING, 105, "Queen");(menu , MF_POPUP, (UINT) Figures, "Figures");

Texture = CreateMenu();//создаем меню текстурi = 200;

_FIND_DATA fd;//структура для функций поиска файлов.fh;((fh = FindFirstFile("*.bmp", &fd))==NULL)(Texture, MF_STRING, 200, "Texture NotFound"); else{(Texture, MF_STRING, 200, fd.cFileName);(FindNextFile(fh, &fd)){++;(Texture, MF_STRING, i, fd.cFileName);

}

}(menu , MF_POPUP, (UINT)Texture, "Textures");

0;

}

MenuCreate(HINSTANCE hinstance) - возвращает уникальный номер созданного объекта.(Figures, MF_STRING, 101, "Pawn"); -добавляет в конец заданной строки меню, "выпадающего" меню, подменю или контекстного меню новый пункт

)        Создаем WinMain.вызывается системой как начальная точка входа, для базирующейся на Windows, прикладной программы.WINAPI WinMain (HINSTANCE hInstance,hPrevInstance,lpCmdLine,// указатель на командную строкуiCmdShow)// показывает состояние окна

{wc;msg;bQuit = FALSE;

/* register window class */.style = CS_OWNDC;// Флажок частного DC.lpfnWndProc = WndProc;//указатель на оконную процедуру.cbClsExtra = 0;// доп. данных для класса нет.cbWndExtra = 0;// доп. данных для окна нет.hInstance = hInstance;// программа-владелец класса.hIcon = LoadIcon (NULL, IDI_APPLICATION); // значок класса.hCursor = LoadCursor (NULL, IDC_ARROW);// курсор класса.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH);.lpszMenuName = NULL;// меню класса.lpszClassName = "GLSample";// имя класса(&wc);// Регистрация класса окна.= CreateWindow (

"GLSample", "OpenGL Sample",_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

, 0, 600, 600,, NULL, hInstance, NULL);//создание непосредственно окна.(hWnd, 3, 70, NULL);//Таймер(hInstance);//возвращает уникальный номер созданного объекта.(hWnd, menu);( hWnd, SW_SHOWDEFAULT );( hWnd );

/* enable OpenGL for the window */(hWnd, &hDC, &hRC);

/* program main loop */(!bQuit)

{

/* check for messages */(PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))

{

/* handle or dispatch messages */(msg.message == WM_QUIT)/

{= TRUE;

}

{(&msg);(&msg);

}

}

/*else

{SwapBuffers (hDC);+= 1.0f;// Представление угла(1);//производит задержку в 1 милисекунду,

}*/

}

/* shutdown OpenGL */(hWnd, hDC, hRC);

/* destroy the window explicitly */(hWnd);msg.wParam; }

HINSTANCE hInstance - дескриптор текущего экземпляра окнаhPrevInstance - дескриптор предыдущего экземпляра окнаwc; - Заполним поля структуры класса окна параметрами, которые описаны в главном окне..hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH); - фон класса

Функция CreateWindow создает перекрывающее, выскакивающее или дочернее окно. Она определяет класс, заголовок, стиль окна и (необязательно) начальную позицию и размер окна. Функция также определяет и окно родителя или владельца, если таковые имеются и меню окна.(hWnd, menu);- устанавливает и пеpеpисовывает меню окна как меню, опpеделенное паpаметpом Menu( hWnd, SW_SHOWDEFAULT ); -устанавливает состояние показа определяемого окна. SW_SHOWDEFAULT - устанавливает состояние показа, основанное на флажке SW_, определенном в структуре STARTUPINFO, переданной в функцию CreateProcess программой, которая запустила прикладную программу.( hWnd ); - обновляет рабочую область заданного окна, отправляя сообщение WM_PAINT окну, если регион обновления окна не пуст(PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))- функция PeekMessage распределяет входящие отправленные (асинхронные) сообщения, проверяет помещенные в очередь (синхронные) сообщения очереди сообщений потока и извлекает сообщение (если таковое имеется).PM_REMOVE         Сообщения удаляются из очереди после обработки функцией PeekMessage.(msg.message == WM_QUIT)-cooбщение WM_QUIT указывает запрос, чтобы завершить прикладную программу и создается, когда из прикладной программы вызвана функция PostQuitMessage.(&msg);-функция TranslateMessage переводит сообщения виртуальных клавиш в символьные сообщения. Символьные сообщения помещаются в очереди сообщений вызывающего потока для прочтения в следующий раз, когда поток вызовет функцию GetMessage или PeekMessage(&msg); - функция DispatchMessage распределяет сообщение оконной процедуре. Обычно она используется, чтобы доставить сообщение, извлеченное функцией GetMessage(hDC); - функция SwapBuffers заменяет внешнюю сторону и буферизует если текущий формат пикселя для окна ссылавшегося определенным контекстом устройства включает обратный буфер.(hWnd); - функция DestroyWindow разрушает заданное окно. Функция отправляет сообщения WM_DESTROY и WM_NCDESTROY окну, чтобы деактивировать его и удалить фокус клавиатуры из него. Функция также уничтожает меню окна, очищает очередь потоков сообщений, уничтожает таймеры, удаляет монопольное использование буфера обмена и разрывает цепочку просмотра окон буфера обмена (если окно имеет наверху цепочку просмотров).msg.wParam; - эта функция вызывается Windows 2000 и пересылает сообщения из очереди сообщений.

)        Window Procedureprocedure, она же процедура обработки сообщений, messageCALLBACK WndProc (HWND hWnd, UINT message,wParam, LPARAM lParam)

{ case WM_COMMAND:

{if ((LOWORD(wParam)>=100)&&(LOWORD(wParam)<200)) figure = LOWORD(wParam) - 101;((LOWORD(wParam)>=200)&&(LOWORD(wParam)<=300)){buf[200];(menu, LOWORD(wParam), buf, sizeof(buf), MF_BYCOMMAND);_image = auxDIBImageLoad(buf);D(GL_TEXTURE_2D, 0, 3, photo_image->sizeX,_image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,_image->data);0;

}

WM_CREATE:0;

WM_CLOSE:(0);0;

WM_DESTROY:0;

WM_TIMER:

{= alpha++ % 360;();0;

}

WM_KEYDOWN:(wParam)

{VK_ESCAPE:(0);0;

}0;

:DefWindowProc (hWnd, message, wParam, lParam);

}

}CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) - объявляем строку-имя программы(LOWORD(wParam)>=200)&&(LOWORD(wParam)<=300)) - выделяет из 32-битового целочисленного значения младшее слово.(menu, LOWORD(wParam), buf, sizeof(buf), MF_BYCOMMAND); - функция GetMenuString копирует текстовую строку определяемого пункта меню в заданный буфер.MF_BYCOMMAND - Указывает, что uIDItem дает идентификатор пункта меню. Если ни флажок MF_BYCOMMAND, ни флажок MF_BYPOSITION не установлен, флажок MF_BYCOMMAND является флажком, заданным по умолчанию.D(GL_TEXTURE_2D, 0, 3, photo_image->sizeX,_image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,_image->data); - функция glTexImage2D определяет двумерный образ текстурыWM_CREATE: - отправляется тогда, когда программа запрашивает, какое окно будет создаваться вызовом функции CreateWindowEx или CreateWindowWM_CLOSE: - сообщение WM_CLOSE отправляется как сигнал, по которому окно или прикладная программа должны завершить свою работу(0); - функция PostQuitMessage указывает системе, что поток сделал запрос на то, чтобы завершить свою работу (выйти). Это обычно используется в ответ на сообщение WM_DESTROYWM_DESTROY: - сообщение WM_DESTROY отправляется тогда, когда окно разрушается. Оно отправляется оконной процедуре разрушаемого окна после того, как окно удаляется с экрана.WM_TIMER: - сообщение WM_TIMER отправляется в очередь сообщений установившего таймер потока или соответствующей функции обратного вызова TimerProc по истечении интервала, заданного при установке таймера функцией SetTimer .WM_KEYDOWN: - сообщение WM_KEYDOWN уведомляет окно с фокусом, что была нажата несистемная клавиша. Несистемные клавиша - если одновременно не нажат ALT ключ.VK_ESCAPE: - выполняет действия, которые если клавиша нажата escDefWindowProc (hWnd, message, wParam, lParam); - функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.

)        Enable OpenGLEnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)

{pfd int iFormat;

/* get the device context (DC) */

*hDC = GetDC (hWnd);

/* set the pixel format for the DC */(&pfd, sizeof (pfd));.nSize = sizeof (pfd);//Размер структуры.nVersion = 1;//Версия.dwFlags = PFD_DRAW_TO_WINDOW |_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;// флаги.iPixelType = PFD_TYPE_RGBA;// тип пикселя.cColorBits = 24;// 24 бита напиксель.cRedBits = 8;.cRedShift = 16;.cGreenBits = 8;.cGreenShift = 8;.cBlueBits = 8;.cBlueShift = 0;.cAlphaBits = 0;.cAlphaShift = 0;.cAccumBits = 64;.cAccumRedBits = 16;.cAccumGreenBits = 16;.cAccumBlueBits = 16;.cAccumAlphaBits = 0;.cDepthBits = 16;//Определяет глубину глубины (z-axis) буфера..cStencilBits = 8;//Определяет глубину буфера шаблона..cAuxBuffers = 0;.iLayerType = PFD_MAIN_PLANE;// тип слоя.bReserved = 0;//Не использованное. Должно - нулевым..dwLayerMask = 0;.dwVisibleMask = 0;.dwDamageMask = 0;= ChoosePixelFormat (*hDC, &pfd);(iFormat == 0) iFormat = 1;(*hDC, iFormat, &pfd);

/* create and enable the render context (RC) */

*hRC = wglCreateContext( *hDC );( *hDC, *hRC );(GL_ALPHA_TEST);//- разрешить прозрачностью(GL_DEPTH_TEST);(GL_COLOR_MATERIAL);(GL_LIGHTING);//разрешает использование источника света(GL_LIGHT0);//включает источник света под номером "0".(GL_BLEND);//включает режим смешения цветов.(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);pos[4] = {2,2,2,1};spec[4] = {1,1,1,1};dir[3] = {-1,-1,-1};(GL_LIGHT0, GL_POSITION, pos);(GL_LIGHT0, GL_SPOT_DIRECTION, dir);(GL_LIGHT0, GL_SPECULAR, spec);

ambient[4] = {0.4, 0.4, 0.4, 1};(GL_LIGHT_MODEL_AMBIENT, ambient);//освещение

_image = auxDIBImageLoad("00.bmp");D(GL_TEXTURE_2D, 0, 3,_image->sizeX,_image->sizeY,

, GL_RGB, GL_UNSIGNED_BYTE,_image->data);(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);(GL_TEXTURE_2D);(GL_TEXTURE_GEN_S);(GL_TEXTURE_GEN_T);(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);( GL_PROJECTION );();(-5,5, -5,5, -10,10);( 0,0,5, 0,0,0, 0,1,0 );( GL_MODELVIEW );

pfd; - cтруктура PIXELFORMATDESCRIPTOR описывает формат пикселя чертежа поверхности.( GL_MODELVIEW ); - прилагает последующие матричные действия к матричной кипе modelview( 0,0,5, 0,0,0, 0,1,0 ); - функция gluLookAt создает рассматривающий матричный производный от точки глаза, контрольная точка, указывающих центр сцены, и up вектор.(-5,5, -5,5, -10,10); - функция glOrtho умножает текущую матрицу орфографической матрицей.Параметры:Определите координаты для левого и правого вертикального отсечения плоскостей.Определите координаты для низа и завершайте горизонтальное отсечение плоскостей.Определите расстояниям в nearer и далее глубину, вырезать плоскости. Эти расстояния являются негативом если плоскость должна быть за зрителем.(); - функция glLoadIdentity заменяет текущую матрицу на единичную( GL_PROJECTION ); - функция glMatixMode определяет, что какая матрица является текущей матрицей.GL_PROJECTION - матрица проекций(GL_LIGHT0, GL_SPOT_DIRECTION, dir); - массивы pos и dir содержат координаты местоположения лампы и направления, куда она светит. Массив dir содержит три координаты - x,y,z. Массив pos - четыре, назначение четвертого мне не очень ясно. Если его значение отличается от нуля, то изображение вполне логичное получается. Если же он ноль, то получается что-то непотребное._ONE_MINUS_SRC_ALPHA); - функция glBlendFunc определяет арифметику пикселя.Определяет как красный, зеленый, синий, и буквенные исходные-стыковочные показатели вычислены.( *hDC, *hRC ); - функция wglMakeCurrent делает определенный OpenGL, предоставляющее контекст вызов резьбы текущего предоставления контекста.(*hDC, iFormat, &pfd); - функция SetPixelFormat устанавливает контекстный пиксель определенного формата устройства в формат определенный индексом iPixelFormat..dwDamageMask = 0; - определяет независимо более, чем одним акциям формата пикселя тот же фреймовый буфер. Если результат поразрядного-И аварийных масок между двумя форматами пикселя - не равным нулю, тогда они распространяют те же буферы..dwVisibleMask = 0; - определяет видимую маску. Видимая маска использована в связи (вместе)с маской слоя, чтобы определяться если один слой перекрывает другой. Если результат поразрядного-И видимой маски слоя и маска слоя слоя секунды ненулевое, тогда первый слой перекрывает второй слой, и прозрачная величина пикселя существует между двумя слоями. Если видимая маска - 0, слой непрозрачный..dwLayerMask = 0; - определяет маску слоя. Маска слоя использована в связи (вместе)с видимой маской, чтобы определяться если один слой перекрывает другой..cAuxBuffers = 0; - определяет количество вспомогательных буферов. Вспомогательные буферы не поддерживаны.cAlphaShift = 0; - определяет что сдвиг имеет значение альфу bitplanes в каждом цветном буфере RGBA. Альфа bitplanes не поддерживана.(&pfd, sizeof (pfd)); - функция ZeroMemory заполняет указанный фрагмент памяти нулями