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

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

11

01.08.2012, 11:05

ich glaube kaum, dass man direkt ein "in array" befüllen kann. arrays sind in shadern nur eine zusätzliche datenstruktur, aber mir ist keine möglichkeit bekannt, sie als vertexattribut zu übergeben.

warum übergibst du nicht einfach einen ivec3 (int vector)? das ist im grunde genau das, was du haben willst. Wenn du dann unbedingt ein array brauchst, kannst du daraus ja dann eins machen.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

12

01.08.2012, 11:52

Zitat

Sicher dass das funktioniert? Imo sollte der stride bei allen drei gleich sein und der pointer unterschiedlich...


Ok, du hast Recht. Allerdings nimmt der letzte Parameter kein offset (uint).

Zitat


void glVertexAttribIPointer( GLuint index,
GLint size,
GLenum type,
GLsizei stride,
const GLvoid * pointer);


Und so scheint es auch nicht zu funktionieren:

C-/C++-Quelltext

1
2
3
4
glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glVertexAttribIPointer(m_shader->getAttribLocation("data0"), 1, GL_INT, sizeof(int)*2, 0);
    glVertexAttribIPointer(m_shader->getAttribLocation("data1"), 1, GL_INT, sizeof(int)*2, &data[1]);
    glVertexAttribIPointer(m_shader->getAttribLocation("data2"), 1, GL_INT, sizeof(int)*2, &data[2]);


Zitat

warum übergibst du nicht einfach einen ivec3 (int vector)? das ist im grunde genau das, was du haben willst. Wenn du dann unbedingt ein array brauchst, kannst du daraus ja dann eins machen.


Gut das ginge für dieses spezielle Problem, aber was mach ich wenn ich mal 5 oder 6 ints in einem Buffer so senden möchte?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

01.08.2012, 11:57

Zitat

Sicher dass das funktioniert? Imo sollte der stride bei allen drei gleich sein und der pointer unterschiedlich...


Ok, du hast Recht. Allerdings nimmt der letzte Parameter kein offset (uint).

Doch, casten...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

14

01.08.2012, 12:19

Was will glVertexAttribIPointer denn haben, das offset als int, heißt wenn ich z.B. mit 1, 2, 3, 1, 2, 3, ... teste:

C-/C++-Quelltext

1
2
3
4
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glVertexAttribIPointer(m_shader->getAttribLocation("data0"), 1, GL_INT, sizeof(int)*2, 0); // a
glVertexAttribIPointer(m_shader->getAttribLocation("data1"), 1, GL_INT, sizeof(int)*2, reinterpret_cast<GLvoid*>(1)); // b
glVertexAttribIPointer(m_shader->getAttribLocation("data2"), 1, GL_INT, sizeof(int)*2, reinterpret_cast<GLvoid*>(2)); // c


So das bei a [1], 2, 3, [1], 2, 3, ... ausgewählt werden müsste (8 byte Abstand, angefangen beim ersten Element).
Bei b 1, [2], 3, 1, [2], 3, ... (8 byte Abstand, zweites Element als Anfang).
Und c genauso...

Wenn ich das im Shader teste (der Buffer ist komplett mit 1, 2, 3, ... gefüllt):

Quellcode

1
2
3
if(data0 == 1 && data1 == 2 && data2 == 3){
    gl_Position = pm*pos;
}


Wird nichts gerendert. Das heißt die Daten kommen so nicht richtig an. Wenn ich aber:

C-/C++-Quelltext

1
2
3
4
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glVertexAttribIPointer(m_shader->getAttribLocation("data0"), 1, GL_INT, sizeof(int)*2, 0); // a
glVertexAttribIPointer(m_shader->getAttribLocation("data1"), 1, GL_INT, sizeof(int)*2, reinterpret_cast<GLvoid*>(4)); // b
glVertexAttribIPointer(m_shader->getAttribLocation("data2"), 1, GL_INT, sizeof(int)*2, reinterpret_cast<GLvoid*>(8)); // c


Und also davon ausgehe das der letzte Parameter in byte sein soll, wird immerhin ein Teil des Mesh gerendert... ich versteh diese Funktion nicht ^^

[Edit]

Übrigens bekomme ich da durch glGetError() eine 1281, also invalid value.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (01.08.2012, 12:27)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

01.08.2012, 12:30

Zitat von »OpenGL Specification«

When an array is sourced from a buffer object, the pointer value of that array is used to compute an offset, in basic machine units [Bytes], into the data store of the buffer object.


Wo genau kommt das invalid value her?
Sollte der stride nicht 3 * sizeof(int) sein?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

16

01.08.2012, 12:42

Aha Tatsache, es funktioniert. Der Fehler kam woanders her, hatte aber nichts damit zu tun das es nicht ging ^^

So geht es jetzt:

C-/C++-Quelltext

1
2
3
4
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glVertexAttribIPointer(m_shader->getAttribLocation("data0"), 1, GL_INT, sizeof(int)*3, 0);
glVertexAttribIPointer(m_shader->getAttribLocation("data1"), 1, GL_INT, sizeof(int)*3, reinterpret_cast<GLvoid*>(4));
glVertexAttribIPointer(m_shader->getAttribLocation("data2"), 1, GL_INT, sizeof(int)*3, reinterpret_cast<GLvoid*>(8));


Schwere Geburt... für diesen Fall werde ich wohl einen ivec3 verwenden, dann brauch ich nicht 3x glVertexAttribIPointer() aufrufen. Aber jetzt weiß ich wie das geht. Der Error ist auch weg, vielen Dank :)

Werbeanzeige