OpenGL / ImageMagick无法渲染纹理(有时)

时间:2015-02-22 22:38:19

标签: c++ opengl ubuntu imagemagick textures

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

我一直在使用Ubuntu的终端进行编译,而且我已经了解到手动安装库会有多痛苦。 ImageMagick在我的程序中使用时首先拒绝编译,当我最终得到程序进行编译时,每次运行时都会出现段错误。我终于得到了它"工作",但现在,每当我尝试加载图像时,程序将在没有渲染的情况下运行。我在谷歌上找不到这样的东西。

http://imgur.com/C7yKwDK

奇怪的是,它很少会正常工作并按预期渲染方块。但是,当我尝试重新运行程序时,它会失败,如上所示。我确定导致它无法渲染的行与图像加载的行相同,这使我相信图像只是被错误地加载,导致程序失败。 但是,如果我在创建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();
}

0 个答案:

没有答案