C++ 将位图数据加载到OpenGL纹理时出现问题

C++ 将位图数据加载到OpenGL纹理时出现问题,c++,opengl,bmp,C++,Opengl,Bmp,不幸的是,我在glBindTexture()方面遇到了一些问题 当我尝试将位图图像绑定到skybox时,我只看到一些白色。我用其他数字测试了它,但也不起作用。我确信问题出在引擎类 这是我的engine.cpp,我在这里加载位图等等: #include <windows.h> #include <gl/GL.h> #include <iostream> #include "engine.h" unsigned char* Engine::getImageCo

不幸的是,我在glBindTexture()方面遇到了一些问题

当我尝试将位图图像绑定到skybox时,我只看到一些白色。我用其他数字测试了它,但也不起作用。我确信问题出在引擎类

这是我的engine.cpp,我在这里加载位图等等:

#include <windows.h>
#include <gl/GL.h>

#include <iostream>
#include "engine.h"

unsigned char* Engine::getImageContents(char path[], BITMAPINFOHEADER* bih) {
    FILE* input; fopen_s(&input, path, "rb");

    if (input != NULL) {
        BITMAPFILEHEADER bfh;
        fread(&bfh, sizeof(bfh), 1, input);
        fread(&bih, sizeof(bih), 1, input);

        unsigned char* data =
            new unsigned char[bih->biWidth * bih->biHeight * bih->biBitCount / 8];

        fread(data, sizeof(data), 1, input);
        fclose(input);

        return data;
    } else {
        return NULL;
    }
}

void Engine::bindTexture(char path[]) {
    this->bindTexture(this->getTextureId(path));
}

void Engine::bindTexture(unsigned int id) {
    if (id != this->boundTexture) {
        glBindTexture(GL_TEXTURE_2D, id);
        this->boundTexture = id;
    }
}

unsigned int Engine::getTextureId(char path[]) {
    if (this->textureMap.find(path) != this->textureMap.end()) {
        return this->textureMap[path];
    } else {
        unsigned int id; glGenTextures(1, &id);
        BITMAPINFOHEADER bih;
        unsigned char* data = this->getImageContents(path, &bih);
        this->setupTexture(data, id, bih.biWidth, bih.biHeight);
        this->textureMap.insert(std::pair<char*, unsigned int>(path, id));
        return id;
    }
}

void Engine::setupTexture(unsigned char* data, unsigned int id, long width, long height) {
    this->setupTexture(data, id, width, height, false);
}

void Engine::setupTexture(unsigned char* data, unsigned int id, long width, long height, bool clamp) {
    std::cout << height << std::endl;
    this->bindTexture(id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp ? GL_CLAMP : GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp ? GL_CLAMP : GL_REPEAT);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_INT, data);
}

有什么想法吗?

