hab mir das Tangent Space Bumpmap demo von <a href='http://delphigl.cfxweb.net/' target='_blank'>http://delphigl.cfxweb.net/</a> mir mal runtegeladen und den source mal näher betrachtet, also ich finde das ergebnis kann sich echt sehen lassen, ein verdammt guter Bump- mit Gloss effekt.
Ich hab mitterweile schon viel bumpmap methoden gesehen, aber diese ist einfach umwerfend, deswegen hab ich mir es in den kopf gesetzt dies meiner engine hinzuzufügen. Jetzt kommen aber viele fragen:
1.) Das ganze funzt wie ich das jetzt gesehen habe, mit NV_VERTEX_PROGRAM und NV_REGISTER_COMBINERS. Also sind das CG Pixel Shader :,( Hab mir auch mal die vertex_programme angesehen, raff davon aber nicht eine zeile Die Pixel Shader sachen sind einfacher find ich durch zu peilen, die raff ich schon fast denk ich mal... aber wirklich verstehen tu ich das auch nicht
ín der datei "lighting_high.rcp" steht:
Code:
spare1 = spare1 * spare1;
für mich sieht das so aus, als würde der RGB Wert von Spare mit Sich selbst nochmal multiplitziert. Komisch ist aber das dies 3x hintereinander passiert... hmm...
hmm, also der alpha kanal wird invertiert, 1. wieso, 2. unsigned häää ? 3. zero ??? Also ist es out.a = 0 ? oda irr ich mich ?
datei "rotate_half_vector.vsp":
Code:
!!VSP1.0
# rotate half-angle vector into local space
DP4 c[10].x, v[0], c[4];
DP4 c[10].y, v[0], c[5];
DP4 c[10].z, v[0], c[6];
DP4 c[10].w, v[0], c[7];
END
Ich raff davon keine zeile... ASM CG
Führt sich mal jemand bitte der ahnung hat, sich das Tangent demo zu gemüte und erklärt mir das da überhaupt gemacht wird ? Aber bitte so das man es versteht, also keine Matheformeln aufsetzen, sondern wirklich nur ablauf. Ok, von mir aus matheformeln DD
2.) Noch ne frage: Also ich mir ne engine zusammengeschustert die auf Shader basis besteht ala q3a. Jeder Shader steht in einer Textdatei und kann theoretisch unendlich viele Texture Stages verarbeiten. Praktisch geht natürlich aber nur 4 mit GeForce4 Ti. Ok, das wisst ihr ja... Jetzt hät ich aber z.b. keien ahnung wie ich das Bumpmap dann unterbringen soll... weil es z.b. sein kann, nen Shader hat meistens mind. 2 Texturen: Base + Generated Static Lightmap. wo soll ich dann das Bumpmap unterbringen, so das die lightmap auch noch funzt ;???
3.) Hatte vor so ne art Gloss mapping zu machen, aber da das Bump demo auch so ein schöner Gloss schein hat braucht man das nicht oda doch ?
4.) Gibts denn keine möglichkeit Pixel Shader unabhängig von NV zu proggen ??? Weil nur NVidia ist auch doof, leute mit Radeon 9700 karten oder höher können sich das Bumpmap nich angucken obwohl die karte wesentlich besser ist als die GeForce 4.
5.) Jetzt eigentlich meine wichtigste frage, Dynamische Lichtquellen... was sind heutzutage die besten/schnellsten/schönsten methode und wie genau werden/müssen Bumpmaps mit beeinflusst ? Dynamische Lichtmaps sind out wie ich gehört habe, weil sie zu rechenintensiv sind und nen Texture unit schlucken Und wie wird ne Bumpmap beeinflusst, wenn mehrere Dynamische Lichtquellen in der nähe ist ? Oder reicht eine Lichtquelle für die Beeinflussung ? Ich versteh das überhaupt nicht... Weil im NVBumpmappingV2 demo von Sulaco wird die Bumpmap über glColor3f() beeinflusst, das kapier ich überhaupt nicht
6.) Hab ne Binary meines aktuellen Engine Templates mit reingepackt, wo Shader system, Static Lightmapping und Select Buffer Technicken benutzt werden, wäre echt cool wenn sich das ma einer der ahnung sich das ma zieht und mir sagt, ob meine shader struktur gut ist und wie man die weiterbauen kann usw. Kritik halt Einfach mal im data\ ordner rumwühlen... Leider spackt die SelectBuffer methode ein bissel... hoffe ich bekomm das in griss, und irgendwie will openGL manchma den glColor nich machen, warum raff ich nicht... weil z.b. im Vertex Selection Mode (Kann man oben bei den 3 Speedbuttons einstellen) sollten die angeklickten Vertices Geld sein... komisch ists aber, das trozt die richtige SelectID gefuden wurde, das ding nich gelb wird, obwohl dies im code passiert:
Code:
glPushMatrix;
r3d_DisableMultiTexturing;
glTranslatef(Vec.X, Vec.Y, Vec.Z);
if _Selected then
glColor3f(1.0,1.0,0.0) // Dahin geht er, habs mit ner Showmessage abgefangen, also funzt das schon...
<a href='http://encorex.no-ip.com/hosted_sites/radical3d/shared/files/radical3d_0.07alpha_game_template_bin.zip' target='_blank'>radical 3D Game Template 0.07 Alpha (Binary)</a>
<a href='http://www.cfxweb.net/~delphigl/files/TangentBumpSource.zip' target='_blank'>Tangent Space Bumpmapping Demo Src</a>
1. Die Endung rcp deutet eher darauf hin, daß es sich um ein Register Combiner Program handelt. Es gibt so eine nvparse.dll die diese Dateien lesen kann. Letztendlich ist es das gleiche wie wenn man glregistercombinernv(...) bentutzt, nur eben übersichtlich in einer Datei aufgeschrieben. In spare1 wird vermutlich der specular Wert 3 mal mit sich selbst multipliziert also hoch 8 genommen, damit man das Glanzlicht an den Rändern steiler abfällt schön als Punkt sieht. Man kann in den Register Combinern für jeden Wert noch angeben, wie er interpretiert wird, aber man kann nicht 1 direkt angeben. Deshalb wird 1 als Invert(0) dargstellt. Diese Vertex Program ist auch kein CG, sondern Text für NV_Vertex_Program. DP4 heißt 4 Komponenten Skalar produkt. In diesen 4 Zeilen wird ein der Licht Vektor mit einer Matrix multipliziert. Diese Matrix gibt es beim Tangent Bumpmapping bei jedem Vertex. Das Problem ist nämlich, daß die Normalen in der Normalmap so berechnet worden sind, als wenn die Fläche auf der Z-Ebene liegen würde. Wenn sie die Fläche auf einer anderen Ebene befindet, dann stimmen die Normalen aus der Normalmap nicht mehr. Anstelle jetzt jede Normale wieder richtig zu drehen wird der Lichtvektor einfach mit der inversen Matrix multipliziert.
2) Wenn du Bumpmappin und Echtzeitlich berechnen willst, dann wird die Szene anders als bei Quake3 gezeichnet. 1. Alles Schwarz zeichnen 2.Für jedes Licht begin Schatten berechnen glblendfunc(gl_one,gl_one); Licht auf nicht schattierte Stellen addieren end; 3. Zusätzliche Efekte
Auf Lightmaps kannst du dann verzichten. Eine Idee wäre jeder Fläche eine Diffuse,Bumpmap und Specularmap zuzuordnen. Wie das Licht addiert wird hängt von der Karte ab.
Bei einer GF3/4 braucht man z.B. 2 Schritte für jeweils diffuse und specular Komponenten des Lichtes. Ab eine GFFX oder Radeon 9500 geht das auch in einem Schritt.
4) Statt NV_Vertex_Program kann man ARB_Vertex_Program verwenden, das ist einfacher und auch für alle Karten verfügbar. Bei den Pixel Shadern kann man zumindest das diffuse Licht auch mit dem Texture Environment einstellen. Bei specular Licht muß man dann unterscheiden. Ab einer GFFX oder Radeon 9500 gibt es sowieso auch ARB_FRAGMENT_PROGRAM für beide Karten.
5) Es ist so das man für jedes Licht die Bumpmap aufaddiert. In der Demo von Sulaco übergibt er den Lichtvektor als Farbe. Das ist nur bei gerichteten Lichtern aber nicht bei Punktlichtern sinnvoll.
6) Ich würde das Shadersystem an die Art und Weise anpassen wie die Szene gezeichnet wird. Da man bei dynamischen Lichtern die Szene zeichnet, indem man alle Lichter aufaddiert verwendet man ja einige Texturen aus dem Shader merhfach. Meine Idee wäre es die Shader so aufzubauen: Grundbeleuchtung
Diffusemap Bumpmap Specularmap
weitere Texturen
Die Grundbeleuchtung wird zeuerst gezeichnet. Danach werden alle Lichter mit den Bumpmaps addiert und zum schluß kommen die weiteren Texturen. Zusätzlich wäre es noch sinnvoll pro Texture verschiedene Parameter einstellen zu können, wie Verschiebung, Drehung, LOD... Wenn du es ermöglichst, daß in dem Shader eine Formel stehen kann, daß werden die Scripts sehr flexibel.
Registriert: Mo Mai 06, 2002 20:27 Beiträge: 479 Wohnort: Bremen
Wenn ich mir deine Antwort so durchlese merk ich wie wenig ich eigentlich OpenGL kann.
Wo hast du dein ganzes Wissen her? Gibt's da Tutorials, (e-)Bücher oder Samples die du empfehlen kannst?
Im Bereich Tutorials für Fortgeschrittene ist die dgl Tut-Sammlung noch recht dünn besiedelt. Wenn dir mal danach ist würden sich, glaube ich, viele hier über ein kurzes (oder langes) Tutorial freuen. Wie wär's? *bettel*
Ok, ich hab mir dein post durchgelesen, und versteh nicht viel... In deiner Tech-Demo hast du so eine Shader Struktur wie du beschrieben hast. Ich will aber eignetlich ganz klein anfangen, und erstmal für Statische Lichter Lightmaps verwenden. Und halt das tolle Tangent Bumpmapping, weil dann brauch ich keine Specular, Diffuse texturen. Wobei ich nicht einmal raffe, warum überhaupt Specular, Diffuse und für was die gut sind.
Hab mal versuch das Tangent Bumpmap umzuproggen, damit ichs irgendwie in die engine einbauen kann. Am ersten scheiter ich schon:
Ein würfel besteht ja aus 6 Faces, so leider ist das demo aber mit GL_QUADS. und meine Engine mag nur Triangles, hab mal versucht das irgendwie umzuproggen, damit ich GL_TRIANGLE_STRIP, GL_POLYGON oder GL_TRIANGLES damit läuft... aber irgendwie sieht das recht komisch aus, wobei ich noch sagen muss, ich hab noch nie was mit den Befehlen:
zu tun gehabt, raffen tu ich was die machen, aber irgendwie weiss ich nicht wie man die genau benutzt. Ich hab den Modified source vom Tangent Space Bumpmap (Delphi3D) dazugepostet, wäre nett wenn sich das jemand mal anschauen könnte und vielleicht sogar die paar zeilen umproggt, die vertices, faces, normals hab ich alles schon drin... eignetlich muss es ja nur angepasst werden.
Das Problem ist, daß die Lightmap alle Lichter zusammen enthält. Beim Bumpmapping werden die Lichter aber einzeln aufaddiert. Eine Möglichkeit besteht darin für jedes Licht und jede Fläche eine eigene Lightmap zu erstellen.
Der diffuse Anteil des Lichtes hängt von dem Winkel zwischen Lichtquelle und Flächennormale(oder Normale der Bumpmap) ab. Dafür kann man einfach ein Skalarprodukt verwenden. Das Ergebnis ist ein Graustufenwert. Diesen Graustufenwert multipliziert man dann mit der ganz normalen Texture (diffuse map), wie man es beim Lightmapping auch machen würde. Da jetzt aber noch nicht die Entfernung von der Lichtquelle mit berücksichtigt ist, verwendet man noch eine Intensitätstexture. Das kann eine statische Lightmap oder eine 3D-Texture mit der Lichtintensität sein.
Der Lichtvektor wird als Texturekoordinate übergeben und dann automatisch über das Dreieck interpoliert. Das Problem dabei ist, daß der Lichtvektor dabei seine Länge ändert. Deshalb macht man eine Normalsations Cubemap, die bei den Texturekoordinaten (s,t,r) genau diesen Vektor als Farbe (r,g,B) codiert hat. Da beim Cubemaping die Texturekoordinaten (s,t,r) automatisch normalisiert werden, hat man auch den Lichtverktor normalisiert.
Bei 4 Texturen kann man das folgendermaßen machen: Texture0: Normalmap ,normale Koordinaten Texture1: Cubemap , Lichtvektor im Tangent Space Texture2: Diffuse Map,normale Koordinaten Texture3: Lightmap oder 3D Texture mit Intensität
Dann stellt man über die glTextureEnv Funktionen folgende Gleichung ein: (Texture0 dot Texture1)*Texture2*Texture3*Color
Das könnte z.B. so gehen. Je nach verwendeter OpenGL.pas und glext.pas heißen die Konstanten unterschiedlich.
Das speculare Licht besteht aus dem Licht, das nicht wie das diffuse Licht gestreut, sondern direkt reflektiert wird. Vermutlich kennen die meistens diese hellen Punkte auf reflektierenden Böden, die mitwandern, wenn man sich bewegt. Specular Bumpmapping wirkt meiner Meinugn nach plastischer als nur diffuses alleine. Es gibt drei Unterschiede bei der Programmierung zu beachten. 1. Man verwendet nicht den Lichtvektor, sondern den Halb-Winkel Vektor, das ist (Licht-Punkt)+(Kamera-Punkt). (Wenn man eine GFFX oder Radeon 9500 hat, dann kann man auch den Lichtvektor pro Pixel an der Oberflächennormalen reflektieren.) 2. Man verwendet nicht die Diffuse map, sondern eine Specular Map, die angibt wie das Licht reflektiert wird. In einem Off-Topic Thread habe ich da schon mal was zu geschrieben. 3. Damit es auch einen schönen glänzenden Punkt gibt, der deutlich steiler ist und sich auch vom diffusen Licht abhebt potentiert man das Erbenis des Skalarproduktes mit 4,8,16 oder einem anderen Wert. Auf einer GF3 geht das nur indem man den wert 3 mal mit sich selbst mal nimmt. Das geht dann aber nur mit ARB_FRAGMENT_PROGRAM,NV_REGISTER_COMBINER oder ATI_FRAGMENT_SHADER.
Das Ergebnis des diffusem und specularen Lichtes wird addiert.
gl_drawelements(): zeichnet die Vertex aus einem Vertex Array glEnableClientState: stellt ein Vertex Array an oder aus
glTrackMatrixNV, glProgramParameter4fNV, , glVertexAttribPointerNV= nur für NV_VERTEX_PROGRAM
glTrackMatrixNV: ermöglicht eine Matrix als Parameter an das Vertex Program zu übergeben. Bei ARB_VERTEX_PROGRAM braucht man das nicht mehr, weil man dort die Matrix direkt angeben kann.
Ich kann ja mal ein Tutorial zu dem Thema schreiben. Auf den Seiten von NVidia gibt es eine Menge Informationen zu dem Thema.
In diesem PDF steht ganz am Ende( mit C Quelltext) wir man aus einer Höhenkarte eine Normalmap generiert und wie man die Normalisationscubemap erzeugt. Außerdem sind die Register Combiner erklärt. Dort steht allersdings noch was von 2 Combiners, weil es um die GF1 geht. <a href='http://developer.nvidia.com/view.asp?IO=Bump_Mapping' target='_blank'>http://developer.nvidia.com/view.asp?IO=Bump_Mapping</a>
Laß dich bei dieser Datei nicht von den ganzen Formel abschrecken, die muß man gar nicht alle wissen. Das interessante fängt erst auf Seite 12 an. Das war eines der ersten PDF die ich mir zu dem Thema angesehen hatte und ich mußte damals noch mit Modem und Geschwindigkeiten von 1-2 Kb/sek richtig lange drauf warten.
Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.