Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » OpenGL » Ruckeln?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.05.2005, 13:26 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Hallo,
Ich habe ein GL-spezifisches Problem mit meinen Texturen.

Ich lade eine Bitmap und speicher sie in einem GLubyte-Array-Pointer. Je nachdem, wie ich diese Texturen jetzt verwende scheint sich die Geschwindigkeit des Programms zu verändern. Ohne Texturen geht alles Flüssig, mit zwei 256*256*24bit Texturen geht es zwar immer noch Flüssig, aber viel Langsamer, und mit auch nur einer einzigen 512*512*24bit Textur ruckelt das ganze wie auf 'ner 98er Gurke.

Ist das normal?
Ich meine, man muss doch hochwertigere und mehr Texturen verwenden können, oder?
Und an meinem System liegt es nicht!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.05.2005, 13:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wie zeichnest du sie? evtl machst du da fehler
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.05.2005, 15:03 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Ich bin da eigentlich nach Nehe vorgegangen. Allerdings kam bei mir dann bei der Funktion
auxDIBImageLoad();
die Meldung "Unresolved externel auxDIBImageLoad reference from...", also habe ich die Sache mit der VCL gelöst.

Ich lade die Bitmap und speicher ihre Daten zusammen mit ihrer Höhe und ihrer Breite in einem Struct:

C++:
struct dsTextureFrame   {
        GLubyte *Texture;
        int Width, Height;
};
dsTextureFrame dsTextures[256];



Das ganze geschieht bei Programmstart, beim Aufruf der InitGL()-Funktion:

C++:
// Diese Funktion lädt eine Bitmap als Textur aus einer Datei.
// Wenn 'bool LoadFromResource' = true ist, wird die Textur aus einer Resource geladen...
void LoadWindowsBitmap(dsTextureFrame &TexFrame, char* FileName, bool LoadFromResource = false)        {
        // Lädt die Bitmap...
        Graphics::TBitmap *Bitmap = new Graphics::TBitmap();

        if(LoadFromResource)    {
                Bitmap->LoadFromResourceName(0, FileName);
        }       else    {
                Bitmap->LoadFromFile(FileName);
        }

        // Konvertiere die Bitmap in ein Format, mit dem OpenGL umgehen kann...
        TexFrame.Texture = new GLubyte[Bitmap->Width*Bitmap->Height*3];

        for(int i = 0; i < Bitmap->Height; i++)    {
                for(int j = 0; j < Bitmap->Width; j++)     {
                        int Pixel = Bitmap->Canvas->Pixels[j][i];
                        TexFrame.Texture[3*(i*Bitmap->Width+j)+0] = GetRValue(Pixel);
                        TexFrame.Texture[3*(i*Bitmap->Width+j)+1] = GetGValue(Pixel);
                        TexFrame.Texture[3*(i*Bitmap->Width+j)+2] = GetBValue(Pixel);
                }
        }

        TexFrame.Width = Bitmap->Width;
        TexFrame.Height = Bitmap->Height;
        
        delete Bitmap;

        return;
}

//------------------------------

void InitTexture(int TexNumber, char* fn)      {
        LoadWindowsBitmap(dsTextures[TexNumber], fn, false);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}

//------------------------------

void ChooseTexture(dsTextureFrame TexFrame)        {
        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, TexFrame.Width, TexFrame.Height, GL_RGB, GL_UNSIGNED_BYTE, TexFrame.Texture);
}

//------------------------------

// Loads the programs textures
void dsLoadTextures()   {
        InitTexture(0, "graphics/land.bmp");
        InitTexture(1, "graphics/sky.bmp");
        InitTexture(2, "graphics/rock.bmp");
}

//------------------------------

int InitGL(GLvoid)      // All setup for OpenGL goes here
{
    glShadeModel(GL_SMOOTH);                // Enable smooth shading
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);   // Black background
    glClearDepth(1.0f);                     // Depth buffer setup
    glEnable(GL_DEPTH_TEST);                // Enables depth testing
    glEnable(GL_TEXTURE_2D);                // Enables Texture Mapping
    glDepthFunc(GL_LEQUAL);                 // The type of depth testing to do
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);      // Really nice perspective calculations

        // Loading the Textures...
        dsLoadTextures();

        return true;                            // Initialization went OK
}


Und dann in der DrawGLScene():

C++:
int DrawGLScene(GLvoid)         // Here's where we do all the drawing
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    // clear screen and depth buffer
    glLoadIdentity();       // Reset the current modelview matrix
        glTranslatef(0.0f, 0.0f, 0.0f);  // Setze Ausgangspunkt für gl*-Funktionen

        // ========================== Boden... ==========================
        ChooseTexture(dsTextures[0]);
        glBegin(GL_QUADS);
                glTexCoord2d(0, 0);     glVertex3f(20.0f, -2.0f, 20.0f);
                glTexCoord2d(0, 1);     glVertex3f(-20.0f, -2.0f, 20.0f);
                glTexCoord2d(1, 1);     glVertex3f(-20.0f, -2.0f, -20.0f);
                glTexCoord2d(1, 0);     glVertex3f(20.0f, -2.0f, -20.0f);
        glEnd();

    return true;
}



Sorry, 'n bisschen viel Code, aber ich sehe den Fehler nicht... werden da vielleicht irgendwelche Rechenitensiven Vorgänge in der Hauptschleife immer wieder aufgerufen?

Evtl. könnte ich die ganze Datei auch hochladen und verlinken, falls das Erforderlich währe

Dieser Post wurde am 19.05.2005 um 15:24 Uhr von Reyx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.05.2005, 15:24 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Naja du solltest nicht jedesmal neu das Bitmap in eine Textur umwandeln:

machs z.b so:


C++:
struct dsTextureFrame   {
        GLubyte *Texture;
        int Width, Height;
        int ID;
};
dsTextureFrame dsTextures[256];

void ChooseTexture(dsTextureFrame TexFrame)        {
  glBindTexture(GL_TEXTURE_2D, TexFrame.ID);
}

void InitTexture(int TexNumber, char* fn)      {
        LoadWindowsBitmap(dsTextures[TexNumber], fn, false);

   glGenTextures(1, &dsTextures[TexNumber].ID);
  
  glBindTexture(GL_TEXTURE_2D, dsTextures[TexNumber].ID);
  glTexImage2D(GL_TEXTURE_2D, 0, 3, dsTextures[TexNumber].Width, dsTextures[TexNumber].Height, 0, GL_RGB, GL_UNSIGNED_BYTE, dsTextures[TexNumber].Texture);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  
  delete[] dsTextures[TexNumber].Texture;
}




dann wird die Textur nur einmal generiert. Löschen sollte man sie dann mit


C++:
glDeleteTextures(1,&dsTextures[Nummer].ID);


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.05.2005, 15:33 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Vielen Dank, funktioniert wunderbar :-)
Dieser Post wurde am 19.05.2005 um 15:33 Uhr von Reyx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.05.2005, 15:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


achja, glTexImage2D braucht Quadratische Texturen, gluBuild2DMipmaps nicht, nimms halt wie dus brauchst
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.05.2005, 16:04 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Beliebige quadratische Texturen? Ich dachte immer, die müssten "a power of 2" sein (da sieht mann's mal: Jetzt kann ich schon manche Dinge nur noch in englisch ausdrücken )?
Dieser Post wurde am 19.05.2005 um 16:04 Uhr von Reyx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.05.2005, 17:39 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


jo mein ich ja, gluBuild2DMipmaps braucht das angeblich nicht (habs nicht ausprobiert), glTexImage2D jedoch schon
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ OpenGL ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: