【问题标题】:OpenGL loading binds the last loaded texture to all textureID'sOpenGL 加载将最后加载的纹理绑定到所有纹理 ID
【发布时间】:2017-04-28 06:37:45
【问题描述】:

所以我的问题是我尝试在启动时加载多个纹理,然后存储所有 ID,以便我可以绑定它们以使用它们。现在我知道 ID 已正确存储,因为我可以调试它并在分配和使用中看到 ID 是相同的。只是对于每个绑定,它都使用我加载的最后一个纹理。这是我的代码:

GLuint TextureLoader::LoadTexture (const char* fileName,Material& material,int width,int height) {
    GLuint textureImage;

    FILE* textureFile;
    textureFile = fopen(fileName, "rb");
    unsigned char* imageData;

    if (textureFile == NULL) {
        return 0;
    }
    imageData = (unsigned char*)malloc(width * height * 3);
    char header[54];
    fread(header,1,54,textureFile);
    fread(imageData, width * height * 3, 1, textureFile);

    fclose(textureFile);

    for (int i = 0; i < width * height; ++i) {
        int nextIndex = i * 3;
        unsigned char a = imageData[nextIndex];
        unsigned char b = imageData[nextIndex+2];

        imageData[nextIndex] = b;
        imageData[nextIndex+2] = a;
    }

    glEnable(GL_TEXTURE_2D);
    glGenTextures( 1, &textureImage );
    glBindTexture( GL_TEXTURE_2D, textureImage );
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE );
    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_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


    /*glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );


    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT );
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, imageData );*/
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, imageData);
    glGenerateMipmap(GL_TEXTURE_2D);
    free(imageData);

    return textureImage;
}

这是我对这段代码的使用:

if (showTexture) {
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, material.texture);
}

这是我的负载调用:

green1.texture = TextureLoader::LoadTexture("/Users/hewitt/Desktop/OpenGLImages/face6.bmp",green1, 256, 256);

然后我只使用:

glTexCoord2f(1.0f,0.0f);

根据它改变的角落进行绘制。这会正确绘制一个纹理,即使我 glBind 一个不同的数字,它也会重复纹理。

非常感谢任何帮助。

编辑 ----------

glBegin(mode);
            Spatial::Vector3 normal = Mesh::calculateNormal (pointGroup);
            glNormal3f(normal.x, normal.y, normal.z);

            Material material = mesh.getMaterial();

            if (showTexture) {
                glEnable(GL_TEXTURE_2D);
                glBindTexture(GL_TEXTURE_2D, material.texture);
            }

            int counter = 0;
            for (Spatial::Vector3 point : pointGroup) {
                if (showTexture == false) {
                    Material::Colour colour = material.getColour();
                    glColor3f(colour.red, colour.green, colour.blue);
                } else {

                    if (counter == 0) {
                        glTexCoord2f(1.0f,0.0f);
                    } else if (counter == 1) {
                        glTexCoord2f(1.0f,1.0f);
                    } else if (counter == 2) {
                        glTexCoord2f(0.0f,1.0f);
                    } else if (counter == 3) {
                        glTexCoord2f(0.0f,0.0f);
                    }
                }

                glVertex3f(point.x,point.y,point.z);
                counter ++;
            }


            glEnd();

【问题讨论】:

  • “那我就用”是什么意思?该功能本身不做任何事情。显示实际绘制事物的相关部分。我猜你被遗留的即时 API 搞砸了,并试图从 glBegin/glEnd 中重新绑定纹理,这是你做不到的。
  • @ybungalobill 我添加了更改。
  • 你真的应该检查glGetError()的结果。在您的情况下,对于允许在 glBegin/glEnd 之间调用的每个函数,您将获得一个 GL_INVALID_OPERATION

标签: c++ opengl loading texture-mapping texture2d


【解决方案1】:

您不能在glBeginglEnd 之间调用glEnableglBindTexture。您必须在glBegin 之前绑定您的纹理。事实上,您可以在glBeginglEnd 之间调用的OpenGL 函数集仅限于那些传输顶点属性的函数(glVertexglColorglTexCoord 等...)。

请注意,即时模式 API(即 glBegin/glEnd 和朋友)是遗留的,已被弃用超过 10 年。我建议你切换到现代的 OpenGL 管道,它会为你解决很多问题。

【讨论】:

  • 非常感谢。这是一个如此简单的修复
  • 我也知道,但是对于这个规范,我们必须为 opengl 1.1 做这件事。不要问你没有线索。
  • @Hewiiitt 可能是大学从一开始就保留了一些旧代码......希望他们会改变它。
猜你喜欢
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2013-11-27
  • 2017-06-11
相关资源
最近更新 更多