我看不出有什么问题

  • 是否确实加载了未压缩的.bmp文件,请检查bfh.biCompression
  • 如果bih->biBitCount==32,可以使用GL_RGBA,尝试使用GL_RGB
  • 尝试使用GL_UNSIGNED_BYTE而不是GL_UNSIGNED_INT
  • 请检查图像大小,我认为skybox的图像大小应该是128x128、256x256、512x512,即二次幂纹理大小
  • 替换fread(数据,sizeof(数据),1,输入)
    在fread上(数据,1,波黑->波黑宽度*波黑->波黑高度*波黑->波黑计数/8,输入)
    我看不出有什么可能的问题

  • 是否确实加载了未压缩的.bmp文件,请检查bfh.biCompression
  • 如果bih->biBitCount==32,可以使用GL_RGBA,尝试使用GL_RGB
  • 尝试使用GL_UNSIGNED_BYTE而不是GL_UNSIGNED_INT
  • 请检查图像大小,我认为skybox的图像大小应该是128x128、256x256、512x512,即二次幂纹理大小
  • 替换fread(数据,sizeof(数据),1,输入)
    在fread上(数据,1,波黑->波黑宽度*波黑->波黑高度*波黑->波黑计数/8,输入) 这是不对的:

    fread(&bih, sizeof(bih), 1, input);
    
    bih
    已经是指向该结构的指针。你想要:

    fread(bih, sizeof *bih, 1, input);
    
    此外,您确实应该使用
    BITMAPFILEHEADER
    中的
    bOffBits
    ,而不是假设位图位紧跟在
    BitMapInfo头之后。请参阅。

    这是不对的:

    fread(&bih, sizeof(bih), 1, input);
    
    bih
    已经是指向该结构的指针。你想要:

    fread(bih, sizeof *bih, 1, input);
    


    此外,您确实应该使用
    BITMAPFILEHEADER
    中的
    bOffBits
    ,而不是假设位图位紧跟在
    BitMapInfo头之后。请参阅。

    您确定图像的类型是
    GL\u UNSIGNED\u INT
    而不是
    GL\u UNSIGNED\u BYTE
    ?您不应该在
    glBindTexture
    之前执行
    glActiveTexture(GL\u TEXTURE0)
    ?OpenGL有8个纹理“插槽”。@rWools我将GL_UNSIGNED_INT更改为GL_UNSIGNED_BYTE,但未成功,并且找不到glActiveTexture(GL_TEXTURE0)。是否使用着色器?如果是这样,你的片段着色器看起来是什么样子?@rwols不,我不:)你确定图像的类型是
    GL\u UNSIGNED\u INT
    而不是
    GL\u UNSIGNED\u BYTE
    ?你不应该在
    glBindTexture
    之前做
    glActiveTexture(GL\u TEXTURE0)
    ?OpenGL有8个纹理“插槽”。@rWools我将GL_UNSIGNED_INT更改为GL_UNSIGNED_BYTE,但未成功,并且找不到glActiveTexture(GL_TEXTURE0)。是否使用着色器?如果是这样,你的片段着色器看起来是什么样子?@rwols不,我不:)我忘了说,当我得到bitmapinfo头的bih.biWidth时,它会返回一个随机值。第三,我已经做到了。此外,我还将GL_RGBA更改为GL_RGB请更改fread(&bih,sizeof(bih),1,输入);在fread上(&bih,sizeof(BitMapInfo头),1,输入;波黑是pointer@VladislavLitunovsky:否,您仍在传递指针的地址,这将破坏堆栈。有关正确的呼叫,请参阅我的回答。@RANDOM用户请查看此。它解释了如何加载.bmp和一些问题。@VladislavLitunovsky谢谢:)我忘了说,当我得到bitmapinfo头的bih.biWidth时,它会返回一个随机值。第三,我已经做到了。此外,我还将GL_RGBA更改为GL_RGB请更改fread(&bih,sizeof(bih),1,输入);在fread上(&bih,sizeof(BitMapInfo头),1,输入;波黑是pointer@VladislavLitunovsky:否,您仍在传递指针的地址,这将破坏堆栈。有关正确的呼叫,请参阅我的回答。@RANDOM用户请查看此。它解释了如何加载.bmp和一些问题。@Vladislavlitonovsky谢谢:)啊,ol'
    sizeof(指针)
    -while-I-fact-means-
    sizeof(指针)
    trap@rwols:存储数据的地址也错误。大小确实与缓冲区匹配——但它们都是错误的。我不认为这是一个问题,它没有改变任何东西。@RandomUser仅仅因为它没有解决您所有的错误并不意味着它实际上不是一个错误。啊,ol'
    sizeof(指针)
    -while-I-factly-means-
    sizeof(指针)
    -while-I-factly-means-
    sizeof(指针)
    trap@rwols:存储数据的地址也错误。大小确实与缓冲区匹配——但它们都是错误的。我不认为这是一个问题,它没有改变任何东西。@RandomUser仅仅因为它没有解决所有错误并不意味着它实际上不是一个错误。