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

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

17.01.2014, 20:41

Vertex Texture Terrain - Berechnte Normalen seltsam

Hallo Zusammen,

ich entwickle, wie im Titel schon erwähnt, ein Terrain auf Basis von Vertex Textures, in dem ich die Höhe zur Laufzeit im Vertex Shader ermittle. Dadurch habe ich natürlich keine Normalen für Lichtberechnung und muss diese somit ermitteln. Leider sehen bei mir die Normalen sehr seltsam aus.


(Link)


Es sieht so aus, als ob jedes Quad eine eigene Normale hätte. Das ist aber doch gar nicht möglich, weil für jedes Dreieck derselbe Vertex und somit dieselbe Normale berechnet werden sollte?! Was ist mein Fehler?

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

17.01.2014, 21:22

Ich konnte das problem lösen, in dem ich die Normale im Pixelshader berechne. Müsste aber im Vertexshader nicht reichen?

3

18.01.2014, 17:58

Wie hast du sie denn vorher an den Pixel Shader übergeben? Bedenk, dass Register wie SV_Color nur Werte im Bereich 0…1 darstellen können und du nur in SV_Texcoord0 u.Ä. beliebige Werte speichern kannst.

SlinDev

Treue Seele

Beiträge: 142

Wohnort: Lübeck

Beruf: Programmierer

  • Private Nachricht senden

4

18.01.2014, 18:36

Du musst die Normalen im Fragmentshader normalisieren wenn du sie im Vertexshader bestimmst, da das durch die lineare Interpolation kaputt geht, ansonsten sollte aber so ziemlich das gleiche herauskommen. Wobei das natürlich auch davon abhängig ist, wie und aus welchen Daten du die generierst: Wenn deine Heightmap eine höhere Auflösung hat als dein Mesh, dann kannst du im Fragmentshader natürlich "schönere" Normalen generieren. Auch könntest du überlegen die Normalen mit in die Heightmap zu packen, was etwas schneller wäre, wobei das natürlich nicht wirklich viel ausmacht.

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

5

21.01.2014, 17:29

Kann man nicht die Noramalvectoren in einer NormalMap lesen.

Ich meine nicht auf Pixelebene (Bumpmapping) sondern auf Vertex ebene.

Ich meine eine Texture die genauso groß wie die HeighMap ist (bsw 512 x 512). in jedem Pixel wird für den jeweiligen Vertex der Normalvector gespeichert. jedoch muss man diese " Vertex-Normal-Map" erst einmal erstellen.
Wie das geht weiß ich nicht. Vielleicht mit Cracy-Bump.

Ich entwickle wie einige wissen aktuell auch TerrainRendering und mache mir auch Gedanken wie ich das mit der Beleuchtung hin kriege.

Kann man das nicht so machen?

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

22.01.2014, 07:53

Wie hast du sie denn vorher an den Pixel Shader übergeben? Bedenk, dass Register wie SV_Color nur Werte im Bereich 0…1 darstellen können und du nur in SV_Texcoord0 u.Ä. beliebige Werte speichern kannst.


Ja, sie werden im VertexShader normalisiert und mit NORMAL-Semantic an den Pixelshader weitergereicht.

Zitat von »"SlinDev"«

Du musst die Normalen im Fragmentshader normalisieren wenn du sie im Vertexshader bestimmst, da das durch die lineare Interpolation kaputt geht, ansonsten sollte aber so ziemlich das gleiche herauskommen. Wobei das natürlich auch davon abhängig ist, wie und aus welchen Daten du die generierst: Wenn deine Heightmap eine höhere Auflösung hat als dein Mesh, dann kannst du im Fragmentshader natürlich "schönere" Normalen generieren. Auch könntest du überlegen die Normalen mit in die Heightmap zu packen, was etwas schneller wäre, wobei das natürlich nicht wirklich viel ausmacht.


Das ist ja die goldene Regel, dass man Normalen im Fragmentshader immer normalisiert, das ist mir bekannt :). Und ja, ich habe es auch umgesetzt. Das ist es ja, was mich so verwundert!

Zitat von »"Sebastian Müller"«

Kann man nicht die Noramalvectoren in einer NormalMap lesen.

Ich meine nicht auf Pixelebene (Bumpmapping) sondern auf Vertex ebene.

Ich meine eine Texture die genauso groß wie die HeighMap ist (bsw 512 x 512). in jedem Pixel wird für den jeweiligen Vertex der Normalvector gespeichert. jedoch muss man diese " Vertex-Normal-Map" erst einmal erstellen.
Wie das geht weiß ich nicht. Vielleicht mit Cracy-Bump.

Ich entwickle wie einige wissen aktuell auch TerrainRendering und mache mir auch Gedanken wie ich das mit der Beleuchtung hin kriege.

Kann man das nicht so machen?


Ja kann man definitiv :). Das Problem mit der Normalmap ist meines erachtens, dass du die Höhenskalierung mit einberechnen musst. Je mehr dein Terrain in Y-Richtung skaliert ist, umso mehr verzerren sich auch deine Normalen aus der Normalmap. Ich weiß auch ehrlich gesagt nicht, was mir das wirklich erspart, wenn die Normalen in der Normalmap in Tangent Space sind. In Object Space definierte Normalmaps sind etwas besser, man hat doch aber trotzdem das Problem mit der Höhenskalierung.

Ich kann dir nur sagen, dass ebend Beleuchtung eines Terrains ziemlich spannend ist. Du hast das Problem mit den Normalen auch nur im Vertex Texture Ansatz. Wenn du statische VertexBuffer mit Höheninformationen generierst, kann du die Normalen sehr genau über die CPU ermitteln und kannst wie üblich Beleuchten. Aber andererseits hast du dann wieder viele Vertexbuffer, ich brauche für das gesamte Terrain nur einen einzigen.

idontknow

unregistriert

7

22.01.2014, 11:32

Du berechnest die Normalen im Pixelshader?? Wie soll den dass funktionieren :o

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

22.01.2014, 12:10

Indem ich meine Heightmap im Pixelshader sample. Komischerweise wird das im Buch von Frank Luna genauso gemacht. Ich dachte ebnd genau, dass es im Vertexshader reicht und dasselbe Ergebnis liefern sollte, tut es aber nicht. Wahrscheinlich wird durch das Filtern der Heightmap das Ergebnis im Pixelshader besonders weich.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

22.01.2014, 15:23

Wie genau bestimmst du die "korrekten" Normalen, mit denen du deine im Shader berechneten vergleichst? Wie genau samplest du die Heightmap im Shader und wie genau berechnest du die Normalen im Pixelshader?

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

10

22.01.2014, 15:30

Ich habe auch die vage Vermutung, dass ich irgendwo zu ungenau sample gekoppelt mit linearer interpolation der Heightmap. Ich lade nachher mal den Shader + Definition des Vertexbuffers hoch. Das könnte doch eine Fehlerquelle sein oder?!

Werbeanzeige