OpenGL/ImageMagick无法渲染纹理(有时) 当我尝试使用OpenGL的C++ API时,我遇到了一个非常奇怪的问题。我尝试使用ImageMagick加载纹理,然后将其显示为一个简单的2D纹理正方形。我在Java中使用OpenGL有相当丰富的经验,因此我了解如何渲染纹理并将其绑定到基本体。但是,每次我尝试绘制它时,程序要么无法渲染,要么将其渲染为(大小合适的)白色正方形。我不完全确定到底发生了什么,但我相信这与ImageMagick有关

OpenGL/ImageMagick无法渲染纹理(有时) 当我尝试使用OpenGL的C++ API时,我遇到了一个非常奇怪的问题。我尝试使用ImageMagick加载纹理,然后将其显示为一个简单的2D纹理正方形。我在Java中使用OpenGL有相当丰富的经验,因此我了解如何渲染纹理并将其绑定到基本体。但是,每次我尝试绘制它时,程序要么无法渲染,要么将其渲染为(大小合适的)白色正方形。我不完全确定到底发生了什么,但我相信这与ImageMagick有关,c++,opengl,ubuntu,imagemagick,textures,C++,Opengl,Ubuntu,Imagemagick,Textures,我一直在使用Ubuntu的终端进行编译,我知道手动安装库是多么痛苦。ImageMagick第一次在我的程序中使用时拒绝编译,当我最终让程序编译时,每次运行时它都会seg fault。我终于让它“工作”,但现在,每当我尝试加载图像时,程序将在不渲染的情况下运行。我在谷歌上还没有找到类似的东西 奇怪的是,它很少能正常工作并按预期渲染正方形。然而,当我尝试重新运行程序时,它失败了,如上所示。我已经确定导致它无法渲染的那一行与加载图像的那一行是同一行,因此我认为图像加载不正确,导致程序失败但是,如果我

我一直在使用Ubuntu的终端进行编译,我知道手动安装库是多么痛苦。ImageMagick第一次在我的程序中使用时拒绝编译,当我最终让程序编译时,每次运行时它都会seg fault。我终于让它“工作”,但现在,每当我尝试加载图像时,程序将在不渲染的情况下运行。我在谷歌上还没有找到类似的东西

奇怪的是,它很少能正常工作并按预期渲染正方形。然而,当我尝试重新运行程序时,它失败了,如上所示。我已经确定导致它无法渲染的那一行与加载图像的那一行是同一行,因此我认为图像加载不正确,导致程序失败但是,如果我在创建GL窗口之前移动纹理加载代码,程序将始终成功渲染,但纹理正方形仅显示为白色(尽管正方形的大小正确,因此我知道图像加载正在工作)

不管怎样,很抱歉发了这么长的帖子。我已经放弃了独自解决这个问题,希望你们中的一个能帮我解决这个问题

OpenGL初始化代码:

