【问题标题】:load texture using opengl and c++使用 opengl 和 c++ 加载纹理
【发布时间】:2020-06-05 19:16:38
【问题描述】:

我已使用此类代码将 .bmp 文件加载为纹理,我想填充一个矩形(例如右墙上的矩形)

GLuint LoadBMP(const char *fileName)
{
    FILE *file;
    unsigned char header[54];
    unsigned int dataPos;
    unsigned int size;
    unsigned int width, height;
    unsigned char *data;


    file = fopen(fileName, "rb");

    if (file == NULL)
    {
        //MessageBox(NULL, L"Error: Invaild file path!", L"Error", MB_OK);
        return false;
    }

    if (fread(header, 1, 54, file) != 54)
    {
        //MessageBox(NULL, L"Error: Invaild file!", L"Error", MB_OK);
        return false;
    }

    if (header[0] != 'B' || header[1] != 'M')
    {
        //MessageBox(NULL, L"Error: Invaild file!", L"Error", MB_OK);
        return false;
    }

    dataPos     = *(int*)&(header[0x0A]);
    size        = *(int*)&(header[0x22]);
    width       = *(int*)&(header[0x12]);
    height      = *(int*)&(header[0x16]);

    if (size == NULL)
        size = width * height * 3;
    if (dataPos == NULL)
        dataPos = 54;

    data = new unsigned char[size];

    fread(data, 1, size, file);

    fclose(file);
    GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
return texture;
}

并像这样使用它:

glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();

            glColor3f(0.0, 0.0, 0.0);

            GLuint texture = LoadBMP("mina.bmp");
            glEnable(GL_TEXTURE_2D);

            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
            glBindTexture(GL_TEXTURE_2D, texture);
            glBegin(GL_QUADS);
                glTexCoord2i(0, 0); glVertex2i(0, 0);
                glTexCoord2i(0, 1); glVertex2i(0, 5);
                glTexCoord2i(1, 1); glVertex2i(5, 5);
                glTexCoord2i(1, 0); glVertex2i(5, 0);
            glEnd();

            glDisable(GL_TEXTURE_2D);

但是当我运行它时,它什么也不做,当我注释掉这两行时:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

输出是黑色矩形而不是带纹理的矩形。 我不知道怎么了! 是关于我使用的 .bmp 文件吗? 我将带有 microsoft paint 的 jpeg 格式更改为 .bmp 文件。我什至尝试使用由 Visual Studio 创建的 .bmp 文件。 这是我说的第二个输出:

【问题讨论】:

  • 也许更简单的方法是使用一些库来加载图像。我建议将 lodepng 用于 png 图像。
  • 可以试试这个:pastebin.com/sNXF1QXx 它应该可以工作..
  • 哈,我知道我没有解决您的问题的方法,但是您加载位图的代码帮助我了解了如何加载纹理。 (对我来说很好)。谢谢
  • 也感谢 BMP 加载功能。

标签: c++ opengl texture-mapping


【解决方案1】:

几样东西:

您可能需要将 BMP 通道从 BGR 交换到 RGB

这不就是glColor3f(0.0, 0.0, 0.0);的罪魁祸首吗?


额外:

我也很怀念(有点)glBegin();glEnd(); 的时代,但请确保您在兼容模式下运行。并准备好转向着色器。

【讨论】:

    【解决方案2】:

    可能忘记了

    glEnable( GL_TEXTURE_2D );
    

    自 OpenGL 1.2 (1998) 以来,您可以这样做

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
    

    你要去delete那个data吗?

    OpenGL 1.0 兼容版本

        static bool LoadBMP( const char* fileName ) {
            FILE* file;
            unsigned char header[54];
            unsigned int dataPos;
            unsigned int size;
            unsigned int width, height;
            unsigned char* data;
    
    
            file = fopen( fileName, "rb" );
    
            if ( file == NULL ) {
                //MessageBox(NULL, L"Error: Invaild file path!", L"Error", MB_OK);
                return false;
            }
    
            if ( fread( header, 1, 54, file ) != 54 ) {
                //MessageBox(NULL, L"Error: Invaild file!", L"Error", MB_OK);
                return false;
            }
    
            if ( header[0] != 'B' || header[1] != 'M' ) {
                //MessageBox(NULL, L"Error: Invaild file!", L"Error", MB_OK);
                return false;
            }
    
            dataPos = *(int*) &( header[0x0A] );
            size = *(int*) &( header[0x22] );
            width = *(int*) &( header[0x12] );
            height = *(int*) &( header[0x16] );
    
            if ( size == NULL )
                size = width * height * 3;
            if ( dataPos == NULL )
                dataPos = 54;
    
            data = new unsigned char[size];
    
            fread( data, 1, size, file );
    
            for ( unsigned int i = 0; i < size; i += 3 ) {
                unsigned char red = data[i];
                data[i] = data[i + 2];
                data[i + 2] = red;
            }
    
            fclose( file );
    
            glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
            glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
            glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data );
    
            delete data;
            return true;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多