纹理在opengl中显示为白色

时间:2012-06-17 10:02:47

标签: c++ opengl sdl-opengl

我无法加载BMP texture并将其显示在多维数据集的面上。
我正在处理Windows 7。我的编译器是Visual Studio 2010 Express。我使用{{ 1}}加载bmp.My图像位深度为24.我的图像大小为256 * 256.我正在使用FreeImage创建窗口并处理事件。
当我编译并运行程序时,我的立方体仍然是白色的,其表面上没有显示任何内容。我正在将纹理加载到SDL变量中。当我打印该变量时,它只打印“1”。我的一位朋友告诉我,我的显卡与此版本的GLuint不兼容。所以我在虚拟机上的OpenGL编译并运行程序,它工作正常。立方体成功纹理你可以帮助我在Ubuntu上正确地运行吗?
如果你需要我的显卡是Windows

修改

这是我的initgl函数:

NVIDIA GT240 DDR5

这是加载图像的函数.GLuint texture [1]之前已定义:

//OpenGL initialization.
int initGL(void)
{
    glEnable(GL_TEXTURE_2D); //Enable texture mapping.
    if(!loadGLTextures("bmp_24.bmp"))
        return false;

    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f , 0.0f , 0.0f , 0.5f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    //Nice perspective.
    glHint(GL_PERSPECTIVE_CORRECTION_HINT , GL_NICEST);
    return true;
}

这是我的渲染功能:

//This function will load a bitmap image.
bool loadGLTextures(const char* file)
{
    FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;

    fif = FreeImage_GetFileType(file , 0);
    if(fif == FIF_UNKNOWN)
        fif = FreeImage_GetFIFFromFilename(file);
    if(fif == FIF_UNKNOWN)
        return false;

    FIBITMAP* dib = FreeImage_Load(fif , file);

    if(!dib)
        return false;

    //Create the texture.
    glGenTextures(1 , &texture[0]);

    //Typical texture generation using data from the bitmap.
    glBindTexture(GL_TEXTURE_2D , texture[0]);

    //Generate the texture.
    glTexImage2D(GL_TEXTURE_2D , 0 , GL_RGB , FreeImage_GetWidth(dib) , 
        FreeImage_GetHeight(dib) , 0 , GL_BGR_EXT , GL_UNSIGNED_BYTE , 
        FreeImage_GetBits(dib));



    //Linear filtering.
    glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR);

    printf("%d" , texture[0]);

    FreeImage_Unload(dib);

    return true;

}

3 个答案:

答案 0 :(得分:5)

您的代码中可能会出现许多问题。

我的怀疑是,你过早地打电话给initGL(),即没有上下文可用。你没有显示有问题的代码,所以我只能对此做出猜测。

启用纹理单元对于仅绘制非常重要。您可以上传纹理数据,纹理单元被禁用就好了。我强烈建议你将glEnable(GL_TEXTURE_2D);放在四边形绘图代码之前,而不是其他地方(实际上你应该只将glEnable和glDisable调用到绘图代码中,原因有几个。)

加载纹理时,您无法执行多项健全性检查。此外,您忘记正确设置像素存储参数,但这会使您的纹理看起来扭曲。另外,从加载函数返回纹理ID而不是布尔值并将ID放入全局变量是有意义的。 Texuture ID 0是保留的,因此您可以使用它来指示错误。

您可以设置过滤器模式,因此这不是未定义mipmap级别的问题。

答案 1 :(得分:0)

在创建纹理之前需要启用

GL_TEXTURES_2D,因此在调用glEnable(GL_TEXTURE_2D);之前需要调用glGenTextures(1 , &texture[0]);

另外,要启用透明度,您需要调用`glEnable(GL_BLEND);`

这仍然没有解释为什么它适用于Ubuntu而不适用于Windows ...我要说试一试,看看它是否有帮助。

编辑: 现在您已经发布了渲染功能,我注意到的一件事是您没有设置渲染颜色。 尝试拨打

glColor4f(r,g,b,a); // r, g, b and a are float between [0,1], specifying your desired color

介于glLoadIdentity();和您的第一个glVertex3f电话

之间

答案 2 :(得分:0)

你的纹理尺寸可能不是2的力量,即1,2,4,8,16,32,64等等。

这也会在某些硬件上造成这样的问题,通常是在旧版本中。

干杯;)