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

标签 c++ opengl bmp

不幸的是,我在使用 glBindTexture() 时遇到了一些问题。

当我尝试将位图图像绑定(bind)到我的天空盒时,我只看到一些白色。我用其他数字对其进行了测试,但也不起作用。我确定问题出在 Engine 类中。

这是我的 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);
}

我这样使用类:

Engine::bindTexture(path);

有什么想法吗?

最佳答案

这是不对的:

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

bih 已经是指向结构的指针。你想要:

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

此外,您确实应该使用 BITMAPFILEHEADER 中的 bfOffBits,而不是假设位图位紧跟在 BITMAPINFOHEADER 之后。参见 the MSDN topic describing the format of bitmap files .

关于c++ - 将位图数据加载到 OpenGL 纹理中时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400258/

相关文章:

c# - UWP/C# 旋转 BMP

C 将 bmp 像素读入二维数组

c++ - 从 future 对象数组中检索值,std::vector

php - 实时地理数据流分析

c++使用 map 对记事本字符进行排序

OpenGL:屏幕上 3D 边界框的大小

c# - 在 C# 中将所有内容转换为 JPG

c++ - "A"之前的预期构造函数、析构函数或类型转换

c++ - QQuickFramebufferObject重绘只显示清晰颜色

c++ - 使用深度缓冲区 : horribly inaccurate? 进行光线拾取