Окно 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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.