c++ - 渲染bmp没有出现

标签 c++ visual-c++ opengl

我似乎无法加载位图并显示它 :S ... 有人知道这里出了什么问题吗?我的 bmp 大小为 256 x 265。我目前只能看到黑屏(没有显示任何内容)。任何帮助将不胜感激!

int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
    GLuint texture = LoadBMP("C:/Untitled.bmp");


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glEnable(GL_TEXTURE_2D);

    glBindTexture(GL_TEXTURE_2D, texture);
    glBegin(GL_QUADS);
    glTexCoord2d(2.8f, 2.8f); glVertex2f(2.8f, 2.8f);
    glTexCoord2d(2.8f, 2.8f); glVertex2f(2.8f, 2.8f);
    glTexCoord2d(2.8f, 2.8f); glVertex2f(2.8f, 2.8f);
    glTexCoord2d(2.8f, 2.8f); glVertex2f(2.8f, 2.8f);
    glEnd();

    glDisable(GL_TEXTURE_2D);
    return TRUE;    // Keep Going
}


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;
}

最佳答案

当然你什么也看不到,你对每个顶点使用相同的纹理坐标:)

OpenGL 中的纹理坐标(除非您使用特殊的矩形纹理)在 0.0 - 范围内标准化1.0。其中(0.0, 0.0)代表图片的左下角,(1.0, 1.0)代表右上角。您应该考虑将图像在四边形上恰好拉伸(stretch)一次,因此使用所有四个角的组合作为您的坐标。

另外,使用 glTexCoord2f (...)因为您显然使用的是单精度浮点坐标而不是 double 。

考虑一下:

glBegin( GL_QUADS);
  glTexCoord2f (0.0f, 0.0f); glVertex2f (-1.0f, -1.0f);
  glTexCoord2f (0.0f, 1.0f); glVertex2f (-1.0f,  1.0f);
  glTexCoord2f (1.0f, 1.0f); glVertex2f ( 1.0f,  1.0f);
  glTexCoord2f (1.0f, 0.0f); glVertex2f ( 1.0f, -1.0f);
glEnd ();

这段代码解决了两个问题:

  1. 它会将您的位图在四边形上恰好拉伸(stretch)一次
  2. 顶点坐标将覆盖整个视口(viewport)

关于c++ - 渲染bmp没有出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20296391/

相关文章:

C++ Switch 语句 - 给玩家另一个选择的机会

c++ - OpenGL 顶点属性未启用

c - Opengl 统一变量不起作用?

c++ - 如何检测可变参数函数的空参数列表(va_arg、va_end、va_start)

c - 如何使用lapack库解决c中矩阵乘法的链接器错误?

c++ - 为什么 OpenGL 雾只是不出现?

c++ - 在 Qt 项目中使用 sem_t

c++ - 返回对应于 C++17 中可变参数模板的元组

C++:将指针设置为 nullptr 与将其初始化为新变量类型之间的区别

c++ - 为 C++ 编写不递增的味觉测试程序