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

1

01.01.2010, 19:00

Verständnisfragen Parallax-Mapping (Offset-Bumpmapping)

Hallo,

ich hätte da mal ein paar Fragen zu diesem Konzept bzw. zu einem Paper über dieses Thema. Dort heißt es:

"Parallax mapping offsets the texture coordinates according to the view so that the surface looks bumpier (thus sometimes also called offset [bump-]mapping). The idea is to return the texture coordinates for where the view vector would intersect the surface had it really been bumpy. This would normally require ray-tracing the height-map in some way, but if the height-map is smooth, a cheap approximation can be used. Simply assume that the neighborhood has pretty much the same height, so then the new texture coordinates can be computed like this:"

C-/C++-Quelltext

1
2
3
float height = tex2D(Bump, texCoord).a;
float offset = 0.035 * (2.0 * height - 1.0);
float2 parallaxTexCoord = texCoord + offset * viewVec.xy;


Um das mal schrittweise durchzugehen:

"This would normally require ray-tracing the height-map in some way"

Wie genau hat man sich das vorzustellen? Man hat also irgendwo seine Objekte in der Szene, raytraced dann einen Strahl pro Bildpixel, verfolgt diesen Strahl dann in Texturen bzw. die Depth-Map und erhält dann den Wert?

"but if the height-map is smooth"

Smooth heißt weich, aber was bedeutet das? Hat z.B. eine Mauer, die aus Ziegelsteinen besteht zwischen den einzelnen Steinen und dem Mörtel harte oder weiche Übergänge?

"Simply assume that the neighborhood has pretty much the same height"

Genau das würde dann nämlich keinen Sinn machen, wenn das Mauerbeispiel tatsächlich weich ist, weil ich dann ja im Prinzip einen Strahl in die Textur schieße und davon ausgehe, dass die gesamte Textur nahezu eine Höhe hat, wenn der Nachbar des Nachbarn des Nachbarn ... des Nachbarn des Strahls alle ungefähr gleich hoch sind.

Der Code ist mir auch nicht so 100% klar. Die erste Zeile zwar schon, aber wie ich z.B. auf den offset komme oder was er bedeutet, bzw. warum ich den draufaddiere oder noch mit dem View-Vektor multiplizieren muss, entzieht sich gerade meiner Vorstellungskraft.

Bitte um Erklärung :)

2

01.01.2010, 23:29

Vorweg: Ich habs noch nicht selbst implementiert, mich aber schon mit der Technik vertraut gemacht.

Du betrachtest jeden Pixel aus einem bestimmten Sichtwinkel, also entlang der Gerade die durch die Kamera und das Dreieck verläuft.
Nun steht das Dreieck in einem beliebigen Winkel zur Kamera und hat eine Heightmap bekommen, also die Parralaxmap.
Stell dir vor du hast eine Fläche und setzt da jetzt einen Berg drauf, und ziehst vom Blinkwinkel eine Linie durch die Bergspitze. Diese wird die Fläche weiter hinten treffen.
Wenn du also an der hinteren Stelle statt dem Pixel von der Fläche den Pixel von dem Berg nimmst, sieht es so aus, als wäre die Oberfläche rau, wobei sie natürlich die ganze Zeit flach bleibt.
Du überlegst dir also für jeden Pixel, welcher andere Pixel dort eigentlich zu sehen sein müsste und benutzt den. Weil die Heightmap aber beliebig sein kann, kann man das nicht so ohne weiteres direkt bestimmen, also nimmt man eine Näherung, das geht schnell und sieht noch halbwegs gut aus.

Das mit dem "smooth" ist komisch formuliert, es heißt im Prinzip das eine relativ Flache Heightmap weniger Fehler bei der Näherung erzeugen wird als eine total wilde.
Lieber dumm fragen, als dumm bleiben!

3

02.01.2010, 03:21

Ich habs auch noch nicht implementiert oder mich zu sehr damit beschäftigt, irgendwann hab ich aber dieses Paper gefunden, das könnte dir weiterhelfen.

4

07.01.2010, 13:21

Ja, das Paper ist in der Tat nicht schlecht. Ich hab auch noch einige andere gefunden, das Problem ist nur, dass ich pro Absatz immer mehrere Verweise finde, die mehreren zu anderen Papern führen usw. ^^

Ich habe auch schonmal davon gehört, dass man Parallax Mapping benutzen kann, um Heightmaps beim Shadow Mapping zu approximieren. Wie soll das denn genau funktionieren? Die Heightmap ist doch komplett von der Geometrie abhängig (wird ja aus der Sicht eines Lichts gerendert), wie soll ich da denn etwas approximieren können?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

