ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4395365
Jetzt (Chat):
25 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-
"Pixel-Shader Bump Mapping" von Stefan Zerbst (Stefan Zerbst)


Hi,

und damit es nicht zu langweilig wird wieder ein neuer Shot. Ihr dürft auch gerne etwas einsenden ;)

Auf dem Bild sieht man oben links die diffuse Textur und darunter eine Textur, die als Heightmap dient. Das Programm saugt sich die beiden Texturen rein und generiert aus der Heightmap eine Normalmap, welche auf der linken Seite zu sehen ist.

Für alle die nicht wissen was eine Normalmap ist: Sie enthält keine Farbdaten für das Rendern, sondern die RGB Werte repräsentieren jeweils die XYZ Komponenten eines Normalenvektors der aus den Höhenunterschieden in der Heightmap generiert wurde. Damit enthält jeder Pixel der Normalmap einen Normalenvektor.

Nun kann man selbst ein einfaches Rechteck per-Pixel genau beleuchten, so als ob es ein komplexes Mesh wäre. Das Bild ganz unten zeigt zwei Ansichten aus der laufenden Applikation. Das kleine weisse Klötzchen ist ein Point Light welches vor dem Rechteck herumschwirrt. Man kann sehr schön sehen, wie das Rechteck aus vier Vertices so schattiert wird als ob es eine kachelige Struktur hätte, und dass sich der Schattenwurf nach der Position der Lichtquelle richtet.

Das Programm läuft über je einen Vertex- und Pixel-Shader, und ist ein Demo aus dem Kapitel des Kompendiums was man mit Shadern so alles machen kann ;)

Ciao,
Stefan







Von Eisflamme am 30.07.2003, 19:45:54 Uhr
Villeicht sendet niemand was ein, gerade damit du mehr solche Leckerbissen zeigst. :D

Von ThunderEye am 30.07.2003, 20:01:28 Uhr
Mann, das wird nen Buch! :) *freu*

Von mastervc am 30.07.2003, 20:26:46 Uhr
schön

Von Jack the Ripper am 30.07.2003, 20:40:08 Uhr
naja...ich will dir ja nicht zu hane treten - aber so interessant ist ein Bumpmapping bsp jetzt auch nun wieder nicht - Mr. Zerbst ;-)

Von Stefan Zerbst am 30.07.2003, 21:02:09 Uhr
Hi,

das ist ja auch kein Buch über Shader, sondern nur ein kleines Kapitel für Einsteiger ;)

Aber Du kannst Deine Variante ja auch beisteuern wenn sie nun stabil läuft. Was hälst Du davon?

Ciao,
Stefan

Von Swordfighter am 30.07.2003, 21:30:04 Uhr
Zitat:
Mann, das wird nen Buch!

Yep - ich kann's kaum erwarten - ganz besonders freu ich mich auf die Implementation von Bots mit einer Scriptsprache. :D

P.S. Netter Shader ;)

Von ChrisM am 30.07.2003, 21:43:16 Uhr
Gewohnte Zerbst-Qualität (wie beim letzten Screenie)! :)

Was sind die beiden kleinen weißen Rechtecke in dem Windowshot unten?
EDIT: Das kommt davon, wenn man Text nicht richtig liest, es ist es Pointlight!

ChrisM

Von Stefan Zerbst am 30.07.2003, 21:46:33 Uhr
Hi,

der EInfachheit halber verwenden die Point Lights, die durch Würfel darfgestellt werden, dieselbe diffuse Textur. Da sie daher auf den Shots etwas schlecht zu sehen waren habe ich sie kurzerhand ausgeschnitten :)

Ciao,
Stefan

Von Mr.DX am 31.07.2003, 10:30:49 Uhr
Netter Shot. Da tun sich ja Horizonte auf.
Aber mal ne Frage: Was ist eingentlich schneller, Hardware Bumpmapping oder Pixel-Shader Bump Mapping?

