Mit QImage mit OpenGL
Habe ich vor kurzem abgeholt Qt und benutze es mit OpenGL
Die Sache ist aber, dass beim Umzug mein SDL-code auf Qt und die änderung der textur-code zu verwenden QImage es nicht mehr funktioniert.
Dem Bild nicht richtig geladen, wie gezeigt, durch die Fehler im code überprüfen.
Dank!
P. S: Bitte nicht schlagen ich benutze glDrawPixels, die ich brauche um das problem zu beheben auf der hand. Einige der Gründe für die dass 1. langsam 2. android (was dieser code kann ausgeführt werden auf irgendwann) ist OpenGL ES und unterstützt nicht glDrawPixels
Hier der code:
//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();
Hier ist das original texture-loading-Funktion mit 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;
}
- Könnten Sie etwas näher auf, was meinst du mit "aufgehört" zu arbeiten? Ist die textur nicht mehr angezeigt? Wussten Sie ändern alle Parameter, die für
glTexImage2D
außer den offensichtlichenGL_formatted_image.xxx
? Hat Ihr Bild liefern ein alpha channel, D. H. RGBA? - ändern GL_RGBA zu GL_RGB gibt das gleiche Ergebnis, Indem Sie aufgehört zu arbeiten, ich meine, die textur wird nicht angezeigt
- Ist der code, den Sie geschrieben erste Teil einer Funktion? Wie sieht Ihre Schleife ziehen wirklich Aussehen? Bitte beachten Sie auch die fa ' s post, um zu sehen, ob Sie wie bei der Initialisierung in einer ähnlichen Weise.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe ähnlichen code, der funktioniert, aber verwendet glTexSubImage2D :
- Und ein paar Performance tweaks in der ctor
Dies ist meine Lösung für die Konvertierung von Qt-GL
Dies kann auch rückwärts arbeiten mit kleinen änderungen;
Cheers -- Daimon
QImage::rgbSwapped()
?rgbSwapped()
ARGB konvertiert zu ABGR.Wie es aussieht, dein problem ist nicht hier, denn ich habe kein problem mit den folgenden code.
Sie sollten überprüfen, Ihre GL init und display-Einstellungen.
Haben Sie eine glEnable(GL_TEXTURE_2D) irgendwo ?
Beachten Sie auch glTexCoord2f werden müssen, bevor glVertex2f.
glEnable(GL_TEXTURE_2D);
undglDisable(GL_TEXTURE_2D);
an mehreren Orten, aber dieser Vorschlag ist, den superior zu anderen Antworten.