Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 02.05.2017
Сообщений: 8

Нанесение текстур в OpenGL

31.10.2018, 03:47. Показов 2292. Ответов 5

Author24 — интернет-сервис помощи студентам
Помогите создать текстуру и нанести на объект.
Раньше пользовался библиотекой "glaux.h", через auxDIBImageLoad и прочее.
Сейчас поддержка библиотеки прекращена. Пишут попробуй через GLUT.
Но в инете мало информации по этому поводу. А если и есть код, то в контексте. Который при вставке не работает и выдает ещё больше ошибок.
Просьба написать проект "hello world" с текстурами - нарисовать треугольник с текстурой. Дальше я справлюсь сам...
Opengl версии 2.0
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.10.2018, 03:47
Ответы с готовыми решениями:

Несовместимость текстур OpenGl
Сделал проект, использую текстуры с высокими расширениями, запустил на другом компе, и увидел, только полигоны без текстур, нашёл что нужно...

Наложение текстур в OpenGL ES 2
Здравствуйте. Пишу на OpenGL ES 2 под андроид. Никак не могу разобраться как наложить текстуру на полигон. В общем мне надо чтобы текстура...

Размер текстур в OpenGL
Хотелось бы услышать комментарии по двум вопросам: 1) Текстуры со сторонами равными степени двойки Много раз натыкался на литературу...

5
Модератор
 Аватар для vxg
3402 / 2173 / 353
Регистрация: 13.01.2012
Сообщений: 8,430
31.10.2018, 08:22
saratov209, например тут Библиотека графических примитивов. Отдаю всем хорошим людям - не жалко
0
7972 / 2922 / 489
Регистрация: 05.10.2013
Сообщений: 7,829
Записей в блоге: 209
02.11.2018, 02:52
Цитата Сообщение от saratov209 Посмотреть сообщение
Раньше пользовался библиотекой "glaux.h", через auxDIBImageLoad и прочее.
Я в одном туториале посмотрел как использовать библиотеку lodePNG. С тех пор только её и использую. Если нахожу текстуру не в PNG формате, то перевожу с помощью бесплатного легковесного редактора GIMP путём импорта/экспорта. lodePNG, кстати, есть в списке разрешённых на официальном сайте разработчиков OpenGL: https://www.khronos.org/opengl... _Libraries

В этой серии туториалов есть тот самый урок по которому я научился использованию lodePNG: Advanced C++/Graphics

Этот урок находится под номером 12, но придётся сначала делать с первого урока, так даже познавательно будет. Если хотите, я могу исходники урока скинуть. Но лучше самому набрать, так поймёте что к чему.

Если хочется минимальный пример, то по урокам выше я сделал вывод текстуры на квадрат. Окно создаётся с помощью SFML. Версия OpenGL 3.1. Делал в VS2015, но должно работать в 2012-2017, но только Target Platform в настройках нужно заменить на вашу версию VS: TexturedRectangle_SfmlOpenGL31Cpp.zip

Если SFML не устраивает, могу подправить под: freeGLUT/GLUT, GLFW, SDL2 или WinAPI. На WinAPI у меня есть готовый пример с прямоугольником и текстурой, могу прикрепить, там нужно будет другую текстуру скопировать, сейчас не охота.

2
0 / 0 / 0
Регистрация: 02.05.2017
Сообщений: 8
02.11.2018, 08:55  [ТС]
8Observer8, Спасибо большое.
Но мне нужен opengl 2.0, с использованием glut (или freeglut, вроде разницы не вижу).
OpenGL 3.1 и выше мне кажется сильно отличаются. Хотя это наверное и не важно.
Раньше у меня были все нужные файлы на руках, чтобы без проблем всё компилировалось и запускалось.
Вот пример исходного кода, который 100% работал. Но я потерял файлы проекта, а текст остался. Запускалось в VS2010 (сейчас правда стоит 2017, но думаю не суть):
Кликните здесь для просмотра всего текста
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#include "stdafx.h"
 
#include <stdlib.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include "include\GL\glew.h"
#include "include\GL\freeglut.h"
 
#include "glaux.h"
#pragma comment (lib, "glaux.lib")
 
GLuint texture[2];      // место для каждой текстуры
 
float fLookH = 5;
struct Mouse {
    int x;
    int y;
    bool down;
} M;
 
