Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Community-Fossil
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »DeKugelschieber« (11.03.2012, 17:27)
Community-Fossil
Administrator
Community-Fossil
Zitat
Es ist doch kein Problem, Matrizen für viele, viele Bones gleichzeitig an den Shader zu übergeben.
Administrator
Community-Fossil
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
shader->bindShader(); shader->sendUniform4x4("projection_matrix", projection.getArray()); shader->sendUniform4x4("modelview_matrix", modelview.getArray()); shader->sendUniform4x4("bone_matrix", &m_bone_matrices[0]); // <- m_bone_matrices hat 32 Elemente (float) void GLSLProgram::sendUniform4x4(const string &name, const float *matrix, bool transpose){ // Elternklasse von Shader GLuint location = getUniformLocation(name); glUniformMatrix4fv(location, sizeof(matrix), transpose, matrix); } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 |
// [...] uniform mat4 bone_matrix[2]; // <- hier sollen die floats rein... in vec3 a_Vertex; in int bone_Index; //in float bone_Weight; <- kommt noch void main(void){ gl_Position = projection_matrix*modelview_matrix*bone_matrix[bone_Index]*vec4(a_Vertex, 1.0); // (erstmal nur ein Bone pro Vertex) } |
Community-Fossil
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// irgendwo beim laden shader.push_back(new Shader("res/shader/sam.shv", "res/shader/sam.shf")); shader[0]->bindAttrib(SHADER_VERTEX, 0, "a_Vertex", 3); shader[0]->bindAttrib(SHADER_INDEX, 1, "bone_Index", 1); shader[0]->linkProgram(); // Bone Indices erstellen (eine hälfte "0" eine "1") for(unsigned int i = 0; i < 17; i++){ m_bone_indices[i] = 0; } for(unsigned int i = 17; i < 34; i++){ m_bone_indices[i] = 1; } // Buffer mit den Indices als ints glGenBuffers(1, &m_boneBuffer); glBindBuffer(GL_ARRAY_BUFFER, m_boneBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(int)*m_bone_indices.size(), &m_bone_indices[0], GL_STATIC_DRAW); // in der Renderfunktion (Bone Matrizen werden vorher berechnet, sind richtig und getestet) shader->bindShader(); shader->sendUniform4x4("projection_matrix", projection.getArray()); shader->sendUniform4x4("modelview_matrix", modelview.getArray()); shader->sendUniform4x4("bone_matrix", &m_bone_matrices[0], 2); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, m_boneBuffer); glVertexAttribPointer(1, 1, GL_INT, GL_FALSE, 0, 0); glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, &m_indices[0]); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#version 150 uniform mat4 modelview_matrix; uniform mat4 projection_matrix; uniform mat4 bone_matrix[2]; in vec3 a_Vertex; in int bone_Index; //in float bone_Weight; void main(void){ gl_Position = projection_matrix*modelview_matrix*bone_matrix[1]*vec4(a_Vertex, 1.0); } |
Community-Fossil
C-/C++-Quelltext |
|
1 |
gl_Position = projection_matrix*modelview_matrix*bone_matrix[bone_Index]*vec4(a_Vertex, 1.0); |
Werbeanzeige