使用OpenGL加载纹理

时间:2017-04-29 14:17:20

标签: c++ opengl textures

我正在尝试通过OpenGL为2d平台加载纹理,代码似乎在这个确切的部分崩溃,但是C ++或openGL缺乏知识似乎是我的问题,请帮助!

bool Texture::LoadTextureFromFile( std::string path )
{
    //Texture loading success
    bool textureLoaded = false;

    //Generate and set current image ID
    GLuint imgID = 0;
    glGenTextures( 1, &imgID );
    glBindTexture(GL_TEXTURE_2D ,imgID );

    //Load image
    GLboolean success = glLoadTextures( path.c_str() );

    //Image loaded successfully
    if( success == GL_TRUE )
    {
        //Convert image to RGBA
        // success = ilConvertImage( IL_RGBA, IL_UNSIGNED_BYTE );
        if( success == GL_TRUE )
        {
            //Create texture from file pixels
            textureLoaded = LoadTextureFromPixels32
            ( (GLuint*)glGetDoublev, (GLuint*)glGetIntegerv( GL_TEXTURE_WIDTH ), GLuint*(glGetIntegerv( GL_TEXTURE_HEIGHT )) );
        }

        //Delete file from memory
        glDeleteTextures( 1, &imgID );
    }

    //Report error
    if( !textureLoaded )
    {
        printf( "Unable to load %s\n", path.c_str() );
    }

    return textureLoaded;
}

1 个答案:

答案 0 :(得分:0)

有一些可能的问题。

首先,你从哪里获得glLoadTextures()?它做了什么?这不是OpenGL规范的一部分。我不清楚它的作用。这个函数可能会为你完成整个纹理加载,下面的代码只是搞砸了。

接下来,你的LoadTextureFromPixels32()的第一个参数是glGetDoubleV。你传给它一个指向函数glGetDoubleV的指针,这绝对不对。我假设该参数需要一个指向加载的图像数据的指针。

最后,您的代码会删除您刚刚使用glDeleteTextures()创建的纹理。这是没有意义的。纹理对象的ID存储在imgID中,这是一个局部变量。你正在删除它,所以纹理消失了。

创建纹理的正常过程是:

  • 加载纹理数据(使用类似SDL_image或其他图像加载库)
  • 使用glGenTextures()创建纹理对象;注意:这是你对纹理的处理;你必须存储它以备将来使用
  • 将它绑定到glBindTexture()
  • 加载图像数据glTexture2D()

就是这样。