Каркас Windows-приложения. Особенности нового каркаса. Перемещение в пространстве (с текстурированными стенами), страница 4

Окно OpenGL имеет свой собственный формат пикселов. Нам следует выбрать и установить подходящий формат экранной поверхности в контексте устройства HDC, а затем создать контекст передачи изображения (HGLRC). Для описания формата используется структура PIXELFORMATDESCRIPTOR. В функции CreateGLWindow, которая вызывается в момент создания окна, ведется работа именно с этой структурой. Выбор формата зависит от возможностей карты и намерений разработчика. Мы зададим в полях этой структуры такие настройки:

q  глубину цвета (bit per pixel) — 24 (см. установку gInfo.bpp),

q  тип буферизации — двойной,

q  схему образования цвета RGBA,

q  количество бит для буфера глубины — 24,

q  поддержку регулировки прозрачностью и другие специфические настройки выключим.

Кроме того, в ней создается контекст передачи — hRC, который хранится в глобальной структуре gInfo, и устанавливается в качестве текущего. Контекст передачи OpenGL (rendering context) создается функцией wglCreateContext с учетом выбранного формата пикселов. Так осуществляется связь OpenGL с Windows. Создание контекста требует, чтобы обычный контекст (HDC) существовал и был явно указан в параметре wglCreateContext.

HGLRC использует тот же формат пикселов, что и HDC, но мы должны объявить контекст передачи в качестве текущего (current) и лишь после этого можем делать вызовы команд OpenGL, которые производят включение некоторых состояний OpenGL. Удалять контекст передачи надо после отсоединения его от потока. Это делается в момент закрытия окна (см. функцию DestroyGLWindow).

Обратите внимание на то, что в оконной процедуре отсутствует обработка сообщения о перерисовке WM_PAINT. Вызов функции Draw, создающей изображение, расположен прямо в цикле обработки сообщений (см. WinMain), поэтому сцена непрерывно перерисовывается. Такой подход характерен для игровых программ, где главное внимание уделяется динамике отображения сцены.

Использование каркаса

Добавьте к проекту новый пользовательский модуль Colors.cpp и введите в него следующий код.

#include <windows.h>

#include <gl\glaux.h>

#include "NeHe.h"

float angleTria;  // Rotation angle for the terahedron

float angleQuad;  // Rotation angle for the cube

bool Init () // Any user initialization code goes here

{

glShadeModel (GL_SMOOTH);   // Enable Smooth Shading

glClearColor (0, 0, 0, 0.5f);  // Black Background

glClearDepth (1);         // Depth Buffer Setup

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing

glDepthFunc (GL_LEQUAL);    // The Type Of Depth Testing To Do

glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

return true;

}

void Draw ()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();         // Reset The Current Modelview Matrix

glTranslatef (-1.5f, 0, -6); // Move Left 1.5 Units And Into The Screen 6.0

glRotatef (angleTria, 0, 1, 0);  // Rotate The Triangle On The Y axis

glBegin(GL_TRIANGLES);      // Drawing Using Triangles

glColor3f (1, 0, 0);    // Red

glVertex3f (0, 1, 0.);    // Top Of Triangle (Front)

glColor3f (0,1,0);      // Green

glVertex3f (-1,-1, 1);    // Left Of Triangle (Front)

glColor3f (0, 0, 1);    // Blue

glVertex3f (1,-1, 1);   // Right Of Triangle (Front)

glColor3f (1,0,0);      // Red

glVertex3f (0, 1, 0);   // Top Of Triangle (Right)

glColor3f (0, 0, 1);    // Blue

glVertex3f (1,-1, 1);   // Left Of Triangle (Right)

glColor3f (0,1,0);      // Green

glVertex3f (1,-1,-1);   // Right Of Triangle (Right)

glColor3f (1,0,0);      // Red

glVertex3f (0, 1, 0);   // Top Of Triangle (Back)

glColor3f (0, 1, 0);    // Green

glVertex3f (1,-1, -1);    // Left Of Triangle (Back)

glColor3f (0, 0, 1);    // Blue

glVertex3f (-1,-1, -1);   // Right Of Triangle (Back)

glColor3f (1, 0, 0);    // Red

glVertex3f (0, 1, 0);   // Top Of Triangle (Left)

glColor3f (0, 0, 1);    // Blue

glVertex3f (-1,-1,-1);    // Left Of Triangle (Left)

glColor3f (0, 1, 0);    // Green

glVertex3f (-1,-1, 1);    // Right Of Triangle (Left)