int iAngle, iAngle1, iExact = 5;
GLdouble fCam0[3];
GLdouble fCam1[3];
GLdouble fVec[2];
float fAngle;
float fAngle1;
int pp=0;
 
GLvoid LoadGLTextures()
{
    for (int i = 0; i<2; i++) {
        LPCWSTR cstr;
        switch (i) {
            case 0: cstr = L"textures/0.bmp"; break;
            case 1: cstr = L"textures/1.bmp"; break;
            case 2: cstr = L"textures/2.bmp"; break;
        }
        AUX_RGBImageRec *texture_m;
        texture_m = auxDIBImageLoad(cstr);  // Создание текстуры
        glGenTextures(1, &texture[i]);
        glBindTexture(GL_TEXTURE_2D, texture[i]);
        glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_m->sizeX, texture_m->sizeY, 0,
            GL_RGB, GL_UNSIGNED_BYTE, texture_m->data);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    }
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
}
 
void changeSize(int w, int h) {
    // предотвращение делени¤ на ноль
    if (h == 0)
        h = 1;
    float ratio = w * 1.0 / h;
    // используем матрицу проекции
    glMatrixMode(GL_PROJECTION);
    // обнул¤ем матрицу
    glLoadIdentity();
    // установить параметры вьюпорта
    glViewport(0, 0, w, h);
    // установить корректную перспективу
    gluPerspective(45.0f, ratio, 0.1f, 100.0f);
    // вернутьс¤ к матрице проекции
    glMatrixMode(GL_MODELVIEW);
}
 
void Draw_Figure() 
{
    int gr = 10;
    for (int j=0; j<360; j+=gr) {
        glPushMatrix();
        glRotated(j,0,0,1);
        double h = 0.01;
        double R = 1.0;
        int N = R/h;
        for (int ii = -N; ii<N; ii++)
        {
            double i = (double)ii*h;
            double i1 = (double)(ii+1)*h;
            double imod = i/sqrt(i*i);
            double imod1 = i1/sqrt(i1*i1);
            double y = i*imod;
            double y1 = i1*imod1;
            double y2 = i*imod*cos(gr*M_PI/180);
            double y3 = i1*imod1*cos(gr*M_PI/180);
            double x = 0;
            double x1 = 0;
            double x2 = y*sin(gr*M_PI/180);
            double x3 = y1*sin(gr*M_PI/180);
            double dz = sqrt(R-i*i)*imod;
            double dz1 = sqrt(R-i1*i1)*imod1;
            double B = atan(dz/y) * 180.0 / M_PI;
            double B1 = atan(dz1/y1) * 180.0 / M_PI;
            double z = (dz>0) ? dz-R*pow(B/90,3) : dz-R*pow(B/90,3);
            double z1 = (dz1>0) ? dz1-R*pow(B1/90,3) : dz1-R*pow(B1/90,3);
            double tx = (double)j/360;
            double tx1 = (double)((double)j-gr)/360;
            double ty = 1-(i+R)/2+0.5;
            double ty1 = 1-(i+h+R)/2+0.5;
            glBegin(GL_QUADS);
                glTexCoord2d(tx, ty); glVertex3f(x, y, z);
                glTexCoord2d(tx1, ty); glVertex3f(x2, y2, z);
                glTexCoord2d(tx1, ty1); glVertex3f(x3, y3, z1);
                glTexCoord2d(tx, ty1); glVertex3f(x1, y1, z1);
            glEnd();
        }
        glPopMatrix();
    }
}
 
void renderScene(void) {
    // очистить буфер цвета и глубины
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // обнулить трансформацию
    glLoadIdentity();
    // установить камеру
 
    iAngle %= 360 * iExact;
    float fAngle = iAngle*M_PI / 180 / iExact;
    
    if (iAngle1<1) {
        iAngle1 = 1;
    }
    if (iAngle1>=360 * iExact / 2) {
        iAngle1 = 360 * iExact / 2-1;
    }
    
    fVec[0] = sin(fAngle);
    fVec[1] = cos(fAngle);
 
    fAngle1 = iAngle1*M_PI / 180 / iExact;
    fCam1[0] = 0;
    fCam1[1] = 0;
    fCam1[2] = 0;
    fCam0[0] = fCam1[0]+fLookH*fVec[0] * sin(fAngle1);
    fCam0[1] = fCam1[1]+fLookH*fVec[1] * sin(fAngle1);
    fCam0[2] = fCam1[2]+fLookH*cos(fAngle1);
    gluLookAt(fCam0[0], fCam0[1], fCam0[2], fCam1[0], fCam1[1], fCam1[2], 0, 0, 1);
 
    Draw_Figure();
    glutSwapBuffers();
}
 
