2016-03-21 9 views
2

ich die folgenden einheitlichen Puffer haben:einheitliche Puffer von uvec3 []

uniform EDGE_ID_TO_START_POS{ 
    uint[12*3] pos; 
} edgeIdToStartPos; 

zu diesem Puffer Schreiben funktionieren völlig in Ordnung:

#define EDGE_ID_TO_START_POS_SIZE (12*3) 
    const uint32_t edgeIdToStartPos_constBuffer[EDGE_ID_TO_START_POS_SIZE] = { 
     /* 0*/ 0, 0, 0, /* 1*/ 0, 1, 0, /* 2*/ 1, 0, 0, /* 3*/ 0, 0, 0, 
     /* 4*/ 0, 0, 1, /* 5*/ 0, 1, 1, /* 6*/ 1, 0, 1, /* 7*/ 0, 0, 1, 
     /* 8*/ 0, 0, 0, /* 9*/ 0, 1, 0, /*10*/ 1, 1, 0, /*11*/ 1, 0, 0 
    }; 
    glBindBuffer(GL_UNIFORM_BUFFER, ubo); 
    glBufferData(GL_UNIFORM_BUFFER, EDGE_ID_TO_START_POS_SIZE * sizeof(uint32_t), edgeIdToStartPos_constBuffer, GL_STATIC_DRAW); 
    glBindBuffer(GL_UNIFORM_BUFFER, 0); 

Jetzt mag ich die einheitlichen Puffer auf den folgenden Änderungen Struktur:

uniform EDGE_ID_TO_START_POS{ 
    uvec3[12] pos; 
} edgeIdToStartPos; 

Diese Struktur ist sinnvoller und einfacher zu verwenden. Und es sollte das gleiche Speicherlayout als die vorherige Version (?) Haben. Beim Lesen von dieser Struktur enthalten jedoch nur die Vektoren 0..3 Daten. Alle uvec s mit einem Index von 4 oder höher enthalten Nullen.

Warum passiert das und wie kann ich einen solchen einheitlichen Puffer richtig initialisieren? (C/C++, glew, glfw)

Antwort

4

Eine uvec3 hat eine Ausrichtung von 16 Bytes, so dass Sie Padding hinzufügen müssen. Siehe OpenGL 4.5 spec, Abschnitt 7.6.22:

Wenn das Mitglied ein Dreikomponentenvektor mit Komponenten raubend N Maschinengrundeinheiten ist die Basisausrichtung 4 N.

Hier ist, wie es aussehen würde:

static const int EDGE_ID_TO_START_POS_SIZE = 12 * 4; 
const uint32_t edgeIdToStartPos_constBuffer[EDGE_ID_TO_START_POS_SIZE] = { 
    /* 0*/ 0, 0, 0, 0, /* 1*/ 0, 1, 0, 0, /* 2*/ 1, 0, 0, 0, /* 3*/ 0, 0, 0, 0, 
    /* 4*/ 0, 0, 1, 0, /* 5*/ 0, 1, 1, 0, /* 6*/ 1, 0, 1, 0, /* 7*/ 0, 0, 1, 0, 
    /* 8*/ 0, 0, 0, 0, /* 9*/ 0, 1, 0, 0, /*10*/ 1, 1, 0, 0, /*11*/ 1, 0, 0, 0, 
}; 
+0

Dies ist ein Grund, warum Sie nie vec3 die jeglicher Art in Uniform/Speicherblöcke verwendet wird, sollte. –

+0

Wäre es gültig sein, es auf diese Weise zu schreiben (scheint zu funktionieren): '#define EDGE_ID_TO_DIRECTION_SIZE (12 * 3) \t const GLuvec3 edgeIdToDirection_constBuffer [12] = { \t \t/* 0 */GLuvec3 {0, 1, 0 },/* 1 */GLuvec3 {1, 0, 0}, ... \t}; 'Mit der Struktur' GLuvec3 {GLuint x, y, z;}; ' – maja

+0

@ NicolBolas: Ich bin nicht davon überzeugt,' vec3' ist falsch, solange Sie sich des Auffüllens bewusst sind ... wenn Sie 'vec4' verwenden, fragen Sie sich vielleicht, wofür die vierte Komponente verwendet werden soll, und dann müssen Sie sich daran erinnern, dass es wirklich nur' vec3 ist '. –

Verwandte Themen