Probleme beim Sortieren von Koordinaten
-
Hallo,
ich will SmoothShading möglichst schnell berechnen. Mit SmoothShading meine ich, dass die Normalen der Vertices nicht für FlatShading sondern eben für SmoothShading sorgen sollen. Also muss ich alle aneinander liegenden "Vertices-Normals" zusammen rechnen, durch die Anzahl teilen und dann erneut den jeweiligen Vertices zuordnen.
Das löse ich zur Zeit damit, dass ich alle Vertices anhand der Koordinaten im 3Dimensionalen Raum sortiere. Jetzt funktioniert das leider noch nicht richtig und ich vermute es liegt daran, dass die Vergleichs-Funktion zum Sortieren nicht richtig beschribene ist. Hier ist meine Vergleichs-Funktion:template <typename T> class vector3d { /* ... */ T X, Y, Z; }; struct SNormalCoord { vector3d<float> Normal; // Vertex normal vector3d<float> Position; // Vertex coordinate unsigned int Index; // Vertex index }; inline bool isEqual(const float A, const float B, const float Precision = 1.0e-6) { return (A + Precision > B && A - Precision < B); } bool cmpVertexCoords(const SNormalCoord &obj1, const SNormalCoord &obj2) { const vector3d<float> Pos1(obj1.Position), Pos2(obj2.Position); return Pos1.X > Pos2.X || ( isEqual(Pos1.X, Pos2.X) && ( Pos1.Y > Pos2.Y || ( isEqual(Pos1.Y, Pos2.Y) && Pos1.Z > Pos2.Z ) ) ); }
Kann mir jemand sagen, ob das so logisch und richtig ist, oder ob das falsch bzw. verbesserungs fähig ist?
PS: Das Sortieren mache ich mit den "std::sort" Funktion aus der STL.
PSS: Nach dem Sortieren sollen natürlich alle vertices mit den gleichen Koordinaten hintereinader in der Liste stehen.
-
Berechne die Normale eines Dreiecks und addiere sie zu den Vertices die das Polygon aufspannen (gegeben durch Indizes).
Am Ende alle Normalen normalisieren (und vorher mit 0,0,0 initialisieren).Dein "cmpVertexCoords" geht nicht auf Pos1<Pos2 ein.
-
etwas einfacher ist es die distanz zwischen deun punkten zu nehmen, also vermutlich
vector3d<float> Delta = Pos1-Pos2; float L = Delta*Delta; //dot product return L<FLT_EPSILON
-
"Vertices-Normals"
Semmelnsknödelnsen.
Ansonsten: ich hoffe du machst das beim Laden (oder sogar schon beim Exportieren/Speichern) des Modells, und nicht während des Renderns
Und wenn ich mich nicht irre, heisst das was du da vor hast "Phong shading". Im Gegensatz zu "Gouraud shading", wo man direkt die Vertex-Farben/Helligkeiten interpoliert.