我最近在处理 Opengl VAO 时遇到了问题。 目前我有使用 VBO 从 float 组绘制三角形的代码。
这是代码。
float vpp[] = { 0.75f, 0.75f, 0.0f,
0.75f, -0.75f, 0.0f,
-0.75f, -0.75f, 0.0f};
// Non Indexed
glGenBuffers(1, &m_mainVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_mainVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vpp), vpp, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_POINTS, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
现在当我尝试实现一个 VAO 时,程序只抽出 1 分。 (我会张贴屏幕截图,但我不能)。
还有这个的代码。
float vp[] = { 0.0f, 0.75f, -0.75f };
//VAO
unsigned short sInds[9] = { 1, 1, 0,
1, 2, 0,
2, 2, 0};
//Indexed
glGenBuffers(1, &m_mainVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_mainVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vp), vp, GL_STATIC_DRAW);
GLuint elBuf;
glGenBuffers(1, &elBuf);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elBuf);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 9 * sizeof(unsigned short), sInds, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawElements(GL_POINTS, 3, GL_UNSIGNED_SHORT, sInds);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
谁能告诉我我做错了什么?
最佳答案
您的代码已损坏,这与您的“VAO”无关(或者正如 Datenwolf 指出的那样,您缺少 VAO)。
你好像没明白index buffer中的index到底是干什么的。您将属性 0 定义为一个包含 3 个浮点值的数组。在 C 术语中,您说 float attrib0[numberOfPositions][3];
。当 OpenGL 看到第一个索引时,它会从数组中获取三个值。它将获取:
属性0[索引][0]; attrib0 index ; attrib0[索引][2];
您的索引是vertex 索引,而不是 GL_FLOAT 索引。数组元素每个是 3 个 float ,而不是每个 1 个 float 。
您尝试做的事情实际上不可能或没有用。正如 Datenwolf 指出的那样,它与 VAO 无关(因为您的代码不使用它们)。你说的是 indexed rendering ,这是与 VAO 不同的主题。
关于c++ - Opengl VAO 绘制不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13694336/