zoukankan      html  css  js  c++  java
  • 不用AuxDIBImageLoad()向opengl中载入bmp纹理

    不用AuxDIBImageLoad()向opengl中载入bmp纹理 这个函数从硬盘中加载24位window DIB 位图。呵呵,解释的多了。为了节约时间,我没有加载整个bmp图的Header部分,而仅仅获取我们需要的部分:宽度,高度,和图片大小。 下面是代码部分 

    unsigned int LoadTex(string Image)
    {
    unsigned int Texture;

    FILE* img = NULL;
    img = fopen(Image.c_str(),"rb");

    unsigned long bWidth = 0;
    unsigned long bHeight = 0;
    DWORD size = 0;

    fseek(img,18,SEEK_SET);
    fread(&bWidth,4,1,img);
    fread(&bHeight,4,1,img);
    fseek(img,0,SEEK_END);
    size = ftell(img.file) - 54;

    unsigned char *data = (unsigned char*)malloc(size);

    fseek(img,54,SEEK_SET); // image data
    fread(data,size,1,img);

    fclose(img);

    glGenTextures(1, &Texture);
    glBindTexture(GL_TEXTURE_2D, Texture);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

    if (data)
    free(data);

    return Texture;
    }



    正如你可以看到,bitmap的宽度和高度偏移量为18和24尺寸准确,我们只是整个文件的大小减去54(大小我们得到一个准确的读数文件头的大小有时会出现故障。

    用这个函数是相当容易的,就像是加载一个普通的纹理一样。


    bool texLoaded = false;
    unsigned int texture;
    ...
    if (!texLoaded)
    {
    texture = LoadTex("omfgleebhax.bmp"); // load the texture
    texLoaded = true;
    }

    glBindTexture(GL_TEXTURE_2D, texture); // bind the texture




    我发现这个函数比调用AuxDIBImageLoad()或者win32 API要快,呵呵。如此之酷。

  • 相关阅读:
    solr部署长命版后继
    reiserfs相关
    sqlite in python
    查看文件系统
    https://wiki.fourkitchens.com/dashboard.action这个技术wiki不错
    gvim菜单显示问题
    linux tips
    solr部署一气呵成版,让你多活两天
    挺好玩的C语句
    hardy ubuntu source list
  • 原文地址:https://www.cnblogs.com/gaoteng/p/2350368.html
Copyright © 2011-2022 走看看