2013-05-13 84 views
1

我在使用SDL库加载纹理时遇到问题。GL_UNSIGNED_SHORT_5_6_5未申报?

通常我在Linux上制作程序,但我尝试创建一个与Visual Studio兼容的代码。 在Linux上一切正常,但在Visual Studio上,它在glTexImage2D(...)函数中的“GL_UNSIGNED_SHORT_5_6_5”中崩溃。

下面是关于什么我想做的事情,我通过this教程激发了总体思路:

#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“:未声明的标识符

Here是我尝试加载的图像,它使用GIMP 2配置为位图(8位5 6 5) 0.8

注意:当我uncoment 的#include < GL/glext.h>这是没有必要在Linux上,我得到了上述消息:0000005:在testTesxture.exe在0x00d1193f 未处理的异常访问违反阅读地点0x00000014。

通常,如果我保存一个位图图像(例如油漆),我该如何理解我必须放置的类型(GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_BYTE等)?

+1

为什么你'#包括'注释掉? – olevegard 2013-05-13 11:49:07

+0

对不起,我应该取消注释。它编译但结果如下:testTesxture.exe中的0x00d1193f未处理的异常:0xC0000005:访问冲突读取位置0x00000014。 – Nebula 2013-05-13 11:59:43

回答

3

问题很可能是Windows使用比Linux更早的OpenGL版本,而这个旧的OpenGL版本没有这个特定的标识符(和其他人,我敢肯定)。为了解决这个问题以及任何其他可能的版本问题,我会使用GLEW,这对你来说很辛苦。

+0

我应该改变图像的格式,并用别的东西改变GL_UNSIGNED_SHORT_5_6_5吗?如果是,我该怎么做? – Nebula 2013-05-13 12:02:23

+1

我仍然会推荐使用GLEW来通过Windows使用的真正非常旧的OpenGL版本,如果没有告诉其他的话。我不知道不同版本支持哪些格式。 – 2013-05-13 12:05:24