У меня проблема с загрузкой текстуры с использованием библиотеки SDL.
Обычно я делаю программы для Linux, но я пытаюсь создать код, совместимый также с Visual Studio.
В Linux все в порядке, но в Visual Studio происходит сбой в «GL_UNSIGNED_SHORT_5_6_5» в функции glTexImage2D (…).
Ниже приведено общее представление о том, что я хочу сделать, и которое вдохновило меня. этот руководство:
#include "stdafx.h"#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
//#include <GL/glext.h>
#include "SDL.h"
int brick;
float c=0.5;
float rx_min=0, ry_min=0;
float rx_max=1, ry_max=1;
unsigned int LoadTexture(const char* filename);
void DrawTexture(int object);
void setupmywindow();
void myDrawing();void setupmywindow()
{
glClearColor(1.0,1.0,1.0,0);
glColor3f(0.0, 0.0, 0.0);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
gluOrtho2D(rx_min,ry_min, rx_max, ry_max);
brick = LoadTexture("brick.bmp");
}
void DrawTexture(int object)
{
glBindTexture(GL_TEXTURE_2D, object);
glColor3f(c,c,c);
glBegin(GL_QUADS);
glTexCoord2f(0., 1. );
glVertex2f( rx_min , ry_min );
glTexCoord2f(0., 0. );
glVertex2f( rx_min, ry_max );
glTexCoord2f(1., 0. );
glVertex2f( rx_max , ry_max );
glTexCoord2f(1., 1. );
glVertex2f( rx_max , ry_min );
glEnd();
}
unsigned int LoadTexture(const char* filename)
{
SDL_Surface* img=SDL_LoadBMP(filename);
unsigned int id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D,id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->w, img->h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, img->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
SDL_FreeSurface(img);
return id;
}
void myDrawing()
{
glClear(GL_COLOR_BUFFER_BIT);
DrawTexture(brick);
glFlush();
}
int main(int argc, char **argv)
{
printf("AUTH Computational Physics - Computer Graphics\n");
printf("Project >>TestTexture.cpp\n");
printf("--------------------------------------------------------\n");
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(50,50);
glutCreateWindow("Texture Test");
setupmywindow();
glutDisplayFunc(myDrawing);
glutMainLoop();
return 0;
}
Ошибка:
ошибка C2065: «GL_UNSIGNED_SHORT_5_6_5»: необъявленный идентификатор
Вот это изображение, которое я пытаюсь загрузить, и оно настроено как растровое изображение (8bit 5 6 5) с GIMP 2.8
НОТА: Когда я uncoment #включают < GL / glext.h> который не нужен в Linux, я получаю сообщение выше:
Необработанное исключение в 0x00d1193f в testTesxture.exe: 0xC0000005: Место чтения нарушения доступа 0x00000014.
Как правило, если я сохраняю растровое изображение (например, с помощью краски), как я могу понять тип нужного мне типа (GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_BYTE и т. Д.)?
Проблема, вероятно, в том, что Windows использует более старую версию OpenGL, чем Linux, и эта старая версия OpenGL не имеет этого конкретного идентификатора (и других, я уверен). Чтобы обойти эту и любые другие возможные проблемы с версией, я бы использовал GLEW которая делает тяжелую работу для вас.
В окнах добавьте эту строку после include:
#ifndef GL_UNSIGNED_SHORT_5_6_5
#define GL_UNSIGNED_SHORT_5_6_5 0x8363
#endif
#ifndef GL_CLAMP_TO_EDGE
#define GL_CLAMP_TO_EDGE 0x812F
#endif
В соответствии с https://www.youtube.com/user/thecplusplusguy