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. |