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
39
40
|
// Erstellen des Shaders:
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_INDEX beschreibt nur die Verwendung, ist sonst irrelevant
shader[0]->linkProgram();
// wobei bindAttrib:
void Shader::bindAttrib(unsigned int use, unsigned int index, const string &name, unsigned int size){
glBindAttribLocation(m_programID, index, name.c_str());
addVertexAttribArray(use, index, size); // unwichtig
}
// Erstellen des Buffers:
glGenBuffers(1, &m_boneBuffer); // boneBuffer ist GLuint
glBindBuffer(GL_ARRAY_BUFFER, m_boneBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(int)*m_bone_indices.size(), &m_bone_indices[0], GL_STATIC_DRAW); // bone_indices werden vorher mit 0 bzw. 1 gefüllt
// Rendern:
void samFile::render(Shader *shader, mat4 projection, mat4 modelview){
calculateBones();
shader->bindShader();
shader->sendUniform4x4("projection_matrix", projection.getArray());
shader->sendUniform4x4("modelview_matrix", modelview.getArray());
shader->sendUniform4x4("bone_matrix", &m_bone_matrices[0], 2);
shader->enableVertexAttribArrays();
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]);
shader->disableVertexAttribArrays();
}
|