gpt4 book ai didi

c - OpenGL - 无法将超过一定大小的数据复制到绑定(bind) VBO

转载 作者:行者123 更新时间:2023-11-30 14:57:16 24 4
gpt4 key购买 nike

我仍在尝试掌握 OpenGL 的怪癖,但这无助于尝试在使用 OpenGL 4.2 Core 的 OSX 上学习,这可能是相关的。

我只是想做的就是将从对象文件解析的顶点数据数组复制到绑定(bind)的VBO中,如果我迭代该数据,它会显示良好,但是当我使用glGetBufferSubData 返回当前绑定(bind)的 VBO 的内容,它显示了几十行的数据,然后开始显示只有我才能看到的损坏数据,如下所示...

Vertex: (-0.437500, 0.328125, 0.765625)
Vertex: (0.500000, 0.390625, 0.687500)
Vertex: (-0.500000, 0.390625, 0.687500)
Vertex: (0.546875, 0.437500, 0.578125)
Vertex: (-0.546875, 0.437500, 0.578125)
-------------------vvvvv corrupts here
Vertex: (0.625000, 19188110749038498652920741888.000000, 12125095608195490978463744.000000)
Vertex: (68291490374736750313472.000000, 70795556751816250086766057357312.000000, 0.000000)
Vertex: (4360831549674110915425861632.000000, 4544202249129758853702852018176.000000, 50850084445497733730842814971904.000000)
即使我尝试用全零初始化相同或相似大小的缓冲区,也会发生这种情况,在任意数量之后它会变得很奇怪。这是一个片段来看看我在做什么,但我无法想象发生了什么。

// Parse an OBJ file
compositeWavefrontObj com;
parseObjFileVerticies("suzanne.obj", &com);

// Bind a vertex array object
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

// copy vertex buffer data
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, com.attrib->num_vertices*sizeof(GLfloat), 0, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, com.attrib->num_vertices*sizeof(GLfloat), com.attrib->vertices);

// Read back data from bound buffer object
GLfloat *vertBuffer = malloc(sizeof(GLfloat) * com.attrib->num_vertices);
glGetBufferSubData(GL_ARRAY_BUFFER, 0, com.attrib->num_vertices, vertBuffer);
for (int i = 0; i < com.attrib->num_vertices; ++i) {
printf("Vertex: (%f,", *(vertBuffer+i));
++i;
printf(" %f,", *(vertBuffer+i));
++i;
printf(" %f)\n", *(vertBuffer+i));
}
printf("\n\n\n");

最佳答案

我看到两个问题:

glBufferData(GL_ARRAY_BUFFER, com.attrib->num_vertices*sizeof(GLfloat), 0, GL_STATIC_DRAW); 需要整个数据的大小(以字节为单位)。
因为每个顶点都有 X、Y、Z,所以它应该是

glBufferData(GL_ARRAY_BUFFER, com.attrib->num_vertices*3*sizeof(GLfloat), 0, GL_STATIC_DRAW);

注意“3”。

分配空间并读取缓冲区时相同。

GLfloat *vertBuffer = malloc(sizeof(GLfloat) * com.attrib->num_vertices * 3);
glGetBufferSubData(GL_ARRAY_BUFFER, 0, com.attrib->num_vertices * 3 * sizeof(GLfloat), vertBuffer);

关于c - OpenGL - 无法将超过一定大小的数据复制到绑定(bind) VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44011823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com