Du bist nicht angemeldet.

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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

11

13.03.2012, 17:35

Ok ich bin mir jetzt ganz sicher das es an dem Bone Index Buffer liegt. Wenn ich den Buffer mit floats übergebe funktioniert es (wenn ich im Shader dann prüfe ob bone_Index == 0 oder 1 und passend dazu die Matrix aus dem bone_matrix Array nehme).
Jetzt weiß ich nur nicht ob ich beim erstellen des Buffers etwas falsch mache oder beim senden :/

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
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();
}


Ich hoffe mir kann mal jemand helfen...

[EDIT]

http://stackoverflow.com/questions/65780…ing-in-glsl-1-5 heißt das man kann gar keine ints senden oder was? Ich find den Fehler nicht.

Kann es sein das es generell ein Problem gibt Integer Werte als ARRAY_BUFFER zu senden? Ich finde dazu gerade die exotischsten Sachen...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (13.03.2012, 18:04)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

12

13.03.2012, 18:12

*hust* so ich muss jetzt einmal ausrasten:

[das konnte ich so nicht stehen lassen]

C-/C++-Quelltext

1
2
glBindBuffer(GL_ARRAY_BUFFER, m_boneBuffer);
    glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, 0);

[ebenfalls nicht sehr freundlich...]

So, jetzt gehts mir etwas besser. Jemand eine Idee woher dieser "Bug" kommt? Im Shader steht in int bone_Index. Und es funktioniert wenn ich den Buffer als float sende!? Muss ich das verstehen? Gut, beide sind Typen sind 4 byte groß, aber sollte dann nicht beides gehen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (14.03.2012, 14:49)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

13.03.2012, 23:57

Verwendest du OpenGL 2.0? Weil OpenGL 2.0 unterstützt nur float Attribute...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

14

14.03.2012, 14:47

Nein OpenGL 3.x
Der Shader ist ja auch 150...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

14.03.2012, 15:16

Ach, ich vergess es auch immer wieder: Wenn du Integerattribute willst, dann musst du glVertexAttribIPointer() verwenden ;)

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

16

14.03.2012, 16:39

glVertexAttribIPointer hab ich schon gefunden, aber ging irgendwie nicht... vielleicht hab ichs falsch geschrieben ^^ aber

glVertexAttrib -> I <- Pointer

das ist doch ein I oder? :D
Ich teste das gerade mal.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

17

14.03.2012, 16:43

C-/C++-Quelltext

1
2
glBindBuffer(GL_ARRAY_BUFFER, m_boneBuffer);
glVertexAttribIPointer(1, 1, GL_INT, 0, 0);

Ja funktioniert. Witzig. Naja so kann man eine Funktion übersehen. Ist aber blöd gelöst das es dafür 2 Funktionen gibt...

Werbeanzeige