Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
BlackCoder
4 / 15 / 1
Регистрация: 17.11.2017
Сообщений: 51
1

OpenGL Загрузка текстуры

19.11.2017, 08:52. Просмотров 320. Ответов 3
Метки нет (Все метки)

Здравствуйте, недавно я решил перейти с Windows на Linux, и программировать 3д игры на нём на OpenGL. Я решил разобраться с текстурами, но glaux под linux нет. Поэтому я поставил SDL. Вроде текстуры должны грузиться, но они не грузятся. Должен получиться скайбокс, а получается белый куб.Вот код
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
[#include <GL/freeglut.h> 
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#include <GL/glx.h>
#include "SkyBox.cpp"
 
/*Глобальные переменные*/
int oldx,oldy;//Старые корды мыши
struct Camera{
    float xpos, ypos, zpos;//Позиция камеры
    float xangle, yangle; //Поворот камеры
};
 
Camera C;
 
/*Рисование*/
 
void DrawSetka(int size){//Рисуем сетку
/*Вертикальные линии по Z*/
glBegin(GL_LINES);
for(float i=0; i<size; i+=0.5){
    glVertex3f(i,0,0);
    glVertex3f(i,0,size);
}
glEnd();
/*Горизонтальные линии по Z*/
glBegin(GL_LINES);
for(float i=0; i<size; i+=0.5){
    glVertex3f(0,0,i);
    glVertex3f(size,0,i);
}
glEnd();
}
 
void Draw(){
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
 
gluLookAt(C.xpos, C.ypos, C.zpos,
      C.xpos+sin(C.xangle), C.ypos+cos(C.yangle), C.zpos+-cos(C.xangle),
      0, 1, 0);  //Устанавливаем камеру
 
DrawSkybox(30); //рисуем скайбокс 30 на 30 на 30 (ну смысли макс значиние на мин памяти, чтобы не висло)
DrawSetka(15); //Рисуем сетку 15 на 15
 
glFlush();
}
 
void Timer(int t){
Draw();
glutTimerFunc(1, Timer, 1);
}
 
/*Управление*/
void Mouse(int x, int y){ //Првороты головой, с помощью мыши
if(x<oldx)
    C.xangle -= 0.01;
if(x>oldx)
    C.xangle += 0.01;
if(y>oldy)
    C.yangle+=0.01;
if(y<oldy)
    C.yangle-=0.01;
oldx=x;
oldy=y;
}
 
void Keyboard(unsigned char key, int x2, int y2){//Переещение в пространстве клвиатурой
if(key=='w'){
    C.xpos+= sin(C.xangle) *0.1;
    C.zpos+= -cos(C.xangle) *0.1;
}
if(key=='s'){
    C.xpos-= sin(C.xangle) *0.1;
    C.zpos-= -cos(C.xangle) *0.1;
}
 
if(key=='d'){
    C.xpos-= -cos(270-C.xangle) *0.1;
    C.zpos-= sin(270-C.xangle) *0.1;
}
if(key=='a'){
    C.xpos-= -cos(180-C.xangle) *0.1;
    C.zpos-= sin(180-C.xangle) *0.1;
}
if(key==' ')
    C.ypos+=0.1;
if(key=='f')
    C.ypos-=0.1;
if(key=='q')
    exit(0);
}
 
/*Инициализация*/
int main(int argc, char** argv){ 
glutInit(&argc, argv); 
glutInitWindowPosition(0,0);
glutCreateWindow("SkyBox"); 
glutDisplayFunc(Draw);
glutTimerFunc(1, Timer, 1);//Покадровая отрисовка
 
/*Перспективная проекция*/
glMatrixMode(GL_PROJECTION);
gluPerspective(45,1,0,200);
glMatrixMode(GL_MODELVIEW);
 
/*Функции управления*/
glutMotionFunc(Mouse);//Мышь
glutKeyboardFunc(Keyboard);//Клавиатура
 
/*Сглаживание*/
glEnable(GL_BLEND);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glEnable(GL_LINE_SMOOTH);               
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);  
glEnable(GL_POLYGON_SMOOTH);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
 
LoadSkyBox(); //Загружаем скайбокс в массив
 
///
C.xpos=15;
C.ypos=2;
C.zpos=15;
///
 
glutMainLoop();
return 0; 
}
SkyBox.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <GL/freeglut.h> 
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glx.h>
#include <SDL/SDL.h>
#include <string>
#include <stdio.h> 
using namespace std;
 
GLuint Texture[5]; //Все наши 6 текстурок
 
void LoadTexture(string fname, int id) //Загрузка текстуры
{
    SDL_Surface *texture1 = NULL;
    texture1 = SDL_LoadBMP(fname.c_str());
    glGenTextures(1, &Texture[id]);
    glBindTexture(GL_TEXTURE_2D, Texture[id]);
    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->w, texture1->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1->pixels);
}
 
