glDrawArrays在gl_triangle模式下不绘制任何东西

glDrawArrays does not draw anything in GL_TRIANGLES mode

本文关键字:绘制 任何东 模式 gl triangle glDrawArrays      更新时间:2023-10-16

我的问题是glDrawArray命令停止工作。我写过几个程序,都用过这个命令。然而现在,我不知道为什么它不起作用。

但我仍然可以用GL_LINES而不是GL_TRIANGLES在屏幕上画线。

下面是我的代码:
#include "Mesh.h"
#include <iostream>
Mesh::Mesh()
{
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    glGenBuffers(1, &vbo);
    size = 0;
}
void Mesh::AddVertices(const Vertex vertices[], int length)
{
    size = length;
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}
void Mesh::Draw()
{
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, Vertex::SIZE * 4, 0);
    glDrawArrays(GL_TRIANGLES, 0, size);
    glDisableVertexAttribArray(0);
}

Draw总是被Game类调用。我的顶点类:

#include "Vertex.h"
Vertex::Vertex(glm::vec3 pos)
{
    this->pos = pos;
}
Vertex::Vertex(float x, float y, float z)
{
    pos = glm::vec3(x, y, z);
}
glm::vec3 Vertex::GetPos() const
{
    return pos;
}
void Vertex::SetPos(glm::vec3 pos)
{
    this->pos = pos;
}

sizeof(vertices)sizeof(void*),因为在C或c++数组中的函数参数衰减为指针。您应该使用第二个参数中提供的length,如果它的大小为字节。

我找到解决办法了。当我初始化我的OpenGL函数时,我意外地写了glFrontFace(GL_CW)而不是glFrontFace(GL_CCW)