我最近选择了Qt,并将其与OpenGL一起使用 但是,将我的SDL代码移动到Qt并更改纹理代码以使用QImage时,它停止工作。在OpenGL中使用QImage
图像加载正确,如错误检查代码所示。
谢谢!
P.S:请不要建议我使用glDrawPixels,我需要解决手头的问题。部分原因是为1。慢2.机器人(此代码,可以在最终运行)是OpenGL ES的,不支持glDrawPixels
下面的代码:
//original image
QImage img;
if(!img.load(":/star.png"))
{
//loads correctly
qWarning("ERROR LOADING IMAGE");
}
//array for holding texture ID
GLuint texture[1];
//get the OpenGL-friendly image
QImage GL_formatted_image;
GL_formatted_image = QGLWidget::convertToGLFormat(img);
//make sure its not null
if(GL_formatted_image.isNull())
qWarning("IMAGE IS NULL");
else
qWarning("IMAGE NOT NULL");
//generate the texture name
glGenTextures(1, texture);
//bind the texture ID
glBindTexture(GL_TEXTURE_2D, texture[0]);
//generate the texture
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_formatted_image.width(),
GL_formatted_image.height(),
0, GL_RGBA, GL_UNSIGNED_BYTE, GL_formatted_image.bits());
//texture parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//draw the texture
glPushMatrix();
glTranslatef(-2.0f, 0.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glVertex2f(1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(0.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glEnd();
glPopMatrix();
这里的原始纹理与SDL装载功能:
GLuint loadTexturewithSDL(const char* FILE, GLenum texture_format)
{
GLuint texture; // This is a handle to our texture object
SDL_Surface *surface; // This surface will tell us the details of the image
GLint nOfColors;
if ((surface = SDL_LoadBMP(FILE))) {
// Check that the image's width is a power of 2
if ((surface->w & (surface->w - 1)) != 0) {
printf("warning: image's width is not a power of 2\n");
}
// Also check if the height is a power of 2
if ((surface->h & (surface->h - 1)) != 0) {
printf("warning: image's height is not a power of 2\n");
}
// get the number of channels in the SDL surface
nOfColors = surface->format->BytesPerPixel;
if (nOfColors == 4) // contains an alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
else
texture_format = GL_BGRA;
} else if (nOfColors == 3) // no alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
else
texture_format = GL_BGR;
} else {
printf("warning: the image is not truecolor.. this will probably break\n");
// this error should not go unhandled
}
// Have OpenGL generate a texture object handle for us
glGenTextures(1, &texture);
// Bind the texture object
glBindTexture(GL_TEXTURE_2D, texture);
// Set the texture's stretching properties
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Edit the texture object's image data using the information SDL_Surface gives us
glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0,
texture_format, GL_UNSIGNED_BYTE, surface->pixels);
}
else {
printf("SDL could not load image %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
// Free the SDL_Surface only if it was successfully created
if (surface) {
SDL_FreeSurface(surface);
}
return texture;
}
请问您是否可以详细说明“停止”工作的含义?纹理不再显示?你是否改变了'glTexImage2D'的任何参数,除了明显的'GL_formatted_image.xxx'?您的图像是否提供alpha通道,即RGBA? – Thomas 2011-03-17 07:43:46
将GL_RGBA更改为GL_RGB给出了相同的结果 通过停止工作,我的意思是纹理不显示 – Prime 2011-03-17 18:55:10
是您发布的代码的第一部分的代码?你的绘制循环如何看起来像? 也请检查fa的帖子,看看你是否以类似的方式进行了初始化。 – Thomas 2011-03-17 22:45:33