Von ThunderEye am 31.07.2003, 11:49:45 Uhr
@ Mr.DX: Ich denke mit genug PS Pipelines ist PS Bump Mapping schneller. :)
Kommt also auf die Hardware an.
Mfg
ThunderEye

Von ONeinONeill am 31.07.2003, 12:00:24 Uhr
Hi,

schaut gut aus.

Gibt es ne kleine Demo? Bump-Mapping kommt ja nur in Bewegung richtig zur Geltung, :)

Von Stefan Zerbst am 31.07.2003, 12:21:40 Uhr
Hi,

eine Demo wird es demnächst im Beta-Bereich geben. Dort wird die alte Demo der Engine durch eine Demo mit Shadern ausgetauscht.

Wenn das stabil auf allen Karten läuft, wird es die Demos aus dem Buch auch öffentlich auf der Seite zu dem Buch geben :)

EDIT @Performance
Über Shader sollte das schneller sein, allein deshalb weil moderne Karten die Fixed Function Pipeline nur über eigene Shader emulieren. Diese sind dann natürlich umfassender und mächtiger, aber auch entsprechend schwerer => längere Ausführungszeit je Vertex/Pixel. Eigene Shader kann man so schlank wie möglich halten.

Ciao,
Stefan

Von Darkforce am 31.07.2003, 14:48:59 Uhr
Sagmal, wie kannst du das eigentlich verantworten? Hier immer solche Screenis zu posten und das Buch noch net draußen haben ;)

Ne, ich freu mich auch schon auf das Buch und hoffe das meine erste Engine bis dahin halbwegs läuft...

Von pepe am 31.07.2003, 15:33:17 Uhr
nice nice....aber ich denke mal das es den PixelShader V1.1 vorraussetzt oder ??

kamm man das auf für die 1.0 umschreiben ? habe nur eine G4 MX 400.

pepe

Von Stefan Zerbst am 31.07.2003, 16:17:21 Uhr
Hi,

und ich dachte die einzigen Chips die noch ausschließlich 1.0 Versionen unterstützen sind die Go Chips der GeForce :)

Mal schauen was sich bei den Shadern dort machen lässt. Ich weiss nicht so genau, was der Version 1.0 im Gegensatz zu 1.1 fehlt.

ciao,
Stefan

Von Mayhem am 31.07.2003, 17:10:19 Uhr
>>nice nice....aber ich denke mal das es den
>>PixelShader V1.1 vorraussetzt oder ??
>>kamm man das auf für die 1.0 umschreiben ? habe
>>nur eine G4 MX 400.

Ja. Normales DOT3-BM wie Stefan es hier gezeigt hat, ist als festverdrahtete PerPixelfunktion (ps1.0?) ab GF1 enthalten.BumpedCubeEnvironmentMapping, wie es auch schon mal als IOTW gezeigt wurde, ist hingegen nur ab GF3 moeglich.

Von Fastjack am 31.07.2003, 18:34:40 Uhr
Wie ist das eigentlich in Verbindung mit Cube mapping. Ich habe letztens etwas gelesen. Da wurde eine Cubenormal map, erstellt, auf der Einfach auch normalvektoren in richtung Ursprung gespeichert sind. Und dann wird je nach lichtrichtung die Cubemap auf den Meshgemapped, und mit der Normalmap des Meshes verarbeitet.
Ist das schneller oder langsamer?

PS.: Wie hast du eigentlich das umrechnen von der Highmap in die Normalmap gemacht? Hast du immer drei beieinander liegende Pixel genommen, ein dreieck daraus erstellt, und den normalvektor berechnet??

Von DarkAngel am 01.08.2003, 12:25:43 Uhr
Hi,

@ Fastjack: Die Cubenormalmap ist zum normalisieren der Pixelnormals gedacht, da die beim interpolieren vom Vertex zum Pixelshader ungenau werden können wenn die Polygone zu groß sind. Ein ps.1.1 - ps.1.4 hat aber noch nicht die nötigen Instructions zum normalisieren, also wird eine Cubemap adressiert die einen normalisierten Vektor zurück gibt.