// -----------------------------------  //
//            клавиатура              //
// -----------------------------------  //
 
void processNormalKeys(unsigned char key, int x, int y) {
    if (key == 27)
        exit(0);
    if (key == '1')
        glBindTexture(GL_TEXTURE_2D, texture[0]);
    if (key == '2')
        glBindTexture(GL_TEXTURE_2D, texture[1]);
}
 
void processSpecialKeys(int key, int xx, int yy) {
 
}
 
void funcMouse(int button, int state, int x, int y) {
    if (state == GLUT_DOWN && button == GLUT_LEFT_BUTTON)
        M.down = true;
    if (state == GLUT_UP && button == GLUT_LEFT_BUTTON)
        M.down = false;
    M.x = x;
    M.y = y;
    renderScene();
}
 
void funcMouseMotion(int x, int y) {
    if (M.down) {
        iAngle -= (M.x - x);
        iAngle1 += (M.y - y);
    }
    M.x = x;
    M.y = y;
    renderScene();
}
 
void funcMouseWheel(int wheel, int direction, int x, int y) {
    if (direction>0) {
        fLookH += 1;
    }
    else {
        fLookH -= 1;
    }
    if (fLookH<1) {
        fLookH = 1;
    }
    if (fLookH>50) {
        fLookH = 50;
    }
}
 
int main(int argc, char **argv) {
 
    // инициализаци¤ GLUT и создание окна
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(640, 480);
    glutCreateWindow("Фигура с текстурой");
    LoadGLTextures();
 
    //регистрация
    glutDisplayFunc(renderScene);
    glutReshapeFunc(changeSize);
    glutIdleFunc(renderScene);
 
    glutKeyboardFunc(processNormalKeys);
    glutSpecialFunc(processSpecialKeys);
 
    glutMouseFunc(funcMouse);
    glutMotionFunc(funcMouseMotion);
    glutMouseWheelFunc(funcMouseWheel);
 
    // OpenGL инициализация функций
    glEnable(GL_DEPTH_TEST);
    //glEnable(GL_CULL_FACE);
 
    // главный цикл
    glutMainLoop();
 
    return 1;
}

А сейчас у меня уходит 72 часа в сутки, чтобы найти:
- либо те файлы (*.h, *.dll, *.lib), с которыми всё работало.
- либо поиск альтернативы, чтобы на минималках переписать функцию "LoadGLTextures()"

Какой формат изображений - не сильно важно. Png или bmp - я их всё равно предварительно (в ручную) могу конвертировать в нужный формат.
Попытался запилить в свой код "loadPNG" вместе с "readFileToBuffer" (см. ниже), но что-то не хочет запускаться. Хотя чисто ваша программа работает.

Кликните здесь для просмотра всего текста
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#include "pch.h"
 
#include <stdlib.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include "include/GL/freeglut.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "picoPNG.h"
 
struct GLTexture
{
    GLuint id;
    int width;
    int height;
};
 
GLuint texture[2];      // место для каждой текстуры
 
float fLookH = 5;
struct Mouse {
    int x;
    int y;
    bool down;
} M;
 
int iAngle, iAngle1, iExact = 5;
GLdouble fCam0[3];
GLdouble fCam1[3];
GLdouble fVec[2];
float fAngle;
float fAngle1;
int pp = 0;
 
void LoadTextures(GLTexture texture_0)
{
    texture[0] = texture_0.id;
    texture[1] = texture_0.id;
    texture[2] = texture_0.id;
}
 
bool readFileToBuffer(const std::string & filePath, std::vector<unsigned char>& buffer)
{
    std::ifstream file(filePath, std::ios::binary);
    if (file.fail())
    {
        perror(filePath.c_str());
        return false;
    }
 
    // Seek to the end
    file.seekg(0, std::ios::end);
 
    // Get the file size
    int fileSize = file.tellg();
    file.seekg(0, std::ios::beg);
 
    // Reduce the file size by any header bytes might be present
    fileSize -= file.tellg();
 
    buffer.resize(fileSize);
    file.read((char *)&(buffer[0]), fileSize);
 
    file.close();
 
    return true;
}
 
