Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

27.06.2009, 16:00

Brauche Hilfe zu EMBM (Environmental BumpMapping)

Hallo,

ich habe mir von dieser Seite: http://www.zanir.szm.sk/dx10-19.html das 11. Programm angesehen "Program 11 - Environment mapped bump mapping (EMBM)".
Leider kann man nur den Source code und das fertig kompilierte Programm herunterladen und dann ist das auch noch mit einerm VertexProgramm (also einem Assembler Shader) gemacht und nicht mit HLSL.
Daher verstehe ich nicht, wie das EMBM richtig funktioniert.
Kann mir jemand sagen, wo man nach lesen kann, wie EMBM genau funktioniert, oder wo ich ein HighLevel Shader dafür herbekomme?
Der Effekt, sieht nämlich wirklich sehr, sehr schön aus.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

2

29.06.2009, 17:45

Kennt sich denn niemand mit EMBM aus? :(

3

29.06.2009, 18:37

In David's Buch ist es beschrieben, allerdings ohne Shader.

Ansonsten mal nach "environment bump mapping" googlen...
fka tm

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

4

29.06.2009, 21:40

Oh hab den Thread ganz übersehn.

Also vom Prinzip her ist es einfach Bumpmapping + CubeMap-Spiegelung.

Da du dich ja auch schon mit Sachen wie Wasserrendering auseinandergesetzt hast geh ich jetzt einfach mal davon aus, dass du mit dem grundsätzlichen Vorgehen bei Bumpmapping vertraut bist (hack ruhig nach falls nicht).

Jetzt benutzt du die Normale (im Worldspace! - hier darf man nicht wie sonst gern bei direktionalen Licht gemacht die Lichtrichtung pro Vertex in den TangentSpace umrechnen, sondern man muss tatsächlich jede Bumpmap-Normale per Pixel im WorldSpace berechnen!!) um aus einer Cubemap zu samplen - und das mein ich auch so: Du setzt die Normale einfach als Texturkoordinate ein.

Jetzt hast du deine "Spielungsdaten" welche du mit einen beliebigen Faktor multipliziert an den Rest der Farbe ranaddieren kannst.

Voilà Environmental BumpMapping :D

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

29.06.2009, 21:54

Danke schonmal =)

also es stimmt, dass ich mich schon mal mit dem Grundprinzip von BumpMapping 'auskenne'.
Jedenfalls weiß ich leider noch nicht so wirklich was mit TangentSpace gemeint ist.

Zur CubeMap: ich kann da also anstatt texture2D(tex, vec2(x, y)) eine 3D Koordinate angeben? z.B: textureCube(cubmap, vec3(x, y, z)) (ich hab bisher nämlich nur mit 2D Texturen in Shadern gearbeitet).

Ich bin noch nicht 100% fit mit allen Matrizen die die Renderer anbieten. Z.B. hat OpenGL eine Modelview Matrix wohingegen Direct3D eine View Matrix und eine World Matrix besitzt. Diese Matrizen habe ich in zwischen verstanden, aber TangentSpace ist mir noch sehr neu.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

29.06.2009, 22:05

ist ja auch irrelevant für diese art von bumpmapping. normalerweise ist tangentSpace ein lokales koordinatensystem für jede bumpmapnormale. wenn deine textur in diesem tagentspace vorliegen, dann muss man pro vertex eine normale tangente und binormale nutzen, um ein lokales koordinatensystem zu schaffen. dorthin wird dann die lichtrichtung transformiert. hat den vorteil dass du eine normalmap in tangentspace für jegliche geometrie nutzen kannst.

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

7

29.06.2009, 22:15

@ TrommlBomml
Naja ganz irrelevant ist der Tangentspace ja nicht - nicht solange man eben solche "handelsüblichen" Bumpmapsbenutzt wie du gerade beschrieben hast.

Die Geschichte mit den Tangenten ist imho nur dann uninteressant, wenn man derartige Normalmaps verwendet, weil hier die Angabe der Normalenvektoren schon im Worldspace ist - statt eben wie sonst im Tangentspace.

Gut in dem Demo werden einfach Reliefs verwendet - aber ich geh mal schwer davon aus, dass die in Bumpmaps umgerechnet werden.

Oder warum hättest du jetzt gemeint, dass man keinen Tangentspace bei dieser Art von Bumpmapping aufmachen muss?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

8

30.06.2009, 15:32

Ich habe mich eben mal über Tangent Space informiert.
Das ist also zum Umrechnen von Texture Koordinaten in Welt Koordinaten (u, v) -> (x, y, z) oder so ähnlich.

Trotzdem verstehe ich das Prinzip von EMBM immer noch nicht richtig?! Ich hätte gerne mal ein Beispiel mit GLSL oder HLSL, warum sind immer alle Beispiele nur mit diesen AssemblerShadern? :(

Was soll ich eigentlich genau mit der Tangente und der Binormale anfangen?
Muss ich mit Vertex Attributen arbeiten? (ich hoffe nicht)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

30.06.2009, 15:47

@wümpftlbrümpftl: ok, dann hab ich da was falsch verstanden! dann ist der natürlich nicht irrelevant.

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

10

30.06.2009, 17:54

Du musst die Tangente in der Tat im Vertex speichern.

Das mit dem Tangentspace ist eine etwas längere mathematische Geschichte...
Am besten du siehst dich einfach mal nach Infos zum grundlegendem Bumpmapping um.
Wenn du das richtig verstanden und umgesetzt hast, dann ist es zum Environmental Bumpmapping nur noch ein kleiner Schritt.

Oder aber du benutzt alternativ Normalmaps deren Normalenangaben im Objectspace vorliegen (wie bei dem bunten Bild in einen meiner Posts weiter oben).

Vorteile:
- Man kann auch schön Detailreduktionvon hochauflösenden Modellen betreiben
- Tangente muss nicht berechnet werden, folglich entfällt deren Speicherung im Vertex sowie das Umrechnen der Bumpmapnormalen
- Sogar die Normale im Vertex wird hinfällig, da nun alle Normalen aus der Textur kommen

Nachteil:
- Geringere Genauigkeit
- Texturen müssen pro Model erstellt werden; Mehrfachverwendung ist unmöglich
- Texturen dürfen sich nicht auf der Oberfläche wiederholen
- Da jetzt pro Vertex gar keine Normalen mehr vorhanden sind, ist das gesammte Model auch auf die Texeldichte angewiesen damit es zu keinen Beleuchtungsfehlern kommt

Werbeanzeige