c - OpenGL顶点数组初始化

标签 c opengl opengl-3 vertex-buffer

我有一个关于 OpenGL 3.0 的问题,为什么当我的顶点数组初始化为时我无法绘制任何内容

float * vertices;
int size = 100; // size of the vertices array
float * vertices = (float *) malloc (size*sizeof(float));

我已经分配了内存,并将数组中的所有值初始化为 0.0,但看起来我的顶点缓冲区只读取顶点数组的第一个元素。而当我像这样初始化数组时:

float vertices[size];

所有顶点均按预期读取和渲染。

以下是我指定顶点缓冲区并将数据传递到缓冲区的方法:

unsigned int VBO;
glGenBuffers(1, &VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STREAM_DRAW);

GLint posAttrib = glGetAttribLocation(ourShader.ID, "aPos");

// iterpreting data from buffer 
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 3* sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

最佳答案

sizeof没有做你期望它做的事情。 sizeof(x) 返回变量x 的数据类型的大小。

如果int size = 100; float vertices[size];vertices的数据类型为float[100 ]sizeof(vertices) 返回与 sizeof(float)*100 相同的结果。

如果是float * vertices;vertices的数据类型是float*sizeof(vertices) 返回指针数据类型的大小,该指针数据类型指向动态分配的数组,但它返回动态内存的大小,甚至不返回分配的数组的元素数量。指针的大小取决于硬件,与sizeof(void*)相同(通常为4或8)。

sizeof(float) * size 在问题的两种情况下都适用:

glBufferData(GL_ARRAY_BUFFER, sizeof(float)*size, vertices, GL_STREAM_DRAW);

关于c - OpenGL顶点数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820854/

相关文章:

c - c语言读取文件出错

c++ - OpenGL 3.3 中的多纹理和多光源

opengl - 读取 unsigned int 时 glReadPixels 的精度

c - 如何调用编译时声明未知的函数

c - 为什么 Visual Studio 2012 在未更改源文件时运行自定义构建步骤?

c - 问题中函数无法返回 returnSize 数组中的元素

opengl - 在 OpenGL 中找不到属性变量,可能的优化

opengl - GLSL Gif 抖动效果 : Optimization

c++ - 如果我将 glUniform1f 调用放在渲染循环之前,则不会存储统一值

c++ - 处理可能依赖的顶点的创建/销毁时的 VBO/VAO 内存管理实践