GLTexture loadPNG(std::string filePath)
{
    GLTexture texture = {};
 
    std::vector<unsigned char> in;
    std::vector<unsigned char> out;
    unsigned long width, height;
 
 
    if (readFileToBuffer(filePath, in) == false)
    {
        //OutErrorMsg(_T("Failed to load PNG file to buffer!"));
    }
 
    int errorCode = decodePNG(out, width, height, &(in[0]), in.size());
    if (errorCode != 0)
    {
        std::cout << "decodePNG failed with error: " << errorCode << std::endl;
        std::getchar();
    }
 
    glGenTextures(1, &(texture.id));
 
    glBindTexture(GL_TEXTURE_2D, texture.id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &(out[0]));
 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 
    // Generate the mipmaps
    //glGenerateMipmap(GL_TEXTURE_2D);
 
    // Unbind the texture
    glBindTexture(GL_TEXTURE_2D, 0);
 
    texture.width = width;
    texture.height = height;
 
    // Return a copy of the texture data
    return texture;
}
 
void changeSize(int w, int h) {
    // предотвращение делени¤ на ноль
    if (h == 0)
        h = 1;
    float ratio = w * 1.0 / h;
    // используем матрицу проекции
    glMatrixMode(GL_PROJECTION);
    // обнул¤ем матрицу
    glLoadIdentity();
    // установить параметры вьюпорта
    glViewport(0, 0, w, h);
    // установить корректную перспективу
    gluPerspective(45.0f, ratio, 0.1f, 100.0f);
    // вернутьс¤ к матрице проекции
    glMatrixMode(GL_MODELVIEW);
}
 
void Draw_Figure()
{
    int gr = 10;
    for (int j = 0; j < 360; j += gr) {
        glPushMatrix();
        glRotated(j, 0, 0, 1);
        double h = 0.01;
        double R = 1.0;
        int N = R / h;
        for (int ii = -N; ii < N; ii++)
        {
            double i = (double)ii*h;
            double i1 = (double)(ii + 1)*h;
            double imod = i / sqrt(i*i);
            double imod1 = i1 / sqrt(i1*i1);
            double y = i * imod;
            double y1 = i1 * imod1;
            double y2 = i * imod*cos(gr*M_PI / 180);
            double y3 = i1 * imod1*cos(gr*M_PI / 180);
            double x = 0;
            double x1 = 0;
            double x2 = y * sin(gr*M_PI / 180);
            double x3 = y1 * sin(gr*M_PI / 180);
            double dz = sqrt(R - i * i)*imod;
            double dz1 = sqrt(R - i1 * i1)*imod1;
            double B = atan(dz / y) * 180.0 / M_PI;
            double B1 = atan(dz1 / y1) * 180.0 / M_PI;
            double z = (dz > 0) ? dz - R * pow(B / 90, 3) : dz - R * pow(B / 90, 3);
            double z1 = (dz1 > 0) ? dz1 - R * pow(B1 / 90, 3) : dz1 - R * pow(B1 / 90, 3);
            double tx = (double)j / 360;
            double tx1 = (double)((double)j - gr) / 360;
            double ty = 1 - (i + R) / 2 + 0.5;
            double ty1 = 1 - (i + h + R) / 2 + 0.5;
            glBegin(GL_QUADS);
            glTexCoord2d(tx, ty); glVertex3f(x, y, z);
            glTexCoord2d(tx1, ty); glVertex3f(x2, y2, z);
            glTexCoord2d(tx1, ty1); glVertex3f(x3, y3, z1);
            glTexCoord2d(tx, ty1); glVertex3f(x1, y1, z1);
            glEnd();
        }
        glPopMatrix();
    }
}
 
void renderScene(void) {
    // очистить буфер цвета и глубины
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // обнулить трансформацию
    glLoadIdentity();
    // установить камеру
 
    iAngle %= 360 * iExact;
    float fAngle = iAngle * M_PI / 180 / iExact;
 
    if (iAngle1 < 1) {
        iAngle1 = 1;
    }
    if (iAngle1 >= 360 * iExact / 2) {
        iAngle1 = 360 * iExact / 2 - 1;
    }
 
    fVec[0] = sin(fAngle);
    fVec[1] = cos(fAngle);
 
    fAngle1 = iAngle1 * M_PI / 180 / iExact;
    fCam1[0] = 0;
    fCam1[1] = 0;
    fCam1[2] = 0;
    fCam0[0] = fCam1[0] + fLookH * fVec[0] * sin(fAngle1);
    fCam0[1] = fCam1[1] + fLookH * fVec[1] * sin(fAngle1);
    fCam0[2] = fCam1[2] + fLookH * cos(fAngle1);
    gluLookAt(fCam0[0], fCam0[1], fCam0[2], fCam1[0], fCam1[1], fCam1[2], 0, 0, 1);
 
    Draw_Figure();
    glutSwapBuffers();
}
 