07.01.2010, 14:02

Re: Verständnisfragen Parallax-Mapping (Offset-Bumpmapping)

Zitat von »"Sk!p"«

"Parallax mapping offsets the texture coordinates according to the view so that the surface looks bumpier (thus sometimes also called offset [bump-]mapping). The idea is to return the texture coordinates for where the view vector would intersect the surface had it really been bumpy. This would normally require ray-tracing the height-map in some way, but if the height-map is smooth, a cheap approximation can be used. Simply assume that the neighborhood has pretty much the same height, so then the new texture coordinates can be computed like this:"


Du darfst erstmal einfaches Parallax Mapping nicht mit komplexerem Relief/Parallax Occlusion Mapping verwechseln. Letzteres verwendet Raytracing Techniken, ersteres nicht.

Beim einfachen Parallax Mapping passiert genau was in dem Text da steht. Die Idee ist einfach Pixel die höher liegen näher in Richung der Kamera zu ziehen und Pixel die tiefer liegen weiter weg von der Kamera, das erreicht man indem man die Texturkoordinaten lokal entsprechend verzerrt (also einfach proportional zur Höhe entlang der Projektion des Vektors zur Kamera auf die Polygonebene verschiebt). Aber ein Bild sagt mehr als tausend Worte:


(Link)


Das funktioniert natürlich nur in gewissem Rahmen gut. Wenn du extreme Sprünge in der Höhe hast oder es zu großen Selbstüberdeckungen kommen würde (fällt vor allem wenn man sehr schräg auf die Fläche blickt sofort auf) funktioniert das natürlich absolut nicht mehr. Deswegen die Sache mit der "smooth height-map". Je größer die Höhenunterschiede benachbarter Pixel desto schlechter funktioniert das ganze. Als Beispiel hier ein Screenshot wie das mit einer entsprechend smoothen Heightmap aussehen würde:


(Link)


Um auch extreme Kanten und Selbstüberdeckungen hinzubekommen braucht es dann die angesprochenen Raytracingtechniken die beim Relief/Parallax Occlusion Mapping eingesetzt werden. Hier werden nicht einfach nur die Texturkoordinaten verzerrt sondern eben die Textur entlang des auf die Fläche projizierten Blickvektors mehrmals gesampled um den Punkt der am nähesten zur Kamera liegt zu finden. Es wird also nicht das komplette Bild mit Raytracingverfahren gerendert, Raytracing findet dabei in vereinfachter Form nur auf dem Polygon statt um die korrekten Texturkoordinaten zu finden.

6

27.01.2010, 12:56

Hallo,

ich will hier nochmal drauf zurück kommen :)
Mir ist immer noch nicht wirlich klar, welchen Sinn es hat, Shadow-Maps damit zu approximieren. Sagen wir mal, ich hab Objekte im Raum, an denen ich physikalisch rumspiele, die Geometrie ändert sich also dauernd. Zusätzlich approximiere ich allumgebendes Umgebungslicht mit ganz vielen Richtungslichtquellen, die kugelförmig außenrum angeordnet sind. So, dann berechne ich die Shadow-Maps, die mir ja nirgendwo angezeigt werden, sondern nur intern irgendwelche Werte für den späteren Schattenwurf speichern. Welchen Sinn hat es also, auf diesen Maps mit Parallax-Mapping rumzuspielen?
Das Verfahren soll angeblich sogar unabhängig von der Szenengeometrie sein, aber die Shadow-Map und damit auch deren Approximation muss ja wohl bei jeder Szenenänderung neu berechnet werden oder sehe ich das falsch?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.01.2010, 13:04

Ich glaub du bringst da was durcheinander. Shadow Mapping und Parallax Mapping haben nix miteinander zu tun ;)

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

8

27.01.2010, 13:13

Ich bin da zwar nicht so im Detail involviert, was Parallax-Mapping anbelangt, aber da Shadow Mapping auf der Distanz basiert stimmt das nur so halb oder? :-)

LG
Alyx

9

27.01.2010, 15:58

Zitat von »"dot"«

Ich glaub du bringst da was durcheinander. Shadow Mapping und Parallax Mapping haben nix miteinander zu tun ;)


Das ist wahr. Bei uns im Fachbereich gibts aber eine Bachelorarbeit, die sich genau mit diesem Thema befasst, Shadow-Maps mit (occlusion) Parallax-Mapping zu approximieren, und ich hab mich halt gefragt, wie das gehen soll bzw. was es bringt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

27.01.2010, 16:19

Na die würd mich mal interessieren^^, für mich ergibt das jedenfalls atm keinen Sinn...

Werbeanzeige