Von BlackAnger am 01.08.2003, 14:26:34 Uhr
also so wild find ich das Bild auch net, Mr. Zerbst... :)

könntest mehr bilder vom Editor posten...(dies wünscht sich ein MFC Programmierer :))

Von Fastjack am 01.08.2003, 16:27:25 Uhr
Hm, versteh ich net ganz. Was genau meinst du mit Pixelnormals? Es gibt doch nur die Normals die Vektoren, welche eigentlich normalisiert sein sollten, und die Normals von der Bumpmap. welche auch normalsisiert sein sollten...

Von Haifisch am 01.08.2003, 16:38:40 Uhr
Also ich will jetzt nicht Zerbies Schreibkünste in Frage stellen - mit den Büchern habe ich es endlich geschafft, DX-Programmierung zu verstehen - aber die Shader-Beispiele sind nun wirklich relativ einfach zu bauen. Ich hoffe nur, dass Zerbie in seinem Buch noch darüber hinaus geht, was hier zu sehen ist!!! Interessant wäre z.B. mal eine animierte Wasseroberfläche und wie die Konstantenregister zu füllen sind, damit der Effekt zustande kommt. Das ist nämlich ein großes Problem des NVidia-SDK's: Der Shader-Code ist zu sehen, aber leider nicht, wie die Konstantenregister z.B. aus einem C++-Programm gefüllt werden, was mich brennend interessieren würde.

Von Stefan Zerbst am 01.08.2003, 17:00:38 Uhr
Hi,

also wie man Konstanten-Register für einen Shader füllt ist doch nur ein Funktionsaufruf. Oder meinst Du ein spezielles Beispiel?

Was die Shader angeht: Das ist kein Buch über Shader, es enthält ein Einführungskapitel in Shader ;) Wer etwas über Shader lernen will, dem empfehle ich ein gutes Buch was sich ausschließlich mit Shadern beschäftigt. Bisher habe ich zwar noch keines gefunden, aber ShaderX 2 sieht vielversprechend aus.

Im Kompendium geht es um die Entwicklung einer Engine und um Indoor-Rendering. Der Shader Teil ist nur ein kleiner Appetithappen für Leute die bisher noch nichts damit zu tun hatten :)

@Heightmap -> Normalmap
Ja, ich nehme den aktuellen Pixel, einen rechts daneben und einen rechts diagonal drunter.

Ciao,
Stefan

Von Nico am 01.08.2003, 20:07:54 Uhr
Wenn jemand weiß wie das geht, und einen Algo, ein Prog oder ein Tut dafür hat, dass aus Textur und Heightmap einer Normal Map gemacht wird, bitte mir schicken (icq#85518570,tnico@web.de) oder hier posten, danke :-)

Von Mr.DX am 02.08.2003, 07:52:24 Uhr
Da gibt es doch schon eine DX-Funktion dafür. Oder täusche ich mich da?

Noch mal ne Frage:
Lässt dein bumpmapping-Sample auch mehrere Lichtquellen zu?

Von Stefan Zerbst am 02.08.2003, 10:54:01 Uhr
Hi,

das Sample würde das zulassen. Man müsste nur jede weitere Lichtquelle in ein Register schieben, analog der erste Lichtquelle den Lichtvektor berechnen und weiterschieben. Dann hängt es von der Anzahl der Texturregister ab.

Man könnte das ganze aber auch in mehrere Passes rendern. Man sollte aber auch bedenken, dass zu viel Licht den schönen Effekt zerstören würde, weil man dann eben nicht mehr eine helle und eine schattierte Kante sehen kann ;)

Ciao,
Stefan

PS: Ja es gibt eine D3DX Funktionen mit der man eine Heightmap zu einer Normalmap umrechnen kann. Siehe SDK Bump Map Samples.