D3D9 Terrain Normalenberechnung bei Gouraud shading



  • Ich habe die Daten für mein Terrain in einem größen Vertexbuffer. Dazu habe ich einen Indexbuffer erstellt. Mit DrawIndexedPrimitive(D3DPT_TRIANGLELIST,...) render ich alles.

    Ich würde gerne einen-LOD-support einbauen über Quadtrees. Das Terrain soll dabei in Chucks unterteils werden.

    Bisher habe ich die Normalen für das Gouraud shading manuell berechnet.

    Gibt es in D3D eine Möglichkeit für Trianglelists die Normalen automatisch zu berechnen? Für ein Meshes gibts D3DXComputeNormals().

    Außerdem könnte es zu Beleuchtungsfehlern zwischen den Chunks kommen. An diesen Stellen wird dann sicherlich nur die Normale aus den umliegenden Flächen des eigenen(!) Chucks berechnet ... kompliziert...

    andere allgemeine Frage: Wäre es besser zur Erstellung von Terrains mit Meshes zu arbeiten anstatt Trianglelists?


  • Mod

    meshes sind doch nur eine kapselung von trianglelists, oder?

    vielleicht waere eine normalmap die du mit irgend einem tool anhand deiner heightmap generierst gut fuer dich. dann waeren die normalen unabhaengig von LOD und du wuerdest dir die ganzen berechnungen und probleme ersparen.



  • Die Berechnung der Normalen für ein Terrain ist genuso wie bei jedem anderem 3D Model auch. Berechne erst von jeder Triangle die Normale. Dafür würde ich mir gleich ne Funktion schreiben, denn damitwird man oft genug konfrontiert:

    Vector3 Vector3Cross(Vector3 a, Vector3 b)
    {
    	return Vector3(a.Y * b.Z - a.Z * b.Y, a.Z * b.X - a.X * b.Z, a.X * b.Y - a.Y * b.X);
    }
    
    Vector3 Vector3ComputeNormal(Vector3 v0, Vector3 v1, Vector3 v2)
    {
    	return Vector3Cross(v0 - v2, v0 - v1);
    };
    

    Anschließend gehst du alle Vertices durch, und schaust in welcher Triangle dieser Vertex liegt, und Addierst dann von allen Trianglen in denen der Vertex liegt die Normalen zusammen und Normalisiert das Ergebnis anschließend.


Anmelden zum Antworten