c++ - Opengl VAO 绘制不正确

标签 c++ opengl

我最近在处理 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/

相关文章:

c++ - 断言返回值,但以任何一种方式运行

delphi - 如何在控件中正确渲染 OpenGL?

c++ - 使用具有透视图的移动相机时如何避免像素化几何体?

java - 如何使用 lwjgl 将相机视线方向用作 z 方向

c++ - CMake Visual Studio 将可执行文件与静态库链接

c++ - 从多个线程写入静态数据实际上安全吗

c++ - 为什么默认由value_type参数化std::list分配器?

python - 在 C++ 中嵌入 python 时出现模块问题

opengl - 使用 glUniform 指针变体后更改变量是否安全?

c++ - 想要在从 blender 导入的实体 3d 对象上绘制线框网格