使用opengl和c ++加载纹理

时间:2014-04-05 20:28:33

标签: c++ opengl texture-mapping

我已经使用这样的代码将.bmp文件作为纹理加载了,我想填充一个矩形(例如右边墙上的一个矩形)

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

并像这样使用它:

glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();

            glColor3f(0.0, 0.0, 0.0);

            GLuint texture = LoadBMP("mina.bmp");
            glEnable(GL_TEXTURE_2D);

            glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
            glBindTexture(GL_TEXTURE_2D, texture);
            glBegin(GL_QUADS);
                glTexCoord2i(0, 0); glVertex2i(0, 0);
                glTexCoord2i(0, 1); glVertex2i(0, 5);
                glTexCoord2i(1, 1); glVertex2i(5, 5);
                glTexCoord2i(1, 0); glVertex2i(5, 0);
            glEnd();

            glDisable(GL_TEXTURE_2D);

但是当我运行它时,它什么也没做,当我注释掉这两行时:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

输出是黑色矩形而不是纹理矩形。 我不知道出了什么问题! 是关于我使用的.bmp文件吗? 我将带有microsoft paint的jpeg格式更改为.bmp文件。我甚至尝试使用visual studio创建的.bmp文件。 这是我说的第二个输出: when I comment out those 2 lines

2 个答案:

答案 0 :(得分:3)

一些东西:

您可能需要将BMP频道从BGR交换为RGB

是不是glColor3f(0.0, 0.0, 0.0);罪魁祸首将这一切都搞砸了?


额外:

我也错过(有点)glBegin(); glEnd();的时间,但请确保您在兼容模式下运行。并准备好转向着色器。

答案 1 :(得分:0)

可能忘记了

    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

自OpenGL 1.2(1998)开始,您可以

distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl = https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

您要glEnable( GL_TEXTURE_2D ); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data); 吗?

OpenGL 1.0兼容版本

delete