c++ - OpenGL 3.3 无法绘制任何东西

标签 c++ opengl opengl-3

我不能在我的 gl 屏幕上画任何东西。它只是清除屏幕。这是我的 Main、Display 和 Cube 类。

主要.cpp

Display d(800, 600, "Hi");
while (!d.IsClosed()) {
    d.Clear();
    d.Update();
}
return 0;

显示.cpp

构造函数初始化 glfw 和 glew。

void Display::Update() {
    glfwPollEvents();
    m_shader->UseProgram();
    m_renderer->Render(*m_cube);
    glfwSwapBuffers(m_window);
}

UseProgram 函数来自 Shader 类,只是 glUseProgram(m_programID);

此外,m_renderer->Render() 只是从参数中的对象调用 Render 函数。

立方体.cpp

void Cube::Init() {
//cube vertices - colors
GLfloat data[] = {
    -0.5f,  0.5f,  0.0f, m_color.r, m_color.g, m_color.b, m_color.a,
    -0.5f, -0.5f,  0.0f, m_color.r, m_color.g, m_color.b, m_color.a,
     0.5f, -0.5f,  0.0f, m_color.r, m_color.g, m_color.b, m_color.a,
     0.5f,  0.5f,  0.0f, m_color.r, m_color.g, m_color.b, m_color.a,

    -0.5f,  0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a,
    -0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a,
     0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a,
     0.5f,  0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a
};

//cube indices
GLuint indices[] = {
    //front
    0, 1, 2,
    0, 2, 3,

    //top
    4, 0, 3,
    4, 3, 7,

    //bottom
    1, 3, 6,
    1, 6, 2,

    //left
    4, 3, 1,
    4, 1, 0,

    //right
    3, 2, 6,
    3, 6, 7,

    //back
    4, 5, 6,
    4, 6, 7,
};

m_vertexCount = sizeof(indices) / sizeof(GLuint);

//Generate buffers
glGenVertexArrays(1, &m_vaoID);
glGenBuffers(1, &m_vboID);
glGenBuffers(1, &m_eboID);

//Bind vertex array object
glBindVertexArray(m_vaoID);

//Bind vertex buffer object
glBindBuffer(GL_ARRAY_BUFFER, m_vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT)));

//Unbind vertex buffer object
glBindBuffer(GL_ARRAY_BUFFER, 0);

//Bind Element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
//Unbind Element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

//Unbind vertex array object 
glBindVertexArray(0);
}

Init() 函数从构造函数中调用。这是所有立方体初始化代码。只是绑定(bind)和解除绑定(bind)数组。

void Cube::Render() {
glBindVertexArray(m_vaoID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID);
glDrawElements(GL_TRIANGLES, m_vertexCount, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}

我不知道是什么问题。它只是不在屏幕上显示任何内容。如果您愿意,我也可以发布我的着色器类(class)。

最佳答案

步幅参数错误。每个连续的位置开始 7 float 远离最后一个的开始。颜色也是如此。正确的代码是

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT)));

另一件事是您在解除绑定(bind) VAO 之前解除了索引缓冲区的绑定(bind),因此您有效地删除了绑定(bind)。 VAO 设置的最后几行必须是:

//Bind Element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

//Unbind vertex array object 
glBindVertexArray(0);

//Unbind Element buffer object
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

此外,Render() 函数中GL_ELEMENT_ARRAY_BUFFER 的绑定(bind)/解除绑定(bind)应该被移除。

关于c++ - OpenGL 3.3 无法绘制任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41959375/

相关文章:

cocoa - OpenGL 渲染顺序导致前景中的三角形在后台绘制

opengl - (OpenGL 3.1 - 4.2) 动态统一数组?

c++ - 用概率创建矩阵

c++ - 为什么glDrawElements不画我的圆?

c++ - 如果是来自特定基类的派生类,如何转换

c++ - 在 C++/OpenGL 中以无边框的透明背景显示图像

c++ - 为什么这个不正确的 std::function 初始化使用 MSVC 编译?

c++ - 获取矩形的所有顶点

c++ - SDL2 SDL_CreateRenderer 降级OpenGL 上下文,是否可以阻止?

c++ - Qt 5.0.2 和 OpenGL 3+ 渲染问题