c - 添加 IBO 时基本的 opengl 黑屏

标签 c opengl glfw opengl-4

当我只有一个 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 类型的三个分量组成,因此stride3*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);

关于c - 添加 IBO 时基本的 opengl 黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53323735/

相关文章:

c - 如何在 ImageMagick Core 中从图像中提取图像信息

c - 了解管道、重定向和 IPC

OpenGL 透视

c++ - 动态链接 GLEW 与 CMake

c++ - glBindAttribLocation 接下来是什么?

c++ - Visual Studio 2015 不会链接 GLFW

C初学者题: Pointer to a pointer/Can't access values from outside a function

c - C中的段错误,无法找出原因

OpenGL:透明纹理问题

c++ - glfwOpenWindowHint 未在此范围内声明 GLFW3 和 GLEW