Djago hat geschrieben: ↑20. Februar 2019 08:52
die erste funktion glVertexAttribPointer() zeigt wie es richtig ist.
die zweite habe ich blanko angelegt damit mir visual studio zeig was die funktion erwartet.
GLuint index = ein unsignt int index
GLint size = int größe
GLenum type = enum type
ab hier wirds schon nerfig:
GLboolean normalized = bool // was zum teufel bedeutet normalized?
GLsizei stride = sizeof // was meinen die mit stride?
Als nicht OpenGL und/oder Shader Experte hätte ich schon bei den ersten drei Parametern drei Fragezeichen?
Für was braucht die Funktion Index, Size oder Type und wie sietht da der Wertebereich aus???
Nach einer kurzen Websuche erhalte ich:
index
Specifies the index of the generic vertex attribute to be modified.
size
Specifies the number of components per generic vertex attribute. Must be 1, 2, 3, 4. Additionally, the symbolic constant GL_BGRA is accepted by glVertexAttribPointer. The initial value is 4.
type
Specifies the data type of each component in the array. The symbolic constants GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, and GL_UNSIGNED_INT are accepted by glVertexAttribPointer and glVertexAttribIPointer. Additionally GL_HALF_FLOAT, GL_FLOAT, GL_DOUBLE, GL_FIXED, GL_INT_2_10_10_10_REV, GL_UNSIGNED_INT_2_10_10_10_REV and GL_UNSIGNED_INT_10F_11F_11F_REV are accepted by glVertexAttribPointer. GL_DOUBLE is also accepted by glVertexAttribLPointer and is the only token accepted by the type parameter for that function. The initial value is GL_FLOAT.
Zumindest weiß man jetzt was der Wertebereich von size und type ist... was nun für index eingesetzt werden soll weiß ich immer noch nicht; mir fehlt der Context.
Nach einer Websuche für "glVertexAttribPointer example" findet man auch ein relativ einfaches
Beispiel:
Code: Alles auswählen
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glEnableVertexAttribArray(0); // We like submitting vertices on stream 0 for no special reason
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(0)); // The starting point of the VBO, for the vertices
glEnableVertexAttribArray(1); // We like submitting normals on stream 1 for no special reason
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(12)); // The starting point of normals, 12 bytes away
glEnableVertexAttribArray(2); // We like submitting texcoords on stream 2 for no special reason
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(24)); // The starting point of texcoords, 24 bytes away
Daraus schliesse ich, dass vor der verwendung der Funktion glVertexAttribPointer ich zumindest ein glEnableVertexAttribArray tätigen muss.
Da stell sich nun nochmal die Frage welchen Wertebereich nun index Anehmen kann; dieser hat offensichtlich in glEnableVertexAttribArray und glVertexAttribPointer den selben Wertebereich.
Eine Websuche nach
glEnableVertexAttribArray ergibt:
GL_INVALID_VALUE wird generiert, wenn index größer oder gleich GL_MAX_VERTEX_ATTRIBS ist.
Auf der selben Seite findet man dann auch raus dass man den Wert durch einen Aufruf von "glGet" und dem Parameter "GL_MAX_VERTEX_ATTRIBS" rankommt.
Außerdem entnehme ich dem Beispiel, dass size entsprechend der obigen Verwendung auf eine 2D oder 3D Koordinate zielt und der dritte Parameter entsprechend den verwendeten Datentyp darstellt, in demm Fall immer float.
Jetzt wäre sicherlich interessant wann man 1 oder 4 verwendet....
Das Spiel kann man nun mit allen Parametern weiter treiben.
Die Frage ist dann inwiefern man an alle Infos die man wissen möchte auch kommt.
Sollte man die gwünschten Infos nicht finden, muss man entsprechende Foren oder Support Dienste aufsuchen.
Bücher sind sicherlich auch Sinnvoll, aber du wirst wohl im vorfeld nicht wissen ob das jeweilige Buch die gwünschten Informationen beinhaltet.