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.
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!
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.