c++ - glDrawElements 不绘制

标签 c++ opengl drawing render

我使用以下代码创建缓冲区:

//generate buffers
glGenVertexArrays(1, &VAO);
//glGenBuffers(1, &EBO);
glGenBuffers(1, &VBO_vertices);
glGenBuffers(1, &VBO_colors);
glGenBuffers(1, &VBO_normals);

// Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s).
glBindVertexArray(VAO);

// Copy our vertices array in a buffer for OpenGL to use
glBindBuffer(GL_ARRAY_BUFFER, VBO_vertices);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*vertices.size(), &vertices[0], GL_STATIC_DRAW);


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vTable.size() * sizeof(int), &vTable[0], GL_STATIC_DRAW);

// Position attribute
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); //size = 3 (X,Y,Z)
glEnableVertexAttribArray(0);


//Buffer for color
glBindBuffer(GL_ARRAY_BUFFER, VBO_colors);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*vertices.size(), &v_color[0], GL_STATIC_DRAW);

// Color attribute
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); //size = 3 (R,G,B)
glEnableVertexAttribArray(1);


//Buffer for normals
glBindBuffer(GL_ARRAY_BUFFER, VBO_normals);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*vertices.size(), &v_normals[0], GL_STATIC_DRAW);

//normal attribute
glVertexAttribPointer((GLuint)2, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); //size = 3 (R,G,B)
glEnableVertexAttribArray(2);


// Unbind the VAO
glBindVertexArray(0);

我的数据是:

vector<vec3> vertices, v_normals,v_color;
vector<int> vTable;

我有顶点、每个顶点的法线和颜色以及一个索引表,其中包含每个三角形的索引顶点。

当我尝试渲染它时,窗口上什么也没有出现。

glBindVertexArray(VAO); //Bind VAO
glDrawElements(GL_TRIANGLES, vTable.size(), GL_UNSIGNED_INT, &vTable[0]);
glBindVertexArray(0); //Unbind VAO

如果我用这个:

glDrawArrays(GL_TRIANGLES,0,vTable.size());

它绘制的是不完整的对象,如链接图像中所示。

image

有人知道会发生什么吗?提前致谢

最佳答案

您的 glDrawElements 调用是错误的,最后一个参数应该是保存索引的 GL_ELEMENT_ARRAY_BUFFER 中的字节偏移量,而不是指向系统的指针内存。

glDrawElements(GL_TRIANGLES, vTable.size(), GL_UNSIGNED_INT, 0);

关于c++ - glDrawElements 不绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41360736/

相关文章:

python 从 RGB 元组创建图像

c++ - 在 C++ 中格式化电话号码

c++ - OpenCV,网络摄像头显示的动态修改

c++ - 使用模板学习 C++

c++ - 我可以使用我称之为 "Raw OpenGL"的东西吗?

objective-c - 设置复合绘图模式导致 NSWindow 上出现黑洞/补丁

c++ - 为什么 std::optional::value() &&;返回 &&?

c++ - 使用 SDL2 和 OpenGL 使用 SDL TTF 显示文本

wpf - DirectX 和 WPF

c# - 通过Timer组件以动画方式绘制sin(x)/x到PictureBox