Texture* tx;
void GraphicsOGL :: initialize3D(int argc, char* argv[]) {
    Magick::InitializeMagick(*argv);    
    glutInit(&argc, argv);

    //Loading Here ALWAYS Causes White Square
    /*glEnable(GL_TEXTURE_2D);
      tx = new Texture("Resources/Images/test.png");
      tx->load();*/

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); 
    glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("OpenGL Game");    
    glViewport(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
    glOrtho(0,SCREEN_WIDTH,SCREEN_HEIGHT,0, -3,1000);

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_ALPHA_TEST);
    glEnable(GL_TEXTURE_2D);

    //Loading Here SOMETIMES Works, But Typically Fails
    tx = new Texture("Resources/Images/test.png");
    tx->load();

    glutDisplayFunc(displayCallback);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glutMainLoop();
}
bool Texture::load() {
    try {
        m_image.read(m_fileName);        //This Line Causes it to Fail to Render
        m_image.write(&m_blob, "RGBA");
    }
    catch (Magick::Error& Error) {
        std::cout << "Error loading texture '" << m_fileName << "': " << Error.what() << std::endl;
        return false;
    }

    width = m_image.columns();
    height = m_image.rows();

    glGenTextures(1, &m_textureObj);
    glBindTexture(m_textureTarget, m_textureObj);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
    glTexParameterf(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(m_textureTarget, 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); 
    glTexImage2D(m_textureTarget, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_blob.data());      
    //glBindTexture(m_textureTarget, 0);

    return true;
}
void GraphicsOGL :: drawTexture(float x, float y, Texture* tex) {
    glEnable(GL_TEXTURE_2D);
    tex->bind();

    float depth = 0, w, h;
    w = tex->getWidth();
    h = tex->getHeight();

    glBegin(GL_QUADS);
        glVertex3f(x, y+h, depth);  glTexCoord2f(1,0);
        glVertex3f(x+w, y+h, depth);    glTexCoord2f(1,1);
        glVertex3f(x+w, y, depth);  glTexCoord2f(0,1);
        glVertex3f(x, y, depth);    glTexCoord2f(0,0);
    glEnd();
}
纹理加载代码:

Texture* tx;
void GraphicsOGL :: initialize3D(int argc, char* argv[]) {
    Magick::InitializeMagick(*argv);    
    glutInit(&argc, argv);

    //Loading Here ALWAYS Causes White Square
    /*glEnable(GL_TEXTURE_2D);
      tx = new Texture("Resources/Images/test.png");
      tx->load();*/

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); 
    glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("OpenGL Game");    
    glViewport(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
    glOrtho(0,SCREEN_WIDTH,SCREEN_HEIGHT,0, -3,1000);

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_ALPHA_TEST);
    glEnable(GL_TEXTURE_2D);

    //Loading Here SOMETIMES Works, But Typically Fails
    tx = new Texture("Resources/Images/test.png");
    tx->load();

    glutDisplayFunc(displayCallback);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glutMainLoop();
}
bool Texture::load() {
    try {
        m_image.read(m_fileName);        //This Line Causes it to Fail to Render
        m_image.write(&m_blob, "RGBA");
    }
    catch (Magick::Error& Error) {
        std::cout << "Error loading texture '" << m_fileName << "': " << Error.what() << std::endl;
        return false;
    }

    width = m_image.columns();
    height = m_image.rows();

    glGenTextures(1, &m_textureObj);
    glBindTexture(m_textureTarget, m_textureObj);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
    glTexParameterf(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(m_textureTarget, 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); 
    glTexImage2D(m_textureTarget, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_blob.data());      
    //glBindTexture(m_textureTarget, 0);

    return true;
}
void GraphicsOGL :: drawTexture(float x, float y, Texture* tex) {
    glEnable(GL_TEXTURE_2D);
    tex->bind();

    float depth = 0, w, h;
    w = tex->getWidth();
    h = tex->getHeight();

    glBegin(GL_QUADS);
        glVertex3f(x, y+h, depth);  glTexCoord2f(1,0);
        glVertex3f(x+w, y+h, depth);    glTexCoord2f(1,1);
        glVertex3f(x+w, y, depth);  glTexCoord2f(0,1);
        glVertex3f(x, y, depth);    glTexCoord2f(0,0);
    glEnd();
}

您的代码中有什么
m_
?在您的情况下,它应该始终是
GL\u TEXTURE\u 2D
。而且,你的texcoords是错误的。您必须在
glVertex*()
之前调用
glTexCoord*()
,因为后者实际上创建了顶点(从所有属性的所有current值)并将其提交到管道(至少在概念上)。它作为GL_TEXTURE_2D传递,感谢您告诉我texcoords是错误的。实际上我刚刚解决了这个问题。在glutInitDisplayMode(GLUT|U DOUBLE | GLUT|U RGBA)行中,它需要是glutInitDisplayMode(GLUT|U SINGLE | GLUT|RGBA)。不过,谢谢你的帮助!好吧,我建议您继续使用
GLUT\u DOUBLE
。当发现渲染帧时,只需调用
glutSwapBuffers()
(通常,在GLUT中的
显示
回调结束时)