void LoadSkyBox(){ //Функция, которая закгружает в массив 6 изображений для скайбокса
LoadTexture("/home/blackcoder/SkyBox/SBI/behind.bmp", 0);//Сзади(за камерой)
LoadTexture("/home/blackcoder/SkyBox/SBI/center.bmp", 1);//Спереди(перед камерой)
LoadTexture("/home/blackcoder/SkyBox/SBI/down.bmp", 2);//Снизу(под камерой)
LoadTexture("/home/blackcoder/SkyBox/SBI/left.bmp", 3);//Слева от камеры
LoadTexture("/home/blackcoder/SkyBox/SBI/right.bmp", 4);//Справа от камеры
LoadTexture("/home/blackcoder/SkyBox/SBI/up.bmp", 5);//Над камерой
}
 
void DrawSkybox(int size){
/*Спереди*/
glBindTexture(GL_TEXTURE_2D, Texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(0,0,0);
glTexCoord2f(1,0); glVertex3f(size,0,0);
glTexCoord2f(1,1); glVertex3f(size,size,0);
glTexCoord2f(0,1); glVertex3f(0,size,0);
glEnd();
 
/*Сзади*/
glBindTexture(GL_TEXTURE_2D, Texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(0,0,size);
glTexCoord2f(1,0); glVertex3f(size,0,size);
glTexCoord2f(1,1); glVertex3f(size,size,size);
glTexCoord2f(0,1); glVertex3f(0,size,size);
glEnd();
 
/*Слева*/
glBindTexture(GL_TEXTURE_2D, Texture[3]);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(0,0,0);
glTexCoord2f(1,0); glVertex3f(0,0,size);
glTexCoord2f(1,1); glVertex3f(0,size,size);
glTexCoord2f(0,1); glVertex3f(0,size,0);
glEnd();
 
/*Справа*/
glBindTexture(GL_TEXTURE_2D, Texture[4]);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(size,0,0);
glTexCoord2f(1,0); glVertex3f(size,0,size);
glTexCoord2f(1,1); glVertex3f(size,size,size);
glTexCoord2f(0,1); glVertex3f(size,size,0);
glEnd();
 
/*Снизу*/
glBindTexture(GL_TEXTURE_2D, Texture[2]);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(0,0,0);
glTexCoord2f(1,0); glVertex3f(size,0,0);
glTexCoord2f(1,1); glVertex3f(size,0,size);
glTexCoord2f(0,1); glVertex3f(0,0,size);
glEnd();
 
/*Сверху*/
glBindTexture(GL_TEXTURE_2D, Texture[5]);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(0,size,0);
glTexCoord2f(1,0); glVertex3f(size,size,0);
glTexCoord2f(1,1); glVertex3f(size,size,size);
glTexCoord2f(0,1); glVertex3f(0,size,size);
glEnd();
}
В общем, можете помочь разобраться в чём дело, пожалуйста. Просто я уже облазил очень много форумов и сайтов, прежде, чем у меня это вообще скомпилировалось.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2017, 08:52
Ответы с готовыми решениями:

Текстуры OpenGL
Здравствуйте, изучаю OpenGL через Glut и интересует вопрос наложения текстур пока на 2D полигоны,...

OpenGL текстуры
// texture.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot;...

Текстуры в OpenGL ES 2.0
Добрый день! Есть анимированный спрайт. Кадры анимаций разбросаны на 2х текстурах размером...

Текстуры в OpenGL. Фильтрация
Всем привет! Программирую графику на openGL. Столкнулся с проблемой при работе с текстурами. А...

OpenGL текстуры и примитивы
Доброе время суток! Может кто подскажет, как в OpenGL поверх загруженной тектсуры нарисовать...

3
Antikl
с++
347 / 330 / 163
Регистрация: 15.07.2015
Сообщений: 1,745
Завершенные тесты: 6
19.11.2017, 10:13 2
зайди выбери lib для загрузки изображения
https://www.khronos.org/opengl/wiki/Image_Libraries
0
BlackCoder
4 / 15 / 1
Регистрация: 17.11.2017
Сообщений: 51
21.11.2017, 11:52  [ТС] 3
Цитата Сообщение от Antikl Посмотреть сообщение
зайди выбери lib для загрузки изображения
То есть SDL вообще никак не пойдёт?
0
Antikl
с++
347 / 330 / 163
Регистрация: 15.07.2015
Сообщений: 1,745
Завершенные тесты: 6
22.11.2017, 01:40 4
Цитата Сообщение от BlackCoder Посмотреть сообщение
То есть SDL вообще никак не пойдёт?
я ним давно пользовался, так что должно норм быть, но возможно будет проще использовать библиотеку только для загрузки
0
22.11.2017, 01:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2017, 01:40

Наложение текстуры в OpenGl
У меня возникла проблема на 6 уроке народного учебника по OpenGl (английская версия)не открывается...

Наложение текстуры opengl
Программирую в Dev cpp. Никак не могу найти код наложения текстур, который будет работать без...

Наложение текстуры. OpenGL ES 2
В общем занесло меня в очередной раз в область, связанную с OpenglES. Использую 2ю версию через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru