ogl-grosse flächen zeichnen



  • gibts irgendwelche optimierungen, durch die ich das füllen grosser ebener flächen beschleunigen kann(was anseres ausser texturn kleiner machen oder effekte abschalten)
    momentan zieht allein das füllen des bildschirms mit den zwei ebenen deutlich mehr als das zeichnen aller 3dmodelle

    nagut die zwei ebenen benutzen blending envmap und multitex aber trotzdem

    noch was anderes: kann ich ein 256x256 bitmap als 128x128 laden? oder muss ich beide grössen als bmp parat haben?



  • kann ich ein 256x256 bitmap als 128x128 laden?

    Ich nehm mal an, du hast eine eigene Ladefunktion. Du könntest 1. nur jedes 2te Pixel laden (sieht schlimm aus 😉 ) oder 2. Google nach Filtertechniken befragen, um 256 auf 128 Bildpunkte herunterzurechnen.
    Aber - an die Skaliertechniken von z.B. Photoshop wird man nur schwer herankommen, also speicher lieber beide Auflösungen ...

    M.T.



  • Ich glaube das liegt nicht an den Texturen.

    Es ist manchmal besser ein großes Poly in mehrere kleine aufzuspalten.
    AFAIK kommt die Graka damit besser zurecht. Ner Radeon 9700
    kannst du mit großen Polys sogar heftige Grafikfehler entlocken.



  • in wieviele soll ichs denn aufteilen?
    gibts da irgendne faustregel? 10?100?1000?
    soll möglichst auf nem 800er mit gforce 2mx in 800x 600 flüssig laufen



  • Wie groß ist sie den jetzt? VertexCoords?


  • Mod

    meines wissens nach sind große polys schneller verarbeitet als kleine, weil dort weniger kanten entstechen. kanten sind auf neuen grakas schlecht, weil die dann eventuell 256bit aus dem speicher lesen, 32bit setzen und dann 256bit in den speicher schreiben müssen an einer kante. das entfällt bei größen polys. wenn du aber ein riesiges poly hast und man kann nur wenig davon sehen, dann wird das noch über den rand hinweg gezeichnet mittels band-guard.
    wenn du peformance gewinnen willst hilft es oft bei multitexturing mipmaps und gepackte texturen zu verwenden.

    int CTexture::isExtensionSupported(const char *extension)
    {
        char *extensions;
    
        extensions=(char *) glGetString(GL_VERSION);
        extensions=(char *) glGetString(GL_EXTENSIONS);
    
        int len=strlen(extensions);
        char Str[10240];
    
        for(int i=0; i<len; i++)
            if(extensions[i]==' ')
                Str[i]='\n';
            else
                Str[i]=extensions[i];
    
        if(isInString(Str,extension))
            return 1;
        return 0;
    }
    
    bool CTexture::Init()
    {
        int hasDxt1 = isExtensionSupported("GL_ARB_texture_compression");
        if(!hasDxt1)
            return false;
        glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) wglGetProcAddress("glGetCompressedTexImage");
        GLenum glenum=glGetError();
    .
    .
    .
    }
    
    bool CTexture::ConvertToDxt1(int level)
    {
        glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,m_SizeX,m_SizeY,0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,texbuffer);
    
        GLenum glenum=glGetError();
        if (glenum != GL_NO_ERROR)
          return    false;
    
        GLint success;
        glGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_COMPRESSED_ARB,
                                 &success);
        if (!success)
            return  false;
    
        m_compressedSize = 0;
        glGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB,
                                 &m_compressedSize );
        if (!m_compressedSize)
            return  false;
    
    //hier kann man optinal die gepackte textur sich speichern :)
        glGetCompressedTexImage(GL_TEXTURE_2D, level, texbuffer);
        return true;
    }
    

    damit könntest du experimentieren ... ist nur mal so von mir zusammengeschustert worden und weil es rausgerippt ist wohl nicht sofort compilierbar.

    du kannst damit mit ein wenig arbeit dxt texturen mit mipmaps speichern

    damit (falls du es noch nicht benutzt) bin ich mir sicher hollst du noch 50% raus 😃

    ansonsten kannst du per LOD einstellung für texturen noch die filtering qualität ändern (für texturen die nicht scharf sein müssen, wie z.B. verzerte envmaps), das mach der nvidia treiber von sich aus auch schon ein wenig.
    wenn du trilineare filterung an hast, könntest du durch bilinear ebenfalls geschwindigkeit steigern.

    rapso->greets();


Anmelden zum Antworten