C++ glDrawArrays(…)赢得';我什么也不画

C++ glDrawArrays(…)赢得';我什么也不画,c++,opengl,C++,Opengl,我在使用glDrawArrays()绘制东西时遇到问题,这里没有其他问题可以帮助我解决它。代码应该绘制一个球体,但为了调试,我用简单立方体的顶点填充“m_顶点”。 我的代码如下: 首先是init函数 init() { m_shader.compileShaders("Shaders/colorShading.vert", "Shaders/colorShading.frag"); m_shader.addAttribute("position"); m_shader.addAttribute("

我在使用glDrawArrays()绘制东西时遇到问题,这里没有其他问题可以帮助我解决它。代码应该绘制一个球体,但为了调试,我用简单立方体的顶点填充“m_顶点”。 我的代码如下:

首先是init函数

init()
{
m_shader.compileShaders("Shaders/colorShading.vert", "Shaders/colorShading.frag");
m_shader.addAttribute("position");
m_shader.addAttribute("normal");
m_shader.linkShaders();

//setup VAO and VBO
glGenVertexArrays(1, &m_vao);
glGenBuffers(1, &m_vbo);

//init VAO
glBindVertexArray(m_vao);
//bind Buffer used by VAO
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
//enable needed AttributeArrays
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
//position attribute pointer
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexBuffer), (void*)offsetof(VertexBuffer, vertex));
glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, sizeof(VertexBuffer), (void*)offsetof(VertexBuffer, normal));
//release VAO
glBindVertexArray(0);
//release VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);

//Set-Up a static scene
// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
glm::mat4 projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
// Camera matrix
glm::mat4 view = glm::lookAt(
    glm::vec3(4, 3, 3), // Camera is at (4,3,3), in World Space
    glm::vec3(0, 0, 0), // and looks at the origin
    glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
    );
// Model Matrix
glm::mat4 model = glm::mat4(1.0f);
//set ModelViewProjection-Matrix of this object
m_mvp = projection * view * model;
}
更新功能更新VBO。这是必需的,因为最终球体应该实现细节级别。 最后是draw函数:

update()
{
//update Sphere and get current vertices
//currently setting vertices for a cube
m_sphere->updateSphere(m_vertices);

//m_vertices is passed in per reference
//it stores 6 quads based on 2 triangles (36 vertices)
//the vertices are stored counter clockwise

//update VBO
//bind buffer
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
//orphan the buffer
glBufferData(GL_ARRAY_BUFFER, m_vertices.size() * sizeof(VertexBuffer), nullptr, GL_STATIC_DRAW);
//upload data
glBufferSubData(GL_ARRAY_BUFFER, 0, m_vertices.size() * sizeof(VertexBuffer), &m_vertices[0]);
//release buffer
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
draw()
{
glEnable(GL_DEPTH_TEST);

//activate shader
m_shader.use();

//set-up the mvp-uniform
GLuint matrixID = m_shader.getUniformLocation("MVP");
glUniformMatrix4fv(matrixID, 1, GL_FALSE, &m_mvp[0][0]);

//draw Planet
glBindVertexArray(m_vao);
glDrawArrays(GL_TRIANGLES, 0, m_vertices.size());
glBindVertexArray(0);

//deactivate shader
m_shader.unuse();

glDisable(GL_DEPTH_TEST);
}
此函数应仅绑定/设置着色器并绘制对象。 问题是它没有画出物体,我不知道为什么。 如果有人能发现我的错误并解释我在这里做错了什么,我将非常感激

编辑:

因此,根据要求,我添加了我的代码,用于填充多维数据集数据:

static const std::vector<GLfloat> g_vertex_buffer_data = {
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f
};

updateSphere(std::vector<VertexBuffer> &vertices)
{
if(!vertices.empty())
    vertices.clear();
for (int i = 0; i < g_vertex_buffer_data.size();)
{
    VertexBuffer buffer;
    glm::vec3 vertex(g_vertex_buffer_data[i], g_vertex_buffer_data[i+1], g_vertex_buffer_data[i+2]);
    buffer.setVertex(vertex);
    buffer.setNormal(glm::normalize(vertex));
    vertices.emplace_back(buffer);
    i += 3;
}
}
我的着色器类已经在其他几个项目中进行了测试,效果非常好。我假设我管理VAO和VBO或多维数据集数据出错。但我可能完全错了

我纠正了VAO一代,这是我的错,我想知道为什么我没有看到这一点。但这并没有解决这里的问题


颜色和深度缓冲区在我的项目的主循环中被清除。我应该在对象的每次绘制调用中清除它们吗?

我看到这被投票关闭,因为它不是最小的、可验证的和完整的。选民是否愿意说明遗漏了什么?就极简主义而言,对于一个
opengl
代码片段来说,这实际上是相当小的。我100%同意。但是,着色器和多维数据集初始化丢失(这可能会对结果产生一些影响)。您正在使用深度测试,是否清除过缓冲区?我在你的代码片段中没有看到任何这样做的代码。不清除它会阻止它通过任何深度测试。此外,最好看看如何初始化顶点。许多图形问题通常是由于系统初始化不当而产生的。请尝试使用
glGetError()
进行错误检查。我在第5行停止了阅读,在那里调用
glGenBuffers()
创建VAO。必须是
glgenvertexarray()
。好的,谢谢您的帮助。我解决了我的问题。代码运行得非常好,但由于某些原因,我在片段着色器中弄乱了alpha值。我没想到会出现错误,因为我从未在活动AlphaBlend下使用过此testshader。另外还要感谢@RetoKoradi指出了我的VAO错误。我认为这项投票结果并不是最小的、可验证的和完整的。选民是否愿意说明遗漏了什么?就极简主义而言,对于一个
opengl
代码片段来说,这实际上是相当小的。我100%同意。但是,着色器和多维数据集初始化丢失(这可能会对结果产生一些影响)。您正在使用深度测试,是否清除过缓冲区?我在你的代码片段中没有看到任何这样做的代码。不清除它会阻止它通过任何深度测试。此外,最好看看如何初始化顶点。许多图形问题通常是由于系统初始化不当而产生的。请尝试使用
glGetError()
进行错误检查。我在第5行停止了阅读,在那里调用
glGenBuffers()
创建VAO。必须是
glgenvertexarray()
。好的,谢谢您的帮助。我解决了我的问题。代码运行得非常好,但由于某些原因,我在片段着色器中弄乱了alpha值。我没想到会出现错误,因为我从未在活动AlphaBlend下使用过此testshader。另外还要感谢@RetoKoradi指出了我的VAO错误。
struct Vector3 {
float x;
float y;
float z;
};

struct VertexBuffer {
Vector3 vertex;
Vector3 normal;

void setVertex(glm::vec3 vec)
{
    vertex.x = vec.x;
    vertex.y = vec.y;
    vertex.z = vec.z;
}
void setNormal(glm::vec3 vec)
{
    normal.x = vec.x;
    normal.y = vec.y;
    normal.z = vec.z;
}
};