在尝试使用OpenGL的C ++ API时,我遇到了一个非常奇怪的问题。我正在尝试使用ImageMagick加载纹理,然后将其显示为简单的2D纹理方块。我在Java中使用OpenGL有相当多的经验,所以我理解如何渲染纹理并将其绑定到基元。但是,每次我尝试绘制它时,程序都无法渲染,或者将其渲染为(大小合适的)白色方块。我不完全确定发生了什么,但我相信它与ImageMagick有关。
我一直在使用Ubuntu的终端进行编译,而且我已经了解到手动安装库会有多痛苦。 ImageMagick在我的程序中使用时首先拒绝编译,当我最终得到程序进行编译时,每次运行时都会出现段错误。我终于得到了它"工作",但现在,每当我尝试加载图像时,程序将在没有渲染的情况下运行。我在谷歌上找不到这样的东西。
奇怪的是,它很少会正常工作并按预期渲染方块。但是,当我尝试重新运行程序时,它会失败,如上所示。我确定导致它无法渲染的行与图像加载的行相同,这使我相信图像只是被错误地加载,导致程序失败。 但是,如果我在创建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();
}