加载3D纹理:Linux Eclipse上的SDL / OpenGL

时间:2011-07-15 15:14:54

标签: linux eclipse opengl sdl textures

在FC15上的C OpenGL编程中,Eclipse和SDL纹理存在一个奇怪的问题。

对于设置测试目的,使用NeHe示例代码: http://bigdaddysurf.com/blog/?p=21

如果我们使用

在控制台上运行它,程序就会运行并加载纹理
$ make
$ ./lesson07 

- 因此,所有环境所需的lib都已安装并存在于linux开发环境中。但是,如果我们尝试在IDE Eclipse上执行相同操作,程序会运行,但不会加载任何纹理,因此我们只能看到一个没有纹理的白框。

项目环境的设置将libs放入链接器库(L),例如SDL,SDLmain,SDL_image,GL,GLU等 - 例如: OpenGL and GLUT in Eclipse on OS X

SDL程序适用于键盘等输入。但是,纹理不会加载。

在NeHe提供的Makefile中使用的是在控制台中运行命令行,我注意到以下信息:

CC = gcc -Wall -ansi
all:
$(CC) lesson07.c -o lesson07 -lGL -lGLU `sdl-config --cflags --libs`

然后,读取在IDE Eclipse上自动生成的Makefile,我发现显然缺少这个额外的标志:sdl-config --cflags --libs。应该是这个额外的标志是什么阻止命令SDL_LoadBMP显示纹理?

如果是这样,有关如何正确调整Eclipse设置的附加信息以允许生成的IDE Makefile正常工作的一些建议?

关于加载纹理的方式,这是函数:

int LoadGLTextures( )
{
/* Status indicator */
int Status = FALSE;

/* Create storage space for the texture */
SDL_Surface *TextureImage[1];

/* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */
if ( ( TextureImage[0] = SDL_LoadBMP( "data/crate.bmp" ) ) )
    {

    /* Set the status to true */
    Status = TRUE;

    /* Create The Texture */
    glGenTextures( 3, &texture[0] );

    /* Load in texture 1 */
    /* Typical Texture Generation Using Data From The Bitmap */
    glBindTexture( GL_TEXTURE_2D, texture[0] );

    /* Generate The Texture */
    glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[0]->w,
          TextureImage[0]->h, 0, GL_BGR,
          GL_UNSIGNED_BYTE, TextureImage[0]->pixels );

    /* Nearest Filtering */
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
             GL_NEAREST );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
             GL_NEAREST );

    /* Load in texture 2 */
    /* Typical Texture Generation Using Data From The Bitmap */
    glBindTexture( GL_TEXTURE_2D, texture[1] );

    /* Linear Filtering */
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
             GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
             GL_LINEAR );

    /* Generate The Texture */
    glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[0]->w,
          TextureImage[0]->h, 0, GL_BGR,
          GL_UNSIGNED_BYTE, TextureImage[0]->pixels );

    /* Load in texture 3 */
    /* Typical Texture Generation Using Data From The Bitmap */
    glBindTexture( GL_TEXTURE_2D, texture[2] );

    /* Mipmapped Filtering */
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
             GL_LINEAR_MIPMAP_NEAREST );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
             GL_LINEAR );

    /* Generate The MipMapped Texture ( NEW ) */
    gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[0]->w,
               TextureImage[0]->h, GL_BGR,
               GL_UNSIGNED_BYTE, TextureImage[0]->pixels );
    }

/* Free up any memory we may have used */
if ( TextureImage[0] )
    SDL_FreeSurface( TextureImage[0] );

return Status;
}

所有评论都非常感谢。

1 个答案:

答案 0 :(得分:3)

纹理文件的路径是否是硬编码的?它是重要的吗?然后必须从正确的目录启动程序,以便相对路径实际评估纹理,否则找不到文件并且没有加载纹理。

IDE倾向于在构建目录中编译和运行已编译的二进制文件,从而破坏任何硬编码文件路径。 Eclipse只是没有使用正确的工作目录启动程序。根据操作系统,有多种方法可以检测应用程序二进制文件的位置。有关如何确定程序二进制位置的技巧,请参阅http://autopackage.org/docs/binreloc