Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h> // Заголовочный файл для Windows
- #include <gl\gl.h> // Заголовочный файл для OpenGL32 библиотеки
- #include <gl\glu.h> // Заголовочный файл для GLu32 библиотеки
- #include "gl\glaux.h" // Заголовочный файл для GLaux библиотеки
- #pragma comment(lib, "legacy_stdio_definitions.lib")
- static HGLRC hRC; // Постоянный контекст рендеринга
- static HDC hDC; // Приватный контекст устройства GDI
- GLfloat xrot; // Вращение X
- GLfloat yrot; // Y
- GLfloat zrot; // Z
- GLuint texture[1]; // Место для одной текстуры
- BOOL keys[256]; // Массив для процедуры обработки клавиатуры
- // Загрузка картинки и конвертирование в текстуру
- GLvoid LoadGLTextures()
- {
- // Загрузка картинки
- AUX_RGBImageRec *texture1;
- texture1 = auxDIBImageLoad("Data/CRATE.bmp");
- // Создание текстуры
- glGenTextures(1, &texture[0]);
- glBindTexture(GL_TEXTURE_2D, texture[0]);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
- }
- GLvoid InitGL(GLsizei Width, GLsizei Height) // Вызвать после создания окна GL
- {
- LoadGLTextures(); // Загрузка текстур
- glEnable(GL_TEXTURE_2D); // Разрешение наложение текстуры
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- // Очистка экрана в черный цвет
- glClearDepth(1.0); // Разрешить очистку буфера глубины
- glDepthFunc(GL_LESS); // Тип теста глубины
- glEnable(GL_DEPTH_TEST);// разрешить тест глубины
- glShadeModel(GL_SMOOTH);// разрешить плавное цветовое сглаживание
- glMatrixMode(GL_PROJECTION);// Выбор матрицы проекции
- glLoadIdentity(); // Сброс матрицы проекции
- gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
- // Вычислить соотношение геометрических размеров для окна
- glMatrixMode(GL_MODELVIEW);// Выбор матрицы просмотра модели
- }
- GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
- {
- if (Height==0) // Предотвращение деления на ноль, если окно слишком мало
- Height=1;
- glViewport(0, 0, Width, Height);
- // Сброс текущей области вывода и перспективных преобразований
- glMatrixMode(GL_PROJECTION);// Выбор матрицы проекций
- glLoadIdentity(); // Сброс матрицы проекции
- gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
- // Вычисление соотношения геометрических размеров для окна
- glMatrixMode(GL_MODELVIEW); // Выбор матрицы просмотра модели
- }
- GLvoid DrawGLScene(GLvoid)
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(0.0f,0.0f, -70.0f);
- glRotatef(xrot, 1.0f,0.0f,0.0f); // Вращение по оси X
- glRotatef(yrot, 0.0f,1.0f,0.0f); // Вращение по оси Y
- glRotatef(zrot, 0.0f,0.0f,1.0f); // Вращение по оси Z
- glBindTexture(GL_TEXTURE_2D, texture[0]);
- glBegin(GL_TRIANGLES); // Start Drawing A Triangle
- // треугольник 1
- glTexCoord2f(0.1875f, 0.0f); glVertex3f(-5.0f, -6.8f, 0.0f);
- glTexCoord2f(0.3875f, 0.6351f); glVertex3f(-1.8f, 2.6f, 0.0f);
- glTexCoord2f(1.0f, 0.6351f); glVertex3f(8.0f, 2.6f, 0.0f);
- // треугольник 2
- glTexCoord2f(0.5f, 0.2162f); glVertex3f(0.0f, -3.2f, 0.0f);
- glTexCoord2f(0.6875f, 0.3918f); glVertex3f(3.0f, -1.0f, 0.0f);
- glTexCoord2f(0.8125f, 0.0f); glVertex3f(5.0f, -6.8f, 0.0f);
- // треугольник 3
- glTexCoord2f(0.3875f, 0.6351f); glVertex3f(-1.8f, 2.6f, 0.0f);
- glTexCoord2f(0.5f, 1.0f); glVertex3f(0.0f, 8.0f, 0.0f);
- glTexCoord2f(0.6125f, 0.6351f); glVertex3f(1.8f, 2.6f, 0.0f);
- // треугольник 4
- glTexCoord2f(0.0f, 0.6351f); glVertex3f(-8.0f, 2.6f, 0.0f);
- glTexCoord2f(0.3875f, 0.6351f); glVertex3f(-1.8f, 2.6f, 0.0f);
- glTexCoord2f(0.3125f, 0.3918f); glVertex3f(-3.0f, -1.0f, 0.0f);
- glEnd();
- // для задней грани
- glBegin(GL_TRIANGLES);
- // треугольник 1
- glVertex3f(-5.0f, -6.8f, 6.0f);
- glVertex3f(-1.8f, 2.6f, 6.0f);
- glVertex3f(8.0f, 2.6f, 6.0f);
- // треугольник 2
- glVertex3f(0.0f, -3.2f, 6.0f);
- glVertex3f(3.0f, -1.0f, 6.0f);
- glVertex3f(5.0f, -6.8f, 6.0f);
- // треугольник 3
- glVertex3f(-1.8f, 2.6f, 6.0f);
- glVertex3f(0.0f, 8.0f, 6.0f);
- glVertex3f(1.8f, 2.6f, 6.0f);
- // треугольник 4
- glVertex3f(-8.0f, 2.6f, 6.0f);
- glVertex3f(-1.8f, 2.6f, 6.0f);
- glVertex3f(-3.0f, -1.0f, 6.0f);
- glEnd();
- // стенки звезды (боковые грани) для создания объема
- glBegin(GL_QUADS);
- glVertex3f(0.0f, 8.0f, 0.0f);
- glVertex3f(0.0f, 8.0f, 6.0f);
- glVertex3f(1.8f, 2.6f, 6.0f);
- glVertex3f(1.8f, 2.6f, 0.0f);
- glVertex3f(8.0f, 2.6f, 0.0f);
- glVertex3f(8.0f, 2.6f, 6.0f);
- glVertex3f(1.8f, 2.6f, 6.0f);
- glVertex3f(1.8f, 2.6f, 0.0f);
- glVertex3f(8.0f, 2.6f, 0.0f);
- glVertex3f(8.0f, 2.6f, 6.0f);
- glVertex3f(3.0f, -1.0f, 6.0f);
- glVertex3f(3.0f, -1.0f, 0.0f);
- glVertex3f(3.0f, -1.0f, 0.0f);
- glVertex3f(3.0f, -1.0f, 6.0f);
- glVertex3f(5.0f, -6.8f, 6.0f);
- glVertex3f(5.0f, -6.8f, 0.0f);
- glVertex3f(5.0f, -6.8f, 0.0f);
- glVertex3f(5.0f, -6.8f, 6.0f);
- glVertex3f(0.0f, -3.2f, 6.0f);
- glVertex3f(0.0f, -3.2f, 0.0f);
- glVertex3f(0.0f, -3.2f, 0.0f);
- glVertex3f(0.0f, -3.2f, 6.0f);
- glVertex3f(-5.0f, -6.8f, 6.0f);
- glVertex3f(-5.0f, -6.8f, 0.0f);
- glVertex3f(-5.0f, -6.8f, 0.0f);
- glVertex3f(-5.0f, -6.8f, 6.0f);
- glVertex3f(-3.0f, -1.0f, 6.0f);
- glVertex3f(-3.0f, -1.0f, 0.0f);
- glVertex3f(-3.0f, -1.0f, 0.0f);
- glVertex3f(-3.0f, -1.0f, 6.0f);
- glVertex3f(-8.0f, 2.6f, 6.0f);
- glVertex3f(-8.0f, 2.6f, 0.0f);
- glVertex3f(-8.0f, 2.6f, 0.0f);
- glVertex3f(-8.0f, 2.6f, 6.0f);
- glVertex3f(-1.8f, 2.6f, 6.0f);
- glVertex3f(-1.8f, 2.6f, 0.0f);
- glVertex3f(-1.8f, 2.6f, 0.0f);
- glVertex3f(-1.8f, 2.6f, 6.0f);
- glVertex3f(0.0f, 8.0f, 6.0f);
- glVertex3f(0.0f, 8.0f, 0.0f);
- glEnd();
- //glEnd();
- //xrot+=1.3f; // Ось вращения X
- yrot+=1.2f; // Ось вращения Y
- zrot+=1.4f; // Ось вращения Z
- Sleep(16);
- }
- LRESULT CALLBACK WndProc(
- HWND hWnd,
- UINT message,
- WPARAM wParam,
- LPARAM lParam)
- {
- RECT Screen; // используется позднее для размеров окна
- GLuint PixelFormat;
- static PIXELFORMATDESCRIPTOR pfd=
- {
- sizeof(PIXELFORMATDESCRIPTOR), // Размер этой структуры
- 1, // Номер версии (?)
- PFD_DRAW_TO_WINDOW |// Формат для Окна
- PFD_SUPPORT_OPENGL |// Формат для OpenGL
- PFD_DOUBLEBUFFER,// Формат для двойного буфера
- PFD_TYPE_RGBA, // Требуется RGBA формат
- 16, // Выбор 16 бит глубины цвета
- 0, 0, 0, 0, 0, 0,// Игнорирование цветовых битов (?)
- 0, // нет буфера прозрачности
- 0, // Сдвиговый бит игнорируется (?)
- 0, // Нет буфера аккумуляции
- 0, 0, 0, 0, // Биты аккумуляции игнорируются (?)
- 16, // 16 битный Z-буфер (буфер глубины)
- 0, // Нет буфера траффарета
- 0, // Нет вспомогательных буферов (?)
- PFD_MAIN_PLANE, // Главный слой рисования
- 0, // Резерв (?)
- 0, 0, 0 // Маски слоя игнорируются (?)
- };
- switch (message) // Тип сообщения
- {
- case WM_CREATE:
- hDC = GetDC(hWnd); // Получить контекст устройства для окна
- PixelFormat = ChoosePixelFormat(hDC, &pfd);
- // Найти ближайшее совпадение для нашего формата пикселов
- if (!PixelFormat)
- {
- MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);
- PostQuitMessage(0);
- // Это сообщение говорит, что программа должна завершится
- break; // Предтовращение повтора кода
- }
- if(!SetPixelFormat(hDC,PixelFormat,&pfd))
- {
- MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);
- PostQuitMessage(0);
- break;
- }
- hRC = wglCreateContext(hDC);
- if(!hRC)
- {
- MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);
- PostQuitMessage(0);
- break;
- }
- if(!wglMakeCurrent(hDC, hRC))
- {
- MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);
- PostQuitMessage(0);
- break;
- }
- GetClientRect(hWnd, &Screen);
- InitGL(Screen.right, Screen.bottom);
- break;
- case WM_DESTROY:
- case WM_CLOSE:
- ChangeDisplaySettings(NULL, 0);
- wglMakeCurrent(hDC,NULL);
- wglDeleteContext(hRC);
- ReleaseDC(hWnd,hDC);
- PostQuitMessage(0);
- break;
- case WM_KEYDOWN:
- keys[wParam] = TRUE;
- break;
- case WM_KEYUP:
- keys[wParam] = FALSE;
- break;
- case WM_SIZE:
- ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
- break;
- default:
- return (DefWindowProc(hWnd, message, wParam, lParam));
- }
- return (0);
- }
- int WINAPI WinMain(
- HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
- {
- MSG msg; // Структура сообщения Windows
- WNDCLASS wc; // Структура класса Windows для установки типа окна
- HWND hWnd;// Сохранение дискриптора окна
- wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
- wc.lpfnWndProc = (WNDPROC) WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = NULL;
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = NULL;
- wc.lpszMenuName = NULL;
- wc.lpszClassName = "OpenGL WinClass";
- if(!RegisterClass(&wc))
- {
- MessageBox(0,"Failed To Register The Window Class.","Error",MB_OK|MB_ICONERROR);
- return FALSE;
- }
- hWnd = CreateWindow(
- "OpenGL WinClass",
- "Jeff Molofee's GL Code Tutorial ... NeHe '99", // Заголовок вверху окна
- WS_POPUP |
- WS_CLIPCHILDREN |
- WS_CLIPSIBLINGS,
- 0, 0, // Позиция окна на экране
- 640, 480, // Ширина и высота окна
- NULL,
- NULL,
- hInstance,
- NULL);
- if(!hWnd)
- {
- MessageBox(0,"Window Creation Error.","Error",MB_OK|MB_ICONERROR);
- return FALSE;
- }
- DEVMODE dmScreenSettings; // Режим работы
- memset(&dmScreenSettings, 0, sizeof(DEVMODE)); // Очистка для хранения установок
- dmScreenSettings.dmSize = sizeof(DEVMODE); // Размер структуры Devmode
- dmScreenSettings.dmPelsWidth = 640; // Ширина экрана
- dmScreenSettings.dmPelsHeight = 480; // Высота экрана
- dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; // Режим Пиксела
- ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
- // Переключение в полный экран
- ShowWindow(hWnd, SW_SHOW);
- UpdateWindow(hWnd);
- SetFocus(hWnd);
- while (1)
- {
- // Обработка всех сообщений
- while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
- {
- if (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- {
- return TRUE;
- }
- }
- DrawGLScene(); // Нарисовать сцену
- SwapBuffers(hDC); // Переключить буфер экрана
- if (keys[VK_ESCAPE]) SendMessage(hWnd,WM_CLOSE,0,0); // Если ESC - выйти
- }
- }
Add Comment
Please, Sign In to add comment