C++ Opengl VAO绘图不正确

C++ Opengl VAO绘图不正确,c++,opengl,C++,Opengl,我最近在使用Opengl VAOs时遇到了一个问题。 目前,我有一个代码,它使用VBO从浮点数组中绘制三角形 这是代码 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_ARRA

我最近在使用Opengl VAOs时遇到了一个问题。 目前,我有一个代码,它使用VBO从浮点数组中绘制三角形

这是代码

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);

有人能告诉我我做错了什么吗?

你使用哪个OpenGL版本?到目前为止,您的代码只使用顶点缓冲区对象,但还没有顶点数组对象支持代码。如果您使用的是OpenGL-4 core,则需要首先创建VAO,否则将无法绘制任何内容

如果您不打算使用VAO抽象,您可以在创建上下文之后立即创建一个全面的VAO

GLuint vaoID;
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
更新: 我昨天晚上没注意到,但尼科尔·博拉斯注意到了。第二段代码的某些部分没有意义<代码>vp仅定义3个浮动。它现在完全取决于顶点着色器的语义(使用通用顶点属性强制使用着色器)如何解释这些语义。调用元素大小为3的GLVertexAttributePointer会告诉OpenGL,该顶点属性的每个元素都有3个字段,这些字段一起寻址

您的第一个定义
vpp

如果启用多个顶点属性,它们将一起形成多个属性的长向量


提供给gl抽屉元素的索引处理的是这样的顶点属性向量,而不是它们各自的字段。

您的代码已被破坏,这与您的“VAO”无关(或者正如Datenwolf指出的,您缺少VAO)

您似乎不了解索引缓冲区中的索引实际上做了什么。您将属性0定义为3个浮点值的数组。在C语言中,你说,
float attrib0[numberOfPositions][3]。当OpenGL看到第一个索引时,它将从数组中获取三个值。它将获取:

attrib0[index][0]; 属性0; attrib0[index][2]

您的索引是顶点索引,而不是GL_浮点索引。数组元素各为3个浮点,而不是1个浮点


你想做的事实际上是不可能的,也没有用的。正如Datenwolf指出的,它与VAOs无关(因为您的代码不使用它们)。您正在谈论的是一个与VAOs不同的主题。

他不能使用核心配置文件。因为
glEnableClientState
不在核心配置文件中。@Nicolas:嗯,他很可能已经获得了OpenGL-4核心上下文,在这种情况下,glEnableClientState将是一个无效的操作。感谢您的澄清,大部分代码取自我找到的一些教程。。。很难找到有效的现代opengl资源。
float vp[] = { 0.0f, 0.75f, -0.75f };

              \------------------/ one attribute element
float vpp[] = { 0.75f, 0.75f, 0.0f,

                \----------------/ attribute element 0

                0.75f, -0.75f, 0.0f,

                \-----------------/ attribute element 1

                -0.75f, -0.75f, 0.0f};

                \------------------/ attribute element 2