// -----------------------------------  //
//            клавиатура              //
// -----------------------------------  //
 
void processNormalKeys(unsigned char key, int x, int y) {
    if (key == 27)
        exit(0);
    if (key == '1')
        glBindTexture(GL_TEXTURE_2D, texture[0]);
    if (key == '2')
        glBindTexture(GL_TEXTURE_2D, texture[1]);
}
 
void processSpecialKeys(int key, int xx, int yy) {
 
}
 
void funcMouse(int button, int state, int x, int y) {
    if (state == GLUT_DOWN && button == GLUT_LEFT_BUTTON)
        M.down = true;
    if (state == GLUT_UP && button == GLUT_LEFT_BUTTON)
        M.down = false;
    M.x = x;
    M.y = y;
    renderScene();
}
 
void funcMouseMotion(int x, int y) {
    if (M.down) {
        iAngle -= (M.x - x);
        iAngle1 += (M.y - y);
    }
    M.x = x;
    M.y = y;
    renderScene();
}
 
void funcMouseWheel(int wheel, int direction, int x, int y) {
    if (direction > 0) {
        fLookH += 1;
    }
    else {
        fLookH -= 1;
    }
    if (fLookH < 1) {
        fLookH = 1;
    }
    if (fLookH > 50) {
        fLookH = 50;
    }
}
 
GLTexture loadPNG(std::string filePath);
bool readFileToBuffer(const std::string& filePath, std::vector<unsigned char>& buffer);
 
int main(int argc, char **argv) {
 
    // инициализаци¤ GLUT и создание окна
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(640, 480);
 
    std::string texturePath = "0.png";
    GLTexture newTexture = loadPNG(texturePath);
    LoadTextures(newTexture);
 
 
    glutCreateWindow("Ку");
    //LoadGLTextures();
 
    //регистрация
    glutDisplayFunc(renderScene);
    glutReshapeFunc(changeSize);
    glutIdleFunc(renderScene);
 
    glutKeyboardFunc(processNormalKeys);
    glutSpecialFunc(processSpecialKeys);
 
    glutMouseFunc(funcMouse);
    glutMotionFunc(funcMouseMotion);
    glutMouseWheelFunc(funcMouseWheel);
 
    // OpenGL инициализация функций
    glEnable(GL_DEPTH_TEST);
    //glEnable(GL_CULL_FACE);
 
    // главный цикл
    glutMainLoop();
 
    return 1;
}


Выдает ошибку:
Кликните здесь для просмотра всего текста
Ошибка LNK2019 ссылка на неразрешенный внешний символ "int __cdecl decodePNG(class std::vector<unsigned char,class std::allocator<unsigned char> > &,unsigned long &,unsigned long &,unsigned char const *,unsigned int,bool)" (?decodePNG@@YAHAAV?$vector@EV?$allocato r@E@std@@@std@@AAK1PBEI_N@Z) в функции "struct GLTexture __cdecl loadPNG(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?loadPNG@@YA?AUGLTexture@@V?$basic_stri ng@DU?$char_traits@D@std@@V?$allocator@D @2@@std@@@Z) ConsoleApplication2 C:\Users\Александр\Desktop\Графика OpenGL\ConsoleApplication2\ConsoleApplic ation2\ConsoleApplication2.obj 1
0
7972 / 2922 / 489
Регистрация: 05.10.2013
Сообщений: 7,829
Записей в блоге: 209
05.11.2018, 22:07
Цитата Сообщение от saratov209 Посмотреть сообщение
OpenGL 3.1 и выше мне кажется сильно отличаются.
Если сравнивать OpenGL 1.5 и OpenGL 2.0, то они очень сильно отличаются, потому что в 2.0 применяются шейдеры.

