NeHe - Lektion 22 - Bump Mapping (Extensionen) (Teil 2)

Zurück zu Teil 1

Alles was die drawGLScene() Funktion machen muss, ist zu bestimmen, welche doMesh-Funktion aufgerufen werden muss:
 
bool DrawGLScene(GLvoid)                            // Hier kommt der ganze Zeichnen-Kram hin
{
    if (bumps) {
        if (useMultitexture && maxTexelUnits>1)
            return doMesh2TexelUnits();
        else return doMesh1TexelUnits();    }
    else return doMeshNoBumps();
}


Killt das GLWindow, nicht geändert (deshalb übersprungen):

GLvoid KillGLWindow(GLvoid)                            // entferne das Fenster korrekt
>…


Erzeugt das GLWindow, nicht geändert (deshalb übersprungen):



BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) >…
Windows Hauptschleife, nicht geändert (deshalb übersprungen): 

LRESULT CALLBACK WndProc( HWND hWnd, // Handle für dieses Fenster UINT uMsg, // Nachricht für dieses Fenster WPARAM wParam, // zusätzliche Nachrichten Informationen LPARAM lParam) // zusätzliche Nachrichten Informationen >…
Der Windows Main-Funktion wurden einige Tasten hinzugefügt: 

  • E: wechsel zwischen Emboss / Bumpmapped Modus
  • M: wechsel Multitexturing
  • B: wechsel Bumpmapping. Dies ist stillschweigend exklusiv für den Emboss Modus
  • F: wechsel Filter. Sie werden sofort sehen, dass GL_NEAREST nicht für Bumpmapping geschaffen wurde
  • Pfeil-Tasten: rotiere den Würfel

int WINAPI WinMain(    HINSTANCE hInstance,                    // Instanz
            HINSTANCE hPrevInstance,                // vorherige Instanz
            LPSTR lpCmdLine,                    // Kommandozeilen Parameter
            int nCmdShow)                        // Fenster Anzeige Status
{

    >…// Shutdown
    KillGLWindow();                                // Kille das Fenster
    return (msg.wParam);                            // beende das Programm
}


Nun, da Sie dieses Tutorial geschafft haben, ein paar Worte über Textur-Erzeugung und bumpmapped Objekte, bevor Sie anfangen, mächtige Spiele zu programmieren und sich dann darüber wundern, warum bumpmapping nicht so schnell ist oder nicht so gut aussieht:

  • Sie sollten, anders wie in diesem Tutorial, keine 256x256 Texturen verwenden. Damit werden die Dinge langsamer. Machen Sie das nur, um die visuellen Fähigkeiten zu demonstrieren (wie in Tutorials).
  • Ein bumpmapped Würfel ist nicht gewöhnlich. Ein rotierender Würfel noch weniger. Der Grund dafür ist der Betrachtungs-Winkel: Je steiler er wird, desto mehr visuelle Störungen erhalten Sie auf Grund der Filterung. Fast alle Multipass-Algorithmen werden dadurch beeinträchtigt. Um die Nötigikeit einer hochauflösenden Textur zu vermeiden, reduzieren Soe den Betrachtungs-Winkel auf einen sensiblen wert oder reduzieren Sie die Bandbreite der Betrachtungs-Winkel und pre-filtern Sie Ihre Textur, damit diese perfekt in diese Bandbreite passt.
  • Sie sollten als erstes die farbige Textur haben. Die Bumpmap kann häufig daraus erzeugt werden, indem ein durchschnittliches Grafikprogramm verwendet wird, und sie in eine Grau-Skalierung konvertiert wird.
  • Die bumpmap sollte "schärfer" und höher im Kontrast sein, als die Farb-Textur. Das wird grundsätzlich dadurch erreicht, dass ein "sharpening filter" auf die Textur angewandt wird, was vielleicht auf den ersten Blick etwas komischt aussieht, aber glauben Sie mir: Sie können sie HÄUFIG 'schärfen', um erstklassige visuelle Effekte zu erzielen.
  • Die Bumpmap sollte um 50%-grey (RGB=127,127,127) zentriert werden, da das "überhaupt gar kein Bump" bedeutet, hellere Werte repräsentieren Bumps und dunklere "Scratches". Das kann mittels der "Histogram" Functionen in einigen Grafikprogrammen erreicht werden.
  • Die Bumpmap kann ein Viertel der Größe der farbigen Textur sein ohne visuelles Erscheinen zu "killen", obwohl Sie definitiv einen Untetrschied sehen werden.

Nun sollten Sie zumindest ein grundlegendes Verständnis des hier vorgestellten Themas haben. Ich hoffe, Sie haben es genossen, es zu lesen.

Wenn Sie Fragen und / oder Vorschläge bezüglich dieser Lektion haben, können Sie mich anmailen oder meine Webseite unter http://www.glhint.de besuchen.

Dank geht an:

  • Michael I. Gold für seine Bump Mapping Dokumentation
  • Diego Tártara für seinen Beispiel Code
  • NVidia dafür, dass Sie die großartigen Beispiele ins WWW stellen
  • Und zu guter Letzt an NeHe, der mir geholfen hat, vieles über OpenGL zu lernen.

Jens Schneider

Jeff Molofee (NeHe)

* DOWNLOAD Visual C++ Code für diese Lektion.

* DOWNLOAD Borland C++ Builder 6 Code für diese Lektion. ( Conversion by Christian Kindahl )
* DOWNLOAD Code Warrior 5.3 Code für diese Lektion. ( Conversion by Scott Lupton )
* DOWNLOAD Delphi Code für diese Lektion. ( Conversion by Michal Tucek )
* DOWNLOAD Dev C++ Code für diese Lektion. ( Conversion by Dan )
* DOWNLOAD GLut Code für diese Lektion. ( Conversion by Bruce Barrera )
* DOWNLOAD Java Code für diese Lektion. ( Conversion by Jeff Kirby )
* DOWNLOAD JoGL Code für diese Lektion. ( Conversion by Abdul Bezrati )
* DOWNLOAD Linux Code für diese Lektion. ( Conversion by Luca Rizzuti )
* DOWNLOAD Linux/SDL Code für diese Lektion. ( Conversion by Ti Leggett )
* DOWNLOAD LWJGL Code für diese Lektion. ( Conversion by Mark Bernard )
* DOWNLOAD Mac OS Code für diese Lektion. ( Conversion by Morgan Aldridge )
* DOWNLOAD Mac OS X/Cocoa Code für diese Lektion. ( Conversion by Bryan Blackburn )
* DOWNLOAD Visual C++ / OpenIL Code für diese Lektion. ( Conversion by Denton Woods )
* DOWNLOAD Visual Studio .NET Code für diese Lektion. ( Conversion by Grant James )


Deutsche Übersetzung: Joachim Rohde
Der original Text ist hier zu finden.
Die original OpenGL Tutorials stammen von NeHe's Seite.