添加 IBO 时基本的 opengl 黑屏
basic opengl black screen when adding IBO
当我只有一个 VBO 和一个 VAO 时一切正常,但在添加 IBO 时我遇到黑屏。这是代码:
初始化:
GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
GLuint ibo;
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float), NULL);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBindVertexArray(0);
内部循环:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shader_programme);
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, 14, GL_UNSIGNED_INT, NULL);
glBindVertexArray(0);
顶点和索引:
float points[] = {
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
-1.0, 1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, -1.0, -1.0,
1.0, -1.0, -1.0,
-1.0, 1.0, -1.0,
1.0, 1.0, -1.0,
};
float indices[] = {
0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};
glVertexAttribPointer
的第5个参数是连续通用顶点属性之间的字节偏移量。如果它为 0,则顶点属性被理解为紧密打包。
您的顶点由 float
类型的三个分量组成,因此 步幅 为 3*sizeof(float)
:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), NULL);
由于顶点紧密排列,你也可以将0传递给参数:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
索引的类型是GL_UNSIGNED_INT
。索引数组的类型必须是整数数据类型,对应于 GL_UNSIGNED_INT
。在你的情况下,它必须是 unsigned int
.
unsigned int indices[] = { .... };
此外,原始类型 GL_TRIANGLES
包含一个索引列表,其中每个 3 形成一个三角形。 ma 三角形的索引 0、1、2,索引 4、5、6 形成下一个三角形,依此类推。所以索引的数量必须能被 3 整除。
如果要绘制立方体,则索引列表可能如下所示:
unsigned int indices[] = {
0,1,2, 0,2,3,
1,5,6, 1,6,2,
5,4,7, 5,7,6,
4,0,3, 4,3,7,
3,2,6, 3,6,7,
1,0,4, 1,4,5
};
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, NULL);
当我只有一个 VBO 和一个 VAO 时一切正常,但在添加 IBO 时我遇到黑屏。这是代码:
初始化:
GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
GLuint ibo;
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float), NULL);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBindVertexArray(0);
内部循环:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shader_programme);
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, 14, GL_UNSIGNED_INT, NULL);
glBindVertexArray(0);
顶点和索引:
float points[] = {
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
-1.0, 1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, -1.0, -1.0,
1.0, -1.0, -1.0,
-1.0, 1.0, -1.0,
1.0, 1.0, -1.0,
};
float indices[] = {
0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};
glVertexAttribPointer
的第5个参数是连续通用顶点属性之间的字节偏移量。如果它为 0,则顶点属性被理解为紧密打包。
您的顶点由 float
类型的三个分量组成,因此 步幅 为 3*sizeof(float)
:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), NULL);
由于顶点紧密排列,你也可以将0传递给参数:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
索引的类型是GL_UNSIGNED_INT
。索引数组的类型必须是整数数据类型,对应于 GL_UNSIGNED_INT
。在你的情况下,它必须是 unsigned int
.
unsigned int indices[] = { .... };
此外,原始类型 GL_TRIANGLES
包含一个索引列表,其中每个 3 形成一个三角形。 ma 三角形的索引 0、1、2,索引 4、5、6 形成下一个三角形,依此类推。所以索引的数量必须能被 3 整除。
如果要绘制立方体,则索引列表可能如下所示:
unsigned int indices[] = {
0,1,2, 0,2,3,
1,5,6, 1,6,2,
5,4,7, 5,7,6,
4,0,3, 4,3,7,
3,2,6, 3,6,7,
1,0,4, 1,4,5
};
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, NULL);