1. Η κορυφή

This page is the Greek translation of 1. The vertex

To Vertex (κορυφή) (πληθ. Vertices) ορίζει ένα σύνολο Ιδιοτήτων που σχετίζονται με ένα μοναδικό σημείο στο χώρο. Σε ένα στατικό περιβάλλον η κορυφή συνήθως περιλαμβάνει συντεταγμένες Θέσης, Κάθετου Διανύσματος, Χρώματος και/ή Υφής. Η μόνη ιδιότητα που πρέπει υποχρεωτικά να προσδιοριστεί είναι η θέση της κορυφής, η οποία συνήθως αποτελείται από τρεις συντεταγμένες τύπου float. Στην αναπαράσταση με βάση τη σκίαση είναι επίσης δυνατό να ορίσουμε κάποιες ιδιότητες για κορυφές οι οποίες ήταν άγνωστες στην OpenGL, όπως Ακτινοβολία ή Δείκτης οστών και βάρος για κίνηση με σκελετό. Για απλότητα θα ξαναφτιάξουμε ένα από τα formats των κορυφών που η OpenGL γνωρίζει ήδη, το λεγόμενο InterleavedArrayFormat.T2fN3fV3f. Το format αυτό περιέχει 2 αριθμούς τύπου float για συνιστώσες υφής, 3 floats για το κάθετο διάνυσμα και άλλους 3 για το προσδιορισμό της θέσης.
Χάρη στη βιβλιοθήκη μαθηματικών (Math-Library) που περιέχεται στην OpenTK, μπορούμε να προσδιορίσουμε μία βοηθητική Vertex δομή η οποία είναι πολύ πιο απλή και εύχρηστη από ένα πίνακα τύπου float[]. Αποτελείται συνολικά από 8 float, ή 32 byte:

[StructLayout(LayoutKind.Sequential)]
struct Vertex
{ // mimic InterleavedArrayFormat.T2fN3fV3f
  public Vector2 TexCoord;
  public Vector3 Normal;
  public Vector3 Position;
}

Μπορούμε τώρα να ορίσουμε ένα πίνακα από κορυφές για να προσδιορίσουμε πολλαπλά σημεία και να έχουμε εύκολη πρόσβαση/αναφορά σε αυτά:

Vertex[] Vertices;

Ο πίνακας κορυφών Vertices μπορεί τώρα να συμπληρωθεί με δεδομένα. Η προσπέλαση των δεδομένων αυτών είναι τόσο απλή όσο και στο επόμενο παράδειγμα:

Vertices = new Vertex[ n ]; // -1 < i < n  (Remember that arrays start at Index 0 and end at Index n-1.)
 
// examples how to assign values to the Vector's components:
Vertices[ i ].Position = new Vector3( 2f, -3f, .4f ); // create a new Vector and copy it to Position.
Vertices[ i ].Normal = Vector3.UnitX; // this will copy Vector3.UnitX into the Normal Vector.
Vertices[ i ].TexCoord.X = 0.5f; // the Vectors are structs, so the new keyword is not required.
Vertices[ i ].TexCoord.Y = 1f;
 
// Ofcourse this also works the other way around, using the Vectors as the source.
Vector2 UV = Vertices[ i ].TexCoord;

Ένας Index είναι απλά ένα byte, ushort ή uint, σαν δείκτης στον πίνακα Vertices. Άρα, αν αποφασίσουμε να σχεδιάσουμε την ίδια κορυφή 100 φορές αντί να το αποθηκεύουμε 100 φορές στον πίνακα Vertices είναι προτιμότερο να το προσπελαύνουμε 100 φορές από τον πίνακα Indices:

uint[] Indices;

Βασικά ο πίνακας Indices χρησιμοποιείται για να δηλώνουμε τα κύρια σημεία και ο πίνακας Vertex για να δηλώνουμε τα γωνιακά.

Επίσης μπορούμε να χρησιμοποιήσουμε συλλογές (collections) για να αποθηκεύουμε τα Vertices, αλλά είναι καλύτερα να κρατήσετε ένα απλό πίνακα για να είστε σίγουροι ότι τα Indices είναι έγκυρα ανά πάσα στιγμή.

Οι πίνακες Vertices και Indices μπορούν τώρα να χρησιμοποιηθούν για να περιγράψουν τις κορυφές ενός οποιουδήποτε Γεωμετρικού Πρωτεύοντος Τύπου.

Μόλις οι πίνακες γεμίσουν με δεδομένα μπορούν να σχεδιαστούν σαν ένας Immediate ModeVertex πίνακας ή να σταλούν σε ένα Vertex Buffer Object.