bmp 纹理未使用 Open GL 正确加载

bmp texture not loading correctly using Open GL

大家好,我正在尝试使用 OpenGL 加载纹理(法线贴图)。

GLuint loadTexture(const char* fileName) {
    GLuint textureID;
    glGenTextures(1, &textureID);

    // load file - using core SDL library
    SDL_Surface* tmpSurface;
    tmpSurface = SDL_LoadBMP(fileName);
    if (tmpSurface == nullptr) {
        std::cout << "Error loading bitmap" << std::endl;
    }

    // bind texture and set parameters
    glBindTexture(GL_TEXTURE_2D, textureID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tmpSurface->w, tmpSurface->h, 0,
        GL_BGR, GL_UNSIGNED_BYTE, tmpSurface->pixels);
    glGenerateMipmap(GL_TEXTURE_2D);

    SDL_FreeSurface(tmpSurface);
    return textureID;
}

然后如果我尝试渲染它,它会给我:

而不是:

但我可以正常渲染:

你有想法吗?不工作的颜色深为 32,工作的颜色深为 24

使用SDL_ConvertSurfaceFormat转换表面格式并加载转换后的表面:

SDL_Surface* tmpSurface = SDL_LoadBMP(fileName);
SDL_Surface* formattedSurface = SDL_ConvertSurfaceFormat(
                                tmpSurface, SDL_PIXELFORMAT_ABGR8888, 0);
SDL_FreeSurface(tmpSurface);

// [...]

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tmpSurface->w, tmpSurface->h, 0,
             GL_RGBA, GL_UNSIGNED_BYTE, formattedSurface->pixels);
SDL_FreeSurface(formattedSurface);

当然你可以评估SDL_Surface and set a proper format attribute when two-dimensional texture image is specified by glTexImage2Dformat属性。