使用DevIL在C ++ OpenGL中加载纹理

时间:2012-05-22 17:45:51

标签: c++ opengl devil

使用C ++,我正在尝试使用DevIL将纹理加载到OpenGL中。在浏览了不同的代码段之后,我完成了一些代码(如下所示),但它似乎没有完全发挥作用。

加载纹理(Texture2D类的一部分):

void Texture2D::LoadTexture(const char *file_name) 
{   
    unsigned int image_ID;

    ilInit();
    iluInit();
    ilutInit();

    ilutRenderer(ILUT_OPENGL);

    image_ID = ilutGLLoadImage((char*)file_name);

    sheet.texture_ID = image_ID;
    sheet.width = ilGetInteger(IL_IMAGE_WIDTH);
    sheet.height = ilGetInteger(IL_IMAGE_HEIGHT);
}

这编译并正常工作。我确实知道我应该只执行ilInit(),iluInit()和ilutInit()一次,但是如果我删除这些行,程序会在加载任何图像时立即中断(编译很好,但运行时出错)。

在OpenGL中显示纹理(同一类的一部分):

void Texture2D::Draw() 
{

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glPushMatrix();

    u = v = 0;

    // this is the origin point (the position of the button)
    VectorXYZ point_TL; // Top Left 

    VectorXYZ point_BL; // Bottom Left
    VectorXYZ point_BR; // Bottom Right
    VectorXYZ point_TR; // Top Right

    /* For the sake of simplicity, I've removed the code calculating the 4 points of the Quad. Assume that they are found correctly. */

    glColor3f(1,1,1);
    // bind the appropriate texture frame
    glBindTexture(GL_TEXTURE_2D, sheet.texture_ID);

    // draw the image as a quad the size of the first loaded image
        glEnable(GL_TEXTURE_2D);
        glBegin(GL_QUADS);
            glTexCoord2f (0, 0);
            glVertex3f  (point_TL.x, point_TL.y, point_TL.z); // Top Left

            glTexCoord2f (0, 1);
            glVertex3f  (point_BL.x, point_BL.y, point_BL.z); // Bottom Left

            glTexCoord2f (1, 1); 
            glVertex3f  (point_BR.x, point_BR.y, point_BR.z); // Bottom Right

            glTexCoord2f (1, 0);
            glVertex3f  (point_TR.x, point_TR.y, point_TR.z); // Top Right
        glEnd();
        glPopMatrix();
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
}

目前,四边形显示,但它完全是白色(它给出的背景颜色)。我正在加载的图像存在且加载正常(使用加载的大小值进行验证)。

我应该注意的另外几件事: 1)我正在使用深度缓冲区。我听说这与GL_BLEND不太合适? 2)我真的想使用ilutGLLoadImage函数。 3)我欣赏示例代码,因为我是openGL和DevIL的新手。

1 个答案:

答案 0 :(得分:2)

是的,你有问题。 ilutGLLoadImage()可能存在问题。

手动尝试:

  1. 使用ilLoadImage加载图像
  2. 使用glGenTextures
  3. 生成OpenGL纹理句柄
  4. 将图像上传到OpenGL glTextImage2D和ilGetData()
  5. 请参阅此链接以获取有效的解决方案

    http://r3dux.org/tag/ilutglloadimage/

    我知道,这个解决方案似乎“有点”复杂,但是没有人知道你花多少时间与魔鬼深处隐藏的这个bug作斗争。

    另一种修复方法:检查GL纹理设置代码。过滤中的任何内容都可能是GL_INVALID_OPERATION的原因。

    在编写旧ATI卡时,我们已经多次陷入“白色纹理”问题。

    哦!最大的猜测:非二次幂纹理。你是2 ^ N还是不同的纹理文件2 ^ N?

    要使用非矩形纹理,您只需使用GL扩展名。

    另一个:你在同一个线程或另一个线程中使用纹理吗?请记住,你应该在同一个线程中使用glGenTextures()和glBindTexture()/ glBegin / glEnd。