Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <windows.h>
- #include "glut.h"
- #include <stdio.h>
- #include <malloc.h>
- static int w = 0, h = 0;
- static float rtrX = 20.0f;
- static float rtrY = 20.0f;
- static float rtrZ = 20.0f;
- #define GL_BGR 0x80E0
- GLuint textura_id1;
- GLuint textura_id2;
- GLuint textura_id3;
- int sample = 1;
- int angle = 0;
- struct textura_struct{
- int W;
- int H;
- unsigned char *Image;
- }get_textura;
- int LoadTexture(char *FileName, int number)
- {
- FILE *F;
- if ((F = fopen(FileName, "rb")) == NULL)
- return 0;
- /*Перемещаемся в bmp-файле на нужную позицию, и считываем ширину и длинну */
- fseek(F, 18, SEEK_SET);
- fread(&(get_textura.W), 2, 1, F);
- fseek(F, 2, SEEK_CUR);
- fread(&(get_textura.H), 2, 1, F);
- /* Выделяем память под изображение. Если память не выделилась, закрываем файл и выходим с ошибкой */
- if ((get_textura.Image = (unsigned char *)malloc(sizeof(unsigned char)* 3 * get_textura.W * get_textura.H)) == NULL)
- {
- fclose(F);
- return 0;
- }
- /* Считываем изображение в память по 3 бита, то бишь RGB для каждого пикселя */
- fseek(F, 30, SEEK_CUR);
- fread(get_textura.Image, 3, get_textura.W * get_textura.H, F);
- if (number == 1) {
- glGenTextures(1, &textura_id1);
- glBindTexture(GL_TEXTURE_2D, textura_id1);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- }
- if (number == 2) {
- glGenTextures(1, &textura_id2);
- glBindTexture(GL_TEXTURE_2D, textura_id2);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- }
- if (number == 3) {
- glGenTextures(1, &textura_id3);
- glBindTexture(GL_TEXTURE_2D, textura_id3);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- }
- gluBuild2DMipmaps(GL_TEXTURE_2D, 3, get_textura.W, get_textura.H, GL_BGR, GL_UNSIGNED_BYTE, get_textura.Image);
- free(get_textura.Image);
- fclose(F);
- return 1;
- }
- void Init(void) {
- glShadeModel(GL_SMOOTH); // Разрешить плавное цветовое сглаживание
- //rgb(186,157,249)
- glClearColor(0.2f, 0.2f, 0.2f, 0.0f); // Очистка экрана в черный цвет
- glClearDepth(1.0f); // Разрешить очистку буфера глубины
- glEnable(GL_DEPTH_TEST); // Разрешить тест глубины
- glDepthFunc(GL_LEQUAL); // Тип теста глубины
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Улучшение в вычислении перспективы
- GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f }; // Значения фонового света
- glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Установка Фонового Света
- GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // Значения диффузного света ( НОВОЕ )
- glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Установка Диффузного Света
- GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f }; // Позиция света
- glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); // Позиция света
- glEnable(GL_LIGHT1); // Разрешение источника света номер один
- glEnable(GL_LIGHTING); // включаем освещение
- }
- void DrawGLScene(void){
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Очистка экрана и буфера глубины
- glLoadIdentity(); // Сброс просмотра
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, textura_id1);
- glTranslatef(-4.0f, 0.0f, -9.0f); // Сдвиг влево и вглубь экрана
- glRotatef(rtrY, 0.0f, 1.0f, 0.0f); // Вращение по оси Y
- glRotatef(rtrX, 1.0f, 0.0f, 0.0f); //Вращение по оси X
- glRotatef(rtrZ, 0.0f, 0.0f, 1.0f); //Вращение по оси Z
- glBegin(GL_TRIANGLES); // Начало рисования TRIANGLES
- glNormal3f(0.0f, 0.0f, 1.0f); // Нормаль указывает на наблюдателя
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -1.0f, 1.0f); // Точка 1 (Перед)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Точка 2 (Перед)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Точка 3 (Перед)
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -1.0f, -2.0f); // Низ треугольника (Сзади)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, -2.0f); // Лево треугольника (Сзади)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -2.0f); // Право треугольника (Сзади)
- glEnd();
- glBegin(GL_QUADS); // Начало рисования QUADS
- glColor3ub(184, 216, 2); // Rio Grand
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Верх право квадрата (Левая)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -2.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, -1.0f, -2.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -1.0f, 1.0f); // Низ право
- glColor3ub(2, 184, 216); // Spain Sky
- glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Верх право квадрата (Право)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -2.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, -1.0f, -2.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -1.0f, 1.0f); // Низ право
- glColor3ub(155, 40, 255); // Veronica
- glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Верх право квадрата (Правая крышка)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -2.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 0.0f, -2.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 1.0f); // Низ право
- glColor3ub(119, 40, 255); // Blue Violet
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Верх право квадрата (Левая крышка)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -2.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 0.0f, -2.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 1.0f); // Низ право
- glEnd();
- glDisable(GL_TEXTURE_2D);
- ///////////////////////////////////////////////////////
- glLoadIdentity();
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, textura_id2);
- glTranslatef(0.0f, 0.0f, -9.0f); // Сдвиг влево и вглубь экрана
- glRotatef(rtrY, 0.0f, 1.0f, 0.0f); // Вращение по оси Y
- glRotatef(rtrX, 1.0f, 0.0f, 0.0f); //Вращение по оси X
- glRotatef(rtrZ, 0.0f, 0.0f, 1.0f); //Вращение по оси Z
- glBegin(GL_QUADS); // Рисуем куб
- glColor3ub(237, 90, 71); // Carmine
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 1.0f, -1.0f); // Право верх квадрата (Верх)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 1.0f, -3.0f); // Лево верх
- glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 1.0f, -3.0f); // Лево низ
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, -1.0f); // Право низ
- glColor3ub(213, 238, 23); // Arctic Lime
- glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Верх право квадрата (Низ
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Низ право
- glColor3ub(236, 179, 43); // Fuel Yellow
- glTexCoord2f(1.0f, 0.0f); glVertex3f(0.0f, 1.0f, -1.0f); // Верх право квадрата (Перед)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 1.0f, -1.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Низ право
- glColor3ub(229, 153, 142); //Tonis
- glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Верх право квадрата (Зад)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 1.0f, -3.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, -3.0f); // Низ право
- glColor3ub(100, 194, 160); // Tradewind
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 1.0f, -1.0f); // Верх право квадрата (Левая)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 1.0f, -3.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Низ право
- glColor3ub(128, 156, 61); // Sushi
- glTexCoord2f(1.0f, 0.0f); glVertex3f(0.0f, 1.0f, -3.0f); // Верх право квадрата (Право)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, 1.0f, -1.0f); // Верх лево
- glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Низ лево
- glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Низ право
- glEnd();
- glDisable(GL_TEXTURE_2D);
- ///////////////////////////////////////////////////////
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, textura_id3);
- glLoadIdentity();
- glTranslatef(4.0f, 0.0f, -9.0f); // Сдвиг влево и вглубь экрана
- glRotatef(rtrY, 0.0f, 1.0f, 0.0f); // Вращение по оси Y
- glRotatef(rtrX, 1.0f, 0.0f, 0.0f); //Вращение по оси X
- glRotatef(rtrZ, 0.0f, 0.0f, 1.0f); //Вращение по оси Z
- glBegin(GL_TRIANGLES); // Начало рисования TRIANGLES
- glColor3ub(224, 154, 63); // Tigers Eye
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); // Верх треугольника (Передняя)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Левая точка (Передняя)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Правая точка (Передняя)
- glColor3ub(148, 186, 196); // Niagara
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); // Верх треугольника (Правая)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Лево треугольника (Правая)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Право треугольника (Правая)
- glColor3ub(158, 166, 122); // Green Smoke
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); // Низ треугольника (Сзади)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Лево треугольника (Сзади)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Право треугольника (Сзади)
- glColor3ub(215, 80, 63); // Flame Pea
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); // Верх треугольника (Левая)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Лево треугольника (Левая)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Право треугольника (Левая)
- //нижняя часть
- glColor3ub(148, 186, 196); // Niagara
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -3.0f, 0.0f); // Верх треугольника (Передняя)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Левая точка (Передняя)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Правая точка (Передняя)
- glColor3ub(224, 154, 63); // Tigers Eye
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -3.0f, 0.0f); // Верх треугольника (Правая)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Лево треугольника (Правая)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Право треугольника (Правая)
- glColor3ub(215, 80, 63); // Flame Pea
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -3.0f, 0.0f); // Низ треугольника (Сзади)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Лево треугольника (Сзади)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Право треугольника (Сзади)
- glColor3ub(158, 166, 122); // Green Smoke
- glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, -3.0f, 0.0f); // Верх треугольника (Левая)
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Лево треугольника (Левая)
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Право треугольника (Левая)
- glEnd(); glFlush(); glDisable(GL_TEXTURE_2D); glutSwapBuffers();
- }
- void Reshape(int width, int height) {
- w = width;
- h = height;
- glViewport(0, 0, w, h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(70.0f, w / h, 0.1f, 1000);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- void keyboard(unsigned char key, int x, int y){
- switch (key) {
- case '1': rtrY += 10.5f; glutPostRedisplay(); break;
- case '2': rtrX += 10.5f; glutPostRedisplay(); break;
- case '3': rtrZ += 10.5f; glutPostRedisplay(); break;
- default: break;
- }
- }
- int main(int argc, char *argv[]) {
- glutInit(&argc, argv);
- glutInitWindowSize(1200, 600);
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
- glutCreateWindow("Lab 11");
- glutDisplayFunc(DrawGLScene);
- glutReshapeFunc(Reshape);
- glutKeyboardFunc(keyboard);
- if (LoadTexture((char *)"image1.bmp", 1) != 1){ printf("Не удалось загрузить изображение\n"); }
- if (LoadTexture((char *)"image2.bmp", 2) != 1){ printf("Не удалось загрузить изображение\n"); }
- if (LoadTexture((char *)"image3.bmp", 3) != 1){ printf("Не удалось загрузить изображение\n"); }
- Init();
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment