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 offensichtlichen GL_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.
InformationsquelleAutor Prime | 2011-03-17
Schreibe einen Kommentar