0

我最近在使用 Opengl VAO 时遇到了问题。目前我有代码使用 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);

谁能告诉我我做错了什么?

4

2 回答 2

1

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

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

属性0[索引][0];属性0索引;属性0[索引][2];

您的索引是顶点索引,而不是 GL_FLOAT 索引。数组元素每个是 3 个浮点数,而不是每个浮点数。

What you're trying to do is not really possible or useful. And as Datenwolf pointed out, it has nothing to do with VAOs (since your code doesn't use them). You're talking about indexed rendering, which is a different topic from VAOs.

于 2012-12-04T01:13:01.130 回答
0

您使用哪个 OpenGL 版本?到目前为止,您的代码仅使用顶点缓冲区对象,但那里还没有顶点数组对象支持代码。如果您使用的是 OpenGL-4 核心,则需要先创建一个 VAO,否则不会绘制任何内容。

如果您不打算使用 VAO 抽象,您可以在创建上下文后立即创建一个包罗万象的 VAO。

GLuint vaoID;
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);

更新:

昨天晚上我没注意到,但尼可波拉斯注意到了。您的第二个代码片段的某些部分没有意义。vp仅定义 3 个浮点数。它现在完全取决于顶点着色器的语义(使用通用顶点属性要求使用着色器)如何解释这些。您对元素大小为 3 的glVertexAttribPointer的调用告诉 OpenGL,该顶点属性的每个元素都有 3 个字段,它们被一起寻址。

float vp[] = { 0.0f, 0.75f, -0.75f };

              \------------------/ one attribute element

你的第一个定义会更有意义vpp

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

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

提供给 glDrawElements 的索引处理这些顶点属性向量,而不是它们的各个字段。

于 2012-12-04T01:02:06.257 回答