OpenGl Stencil Buffer und Farbtiefe



  • Hi,

    ich versuche gerade OpenGL zu lernen, dazu arbeite ich mich durch die NeHe Tutorials von nehe.gamedev.net.

    In Lektion 26 werden Reflektionen mit Hilfe des Stencil Buffers erklärt, diese Lektion habe ich auch durchgearbeitet und (fast) alles verstanden.
    Ich habe versucht Spiegel mit Hilfe dieser Technik in meiner Anwendung zu implementieren, was auch klappte nur ging die Framerate in den Keller, hatte gerademal 1 Fps.
    Darüber wunderte ich mich natürlich weil der Nehe Beispielcode absolut flüssig lief, in meiner Anwendung hatte ich auch nicht mehr Objekte plaziert, die 3D Szene war gleich dem Nehe-Bsp.
    Schliesslich merkte ich das in dem Nehe-Bsp OpenGL mit 32 bit Farbtiefe initialisiert wird und ich meine Anwendung mit 16 Bit initialiere, als ich meine dann auch mit 32 Bit initialisierte lief es wunderbar flüssig.
    Das verstehe ich aber nicht, ich glaube mal gehört zu haben das 16 Bit schneller ist, aber wenn ich den Stencilbuffer benutze scheint das nicht der Fall zu sein. Wieso ? Ich meine ich möchte OpenGL verstehen und es nachvollziehen können und dazu will ich das eben verstehen.

    Das Tutorial ist unter http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26 erreichbar, der Code für VC++ 6 unter http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26 , Code für Linux ist auch da.

    Mein Rechner ist ein P3 450Mhz mit 256 MB Ram und Geforce 1 und mein Compiler ist der VC++ .NET.

    thx



  • hmm, hast du vielleicht dein OGL mit 32 Bit initialisiert (also die PrimeSurface???)
    dann wäre es nämlich klar. Jedesmal von 32 auf 16 und umgekehrt rumzurechnen kann ganz schön Performance rauben...



  • Ich verwende den gleichen Initialisierungcode wie in dem Tutorial von meinem Link oben.
    Ich habe übrigens noch nicht soviel Ahnung von OpenGL, wie gesagt arbeite ich gerade die Tutorials von Nehe durch.
    Wenn ich die Anwendung im Fenstermodus laufen lasse und meine Desktopfarbtiefe 32 Bit ist ruckelt es nicht und bei 16 bit Desktoptiefe ruckelt es. Klar weil OpenGL die Desktopfarbtiefe übernimmt, aber ich wollt es auch nochmal ansprechen.
    Im Vollbild ist das Problem auch.



  • BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
    Bei der funktion bits mit 32 auffüllen..
    Dann müsste es auch im FullScreen klappen!



  • Ne es ging mir nicht darum dass ich nicht weiss wie man 32 Bit im Vollbild initialisiert bekommt. Meine Frage war nur wieso der 16 Bit Modus beim rendern der Reflektionen so viel langsamer ist, das verstehe ich nicht.



  • Überleg doch mal.
    Wenn OGL einen 32 Bit Buffer in einen 16 BitBuffer kopieren muss (hier den StencilBuffer in den PrimeBuffer) dann muss doch jeder Pixel umgerechnet werden.
    Schliesslich stehen dem StencilBuffer für jeden Pixel 32 bits zur Verfügung, dem Primary Buffer hingegen nur 16.
    Das bedeutet du muss ständig vom Primebuffer zum Stencilbuffer HOCHRECHNEN und danach vom StencilBuffer zum Primebuffer RUNTERRECHNEN...


  • Mod

    da unter 16bit kein hardware stencilbuffer zur verfügung steht, wird auf software umgestellt und wenn die cpu das ganze zeichnen macht, dann ist es langsammer als mit der graka, die unter 32bit den zubuffer mit 24bit und den stencilbuffer mit 8bit verwendet.

    rapso->greets();



  • hmm seltsam

    aber nur bei älteren grakas oder?

    [ Dieser Beitrag wurde am 24.06.2003 um 21:03 Uhr von Sovok editiert. ]



  • Sovok: Geforce 1. Ich glaube da hat der Stencil Buffer gerade an Bedeutung gewonnen..


  • Mod

    selbst die neusten grakas unterstützen keinen stencilbuffer bei 16bit, das liegt daran dass der stencilbuffer und der zbuffer im selben speicher liegen und weil der dafür aufgeteilt werden muss, müßte man einige bits von den 16 opfern, das ist aber wohl nicht das wahre, weil 16bit nicht gerade hoche präzision erlauben (zfighting gefahr)

    bei 32bit hat man hingegen genug spielraum um 8bit für stencil zu opfern.

    ich glaube die RivaTnT konnte das schon und die matrox g400 hat dafür extra demos spendiert bekommen in denen volume shadows gezeigt wurden...

    rapso->greets();



  • Danke, jetzt versteh ich das. Was kann man mit dem Stencilbuffer eigentlich noch so machen ausser Reflectionen und Schatten.

    Und noch was zu OpenGl. Kennt ihr vielleicht gute Tutorials über Kamera's, das was ich alles dazu gefunden habe ist nicht so toll und irgendwie find ich auch nichts gescheites zu Quaternionen.
    Und meine Kamera die versucht habe zu proggen funktioniert nicht richtig.
    Bin halt echt ein Anfänger.



  • haste nehe,gamedev,flipcode und gametutorials schon durchgeschaut?


  • Mod

    man kann mit denen den overdraw messen (bei jedem pixelsetzen den stencil incrementieren, oder grundsätzlich bei jedem möglichen pixel incrementieren)

    clippingplanes sind möglich, volume fog,csg bei multipass rendering an nicht perfekt aneinander passender geometri kann man dafür sorgen, dass ein pixel nicht zweimal additiv geblendet wird, wenn man 2d und 3d verbindet (wie bei manchen WiSims heutzutage gemacht wird) kann man versuchen ein wenig den zbuffer für die sprites zu faken, man kann quasi die ganzen flugzeug instrumente mit stencil zeichnen, dann kann man eventuell nur den hintergrund zeichnen ohne dass das kockpit neu gepinselt wird. bei weltraum shootern hat man oft ein bisschen probleme wegen dem zbuffer, weil er eine nicht ausreichende range abdeckt udn auch nicht ausreichend präzise ist, in diesen fällen kann man die objekte von vorn nach hinten zeichnen und für jedes davon einen eigenen stencilwert setzen und je weiter nach hinten man kommt, desto größer wird der stencilwert und man darf dann halt nur einen pixel setzen, wenn kein pixel mit kleinerem stencil gesetzt wurde, dadurch ist es möglich die z-range pro objekt neu zu setzen (also far und near clipping planes verschieben)

    übrigens sollte man, wenn man mehr als 16bit zbuffer benutzt, den stencil und den zbuffer immer gleichzeitig löschen, weil die grafikkarte sonst nicht ihren zeroticks-clear machen kann und mühsehlig jeden z-wert auf das "clearword" setzt, da 8bit ja immer stencil sind und beibehalten werden müssen.

    rapso->greets();



  • Ok, danke, ist ja erstmal ne Menge 🙂

    Die Nehe tutorials arbeite ich gerade durch, was zur Kamera ist da nicht drin. Die Kamera von Gametutorials ist irgendwie nicht so toll. Naja und ansonsten suche ich auch was mir die ganze Theorie von Quaternionen erklärt, aber da finde ich nur spärlich was. Eigentlich kenne ich mich mit der 3d Mathematik recht schlecht aus, und ich denke wenn ich weiter OpenGl machen will kommen ich sonst ziemlich schnell an meine Grenzen.


Anmelden zum Antworten