【问题标题】:Can't correctly use bitmap in OpenGL无法在 OpenGL 中正确使用位图
【发布时间】:2014-05-11 12:22:51
【问题描述】:

我制作了自己的位图加载器。有一个函数可以从文件中加载数据。 它是 24 位的。

这是文件的十六进制数据:

42 4d 46 00 00 00 00 00 00 00 36 00 00 00 28 00
00 00 02 00 00 00 02 00 00 00 01 00 18 00 00 00
00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 ff ff ff ff 00 00 ff 00
00 00 ff 00 00 00

这是我的加载器(也将信息输出到文件):

void load_texture(std::string path)
{
    std::ifstream f;
    f.open(path, std::ios_base::binary);
    std::vector<unsigned char> store;
    char buf[255];
    while(!f.eof())
    {
        unsigned char g;
        f >> g;
        store.push_back(g);
    }
    f.close();

std::ofstream l("info.txt");
    int offset = store[0xA];
    int width = store[0x12];
    int height = store[0x16];
    int sizeraw = ((width*3)*height)+height-1*2;
    int a = store[(int)offset+1];
    int pad = 0;
    std::vector<BGR*> imageraw;
    std::vector<int*> image;
    for(int y = 0; y < height;y++)
    {
        for(int x = pad; x < pad + (width*3); x+=3)
        {
            imageraw.push_back(new BGR(store[offset +x], store[offset +x+1], store[offset +x+2]));
        }
        pad += (width*3)+2;
    }
    for(int i = 0; i < imageraw.size(); i++)
    {
        l << "---------------------------------\n";
        image.push_back(new int(imageraw[i]->B));
        image.push_back(new int(imageraw[i]->G));
        image.push_back(new int(imageraw[i]->R));
        l << "B : "; l << imageraw[i]->B; l << " \n";
        l << "G : "; l << imageraw[i]->G; l << " \n";
        l << "R : "; l << imageraw[i]->R; l << " \n";
    }
    glEnable(GL_TEXTURE_2D);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, image.data());

l.close();

}

这是 BGR 结构:

struct BGR
{
    int B;
    int G;
    int R;

    BGR(int a, int b, int c): B(a), G(b), R(c) {};
};

我不知道为什么,但是 OpenGL 以错误的颜色显示图像。 我还必须指出,我是在文件中处理十六进制数据的初学者。 此外,文件 (info.txt) 的输出是正确的。

为什么 OpenGL 会显示错误的颜色?

另外,我想给 OGL 的是 BGR 的整数值,就像 info.txt 中的值一样。没有十六进制也没有 bin。 编辑:

这是文件结果:

---------------------------------
B : 0 
G : 0 
R : 255 
---------------------------------
B : 255 
G : 255 
R : 255 
---------------------------------
B : 255 
G : 0 
R : 0 
---------------------------------
B : 0 
G : 255 
R : 0 

【问题讨论】:

  • while(!f.eof()) 不不不不不
  • @LightnessRacesinOrbit 这不是问题。我也试过while(f.good())。问题似乎更多是关于 OGL 而不是引擎本身,因为 info.txt 文件包含正确的信息。
  • 不管怎样都是错的。您每次都会向store 添加一个额外的元素,其值未指定。 while (f.good()) 有同样的问题。你在用哪本书?
  • 二进制文件不存储十六进制值。这只是一种表现形式。
  • @LightnessRacesinOrbit 我得到的文件输出是我想要的,但 Opengl 没有显示正确的颜色。请帮忙。我真的需要这个东西工作。

标签: c++ winapi opengl bitmap hex


【解决方案1】:

GL_UNPACK_ALIGNMENT 假设图像的每一行都是 4 的倍数,否则,您将得到像素未对齐。

glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

您的像素结构为 3 个字节,将 unpack 对齐更改为 1 将确保行之间没有移位。

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

您也可以自己(在创建 bmp 时)在每行之间移动字节,使其字节数为 4 的倍数。

【讨论】:

    【解决方案2】:

    您正在向 GL 发送完全错误的数据:

    std::vector<int*> image;
    

    在这里,您使用了一个由指向整数的指针组成的向量,并为每个像素新分配的图像添加了 3 个指针。这不是 GL 可以使用的。(附带说明:您还在这里泄漏了大量的内存)。

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, image.data())
    

    现在您告诉 GL,它将找到包含 BGR 图像数据的 width 乘以 height 像素的图像,每个组件都带有 GL_UNSIGNED_BYTE,因此类型为 GLubyte(或者,在任何部分案例unsigned char) 从地址image.data() 开始。所以你不需要ints,你肯定也不需要int* 指针。

    您的std::vector&lt;BGR*&gt; imageraw;std::vector&lt;int*&gt; image; 数据结构实际上完全没用,您可以直接使用store 向量的相关部分,其中将包含正确格式的数据(assui=ming non-compressed标准 BMP 文件,但您的其余代码假定相同)。

    【讨论】:

    • store 正在存储包括标题在内的整个文件数据。它不只是存储位图数据。那么我怎样才能“给”OGL 存储中的位图数组呢?
    • 使用正确的指针。位图数据将在标题之后的某个位置开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多