Problem mit OpenGL und Texture MipMaps



  • Ich habe die Funktion gluBuild2DMipmaps durch eine eigene Funktion ersetzt.
    Eigentlich funktioniert auch fast alles, aber die vorletzte Mipmap (meist 2*2 Pixel) stellt OpenGL falsch dar. Sieht aus als würde mein Programm den Pointer, welche an die glTexImage2D Funktion übergeben wird, mit falschen Daten füllen oder als wäre dieser Speicher nicht groß genug. Kann daran aber nicht liegen, ich hab schon ales mögliche getestet, also die Pixel Daten per SoftwareRenderer (jeden Pixel geplotet) dargestellt und da stimmen die Werte. Gibt es da irgend ein Problem mit der vorletzten Mipmap? Ich verstehe nicht warum das Problem mit der Funktion von GLU nicht auftritt?
    Kann mir jemand helfen?



  • Vielleicht mit etwas Code dazu... und wie es falsch dargestellt wird bzw. der Unterschied zu dem wie es richtig sein sollte.



  • void OpenGLDriver::build2DMipmaps(s32 InternalFormat, s32 Format, s32 Width, s32 Height, const u8* ImageData)
    {
        #if 0
    
        /*
         * The "SoftPixel Engine" is using the original source code of an "Mesa - OpenGL Utility Toolkit" implementation
         * The engine is independent to the "glu" (glu32.dll) library
         */
        gluBuild2DMipmaps(GL_TEXTURE_2D, InternalFormat, Width, Height, Format, GL_UNSIGNED_BYTE, ImageData);
    
        #else
    
        /* Mipmap level counter */
        s32 i = 0;
    
        /* Current size */
        dim::size2di Size(Width, Height);
    
        /* Temporary memories */
        u8 * pMemory, * pData;
    
        /* Check the internal format value */
        checkInternalFormat(InternalFormat);
    
        /* Get the image data size */
        s32 ImageDataSize = Width*Height*InternalFormat;
    
        /* Allocate scalable image data memory */
        pData = new u8[ImageDataSize];
    
        /* Copy the image data */
        memcpy(pData, ImageData, ImageDataSize);
    
        /* Get the optimized size & scale if the input size is not correct */
        TextureManager::checkImageSize(Size);
    
        /* Get the maximal size */
        GLint MaxSize;
        glGetIntegerv(GL_MAX_TEXTURE_SIZE, &MaxSize);
    
        /* Check the size of maxima */
        if (Size.Width > MaxSize)
            Size.Width = MaxSize;
        if (Size.Height > MaxSize)
            Size.Height = MaxSize;
    
        /* Check if the size has changed */
        if (Size.Width != Width || Size.Height != Height)
        {
            /* Scale to a 2^n dimension */
            TextureManager::scaleImageData(pData, Width, Height, Size.Width, Size.Height, InternalFormat);
    
            /* Blur the image */
            TextureManager::blurImageData(pData, Size.Width, Size.Height, InternalFormat);
        }
    
        /* Loop for all mipmap levels */
        while (1)
        {
            /* Build a new mipmap level */
            glTexImage2D(GL_TEXTURE_2D, i, InternalFormat, Size.Width, Size.Height, 0, Format, GL_UNSIGNED_BYTE, pData);
    
            /* Check if the last mipmap level has been achieved */
            if (Size.Width == 1 && Size.Height == 1)
                break;
    
            /* Scale the image data to the half size */
            TextureManager::scaleHalfImageData(pMemory, pData, Size.Width, Size.Height, InternalFormat);
    
            /* Half the size */
            if (Size.Width > 1)
                Size.Width >>= 1;
            if (Size.Height > 1)
                Size.Height >>= 1;
    
            /* Delete old memory */
            delete [] pData;
    
            /* Use new memory */
            pData = pMemory;
    
            /* Next mipmap level */
            ++i;
        }
    
        /* Delete temporary memory */
        delete [] pMemory;
    
        #endif
    }
    

    Ich kann nicht alle anderen SubFunctions mit liefern, das währe alles ein bischen zu viel, weil das alles zusammen in meine Engine integriert ist.

    Ich habe jedenfalls mit manueller Pixel Darstellung - also quasi SoftwareRenderering - diese UnterFunktionen getestet und sie funktionieren. Aber ich verstehe nicht warzm OpenGL so probleme damit hat.

    In der Funktion "scaleHalfImageData" allokiere ich mit "new" Width * Height * InternalFormat viele unsigned chars. Also eigentlich die richtige Anzahl die OpenGL benötigt.

    Und wie bereits erwähnt: nur das letzte MipMap Level sieht aus, als würde OpenGL über den ImageData-Speicher hinaus gehen und unerwartete Pixel Farben anzeigen.



  • Also jetzt verstehe ich gar nichts mehr 😕
    Wenn ich die Texturen nur mit GL_RGBA - und dann natürlich mit 4 Komponenten - erstelle, ist das Problem nicht zu sehen?!?! 😮

    Ist das normal?


Anmelden zum Antworten