1

我在使用 SDL 库加载纹理时遇到问题。

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

以下是我受本教程启发的关于我想做的事情的一般想法:

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

是我尝试加载的图像,它被配置为带有 GIMP 2.8 的位图(8bit 5 6 5)

注意:当我取消注释 Linux 上不需要的#include < GL/gext.h >时,我收到上述消息:testTesxture.exe 中 0x00d1193f 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000014。

通常,如果我保存位图图像(例如使用绘画),我如何理解我必须放置的类型(GL_UNSIGNED_SHORT_5_6_5、GL_UNSIGNED_BYTE 等)?

4

2 回答 2

3

问题可能是 Windows 使用了比 Linux 更旧的 OpenGL 版本,而这个旧的 OpenGL 版本没有那个特定的标识符(我敢肯定还有其他标识符)。为了解决这个问题和任何其他可能的版本问题,我会使用GLEW来为您完成艰苦的工作。

于 2013-05-13T11:48:25.093 回答
0

在 Windows 中,在包含后添加此行:

 #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

根据这个视频

于 2015-06-21T13:49:26.413 回答