Перевести с 3.1 на 2.0 очень просто:
  • "in/out" заменяется на "varying"
  • "in" заменяется на "attribute"
  • По таблице из Википедии по GLSL History меняем "#version 140" на "#version 110"

Цитата Сообщение от saratov209 Посмотреть сообщение
с использованием glut (или freeglut, вроде разницы не вижу)
И я не видел. Я так полагаю, что разница лишь в том, что FreeGLUT является OpenSource версией GLUT. Я вижу только один большой недостаток у GLUT, что нет версии x64, а самому собирать из исходников не получится, потому что нет исходников в свободном доступе. Зато FreeGLUT идёт в двух версиях: x86 и x64. Для меня это критично, потому что если мой пример открыть, то VS почему то переключается в x64 и когда человек нажимает кнопку "Запустить проект", то получает ошибку. А с FreeGLUT такой ошибки нет, потому что есть настроенная версия x64.

Пару слов про библиотеки для создания окна и обработки клавиатуры/мыши. Такой код занимает очень небольшой процент от всего OpenGL проекта. У библиотек GLFW, FreeGLUT, SFML и SDL2 очень сходные принципы в отличие от WinAPI. Код создания окна для вывода OpenGL-графики на этих библиотеках несложно найти в интернете. Более всего популярен GLFW. Почти во всех современных книгах и туториалах используют GLFW. Но опять же, имея интернет, несложно будет перевести с FreeGLUT на GLFW. Если нужен звук или мультипеер, то лучше взять SDL2 или SFML. Зато FreeGLUT и GLFW весят в 10 раз меньше: 500 КБайт против 5МБайт.

C++ Скопировано
1
2
3
4
5
6
            glBegin(GL_QUADS);
            glTexCoord2d(tx, ty); glVertex3f(x, y, z);
            glTexCoord2d(tx1, ty); glVertex3f(x2, y2, z);
            glTexCoord2d(tx1, ty1); glVertex3f(x3, y3, z1);
            glTexCoord2d(tx, ty1); glVertex3f(x1, y1, z1);
            glEnd();
Это 1.5, а не 2.0. Я могу только на шейдерах. Отличная книга по введению в шейдерный OpenGL 2.0: WebGL. Программирование трехмерной графики. Не смотрите, что примеры в ней на JavaScript. Книга не про JS, а про OpenGL. Примеры легко переводятся на C++.

Цитата Сообщение от saratov209 Посмотреть сообщение
Вот пример исходного кода, который 100% работал. Но я потерял файлы проекта, а текст остался. Запускалось в VS2010 (сейчас правда стоит 2017, но думаю не суть)
Я сделал вам пример: TexturedRectangle_FreeGlutOpenGL20Cpp.zip

Название: TexturedRectangle_FreeGlutOpenGL20Cpp.png
Просмотров: 841

Размер: 72.3 Кб

Я даже добавил библиотеку GLM, чтобы можно было менять координаты, угол и размер прямоугольника с рисунком. GLM - это библиотека для работы с матрицами, векторами и т.д.

Только перед запуском примера не забудьте переключить в настройках "Platform Toolset" на VS2017. Должно сработать по принципу: скачал архив примера, извлёк из архива, открыл проект, поменял toolset на VS2017, запустил, работает. Если не сработает, но напишите, что выводит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.11.2018, 22:07
Помогаю со студенческими работами здесь

Загрузка текстур OpenGL
Прошу помощи.В программе с библиотеками OpenGL загружаются картинки PNG размером только 32 X 32.Если картинка больше,то не...

Загрузка текстур в OpenGL
Здравствуйте. У меня вот такая проблема: Мне нужно загрузить текстуру. Раньше пользовался для этого функцией glTexImage2D, которой...

Создать библиотеку текстур OpenGL
Всем привет, написал программу, которая загружала несколько текстур, а после накладывала их на выбранные обьекты. Препод дал новое задание,...

OpenGl glsl много текстур
Не могу разобраться как использовать много текстур, например, пусть у меня 2Д мир, и есть много разных спрайтов, пусть каждый спрайт...

Одновременное отображение граней и текстур в OpenGL
Доброго времени суток. Необходимо отрендерить трехмерный куб с наложенной на него текстурой и одновременным отображением граней (пример...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Полностью асинхронный счётчик на логике (сумматорах) трёх состояний и асинхронных регистрах трёх состояний. Структура "электронный Buttom Up"
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер