簡體   English   中英

為什么我的Vertex Buffer Object出現訪問沖突錯誤?

[英]Why I'm getting access violation errors with my Vertex Buffer Object?

這是我的typdefs /全局變量:

static GLuint GL15_vbo[2];

typedef struct {
    fvec3 pos;
    fvec3 col;
    fvec2 uv;
} MyVertex;

typedef struct {
    GLuint a;
    GLuint b;
    GLuint c;
} TriFace;

這是我的初始化代碼:

glGenBuffers(2, (GLuint *)&GL15_vbo);

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, GL15_vbo[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(faces), faces, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

這是我的渲染代碼:

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, pos)));
glColorPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, col)));
glTexCoordPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, uv)));

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, GL15_vbo[1]);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

for (int iface = 0; iface < 12; iface++) {
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, (const void *)(iface * sizeof(TriFace)));
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

您能告訴我,我的代碼有什么問題嗎? 我在glDrawElements遇到訪問沖突。 它與簡單的“頂點數組”一起很好地工作(因此,數據數組初始化良好)。 謝謝。

glVertexPointerglColorPointerglTexCoordPointer的最后一個參數必須是分別指向第一個頂點坐標和第一個屬性的指針。

如果綁定了一個非零的命名緩沖區對象,則該參數將被視為數組緩沖區對象的數據存儲區中的字節偏移量。

您要使用命名數組緩沖區,並且參數是屬性的適當偏移量。 但是此時緩沖區對象尚未綁定,因為您執行了glBindBuffer(GL_ARRAY_BUFFER, 0); 創建並初始化緩沖區對象的數據存儲后。 僅在指定屬性后,才再次綁定緩沖區:

 glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, pos))); glColorPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, col))); glTexCoordPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, uv))); glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]); 

它一定要是:

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, pos)));
glColorPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, col)));
glTexCoordPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, uv)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM