【问题标题】:Opengl triangle not drawn未绘制OpenGL三角形
【发布时间】:2020-12-08 00:15:46
【问题描述】:

我正在尝试在屏幕上绘制一个简单的三角形。窗口设置正确,一切似乎都很好,我正在尝试实际绘制东西。我有以下代码,但由于某种原因它不起作用。

default_shader_program是函数代码后显示的程序链接着色器

void window::run(void(*update)(), void(*draw)()) {
    while (glfwWindowShouldClose(wnd) == 0)
    {

        update();
        glClear(GL_COLOR_BUFFER_BIT);
        draw();
        GLuint vb;
        GLfloat data[12]{
            1.f, 1.f, 0.f,
            1.f, -1.f, 0.f,
            -1.f, 0.f, 0.f
        };


        glGenBuffers(1, &vb);
        glBindBuffer(GL_ARRAY_BUFFER, vb);
        glBufferData(GL_ARRAY_BUFFER, 12, data, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        GLuint va;
        glGenVertexArrays(1, &va);
        glBindVertexArray(va);

        glUseProgram(default_shader_program);
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vb);
        glVertexAttribPointer(
            0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
            3,                  // size
            GL_FLOAT,           // type
            GL_FALSE,           // normalized?
            0,                  // stride
            (void*)0            // array buffer offset
        );

        glDrawArrays(GL_TRIANGLES, 0, 3);
        glDisableVertexAttribArray(0);

        glfwSwapBuffers(wnd);
        glfwPollEvents();
    }

    glfwDestroyWindow(wnd);
}

着色器: 顶点着色器:

#version 330 core
layout(location=0) in vec3 vertexPosition;

void main() {
    gl_Position = vec4(vertexPosition, 1);
}

片段着色器:

#version 330 core
out vec3 color;

void main() {
    color = vec3(1.0, 0.0, 0.0);
}

是的,我知道,我正在缓冲数据并在 while 循环中做其他事情。我知道不应该那样做,但实际问题发生在其他地方,我想看看代码是否可以直接在循环内正常工作。

【问题讨论】:

  • 为什么你的数据数组有 12 个元素?我不认为这是一个问题,但它只是奇怪

标签: c++ opengl glfw vbo


【解决方案1】:

您的数组包含 9 个元素而不是 12 个,但这不会导致问题。

glBufferData 的第二个参数是缓冲区大小(以字节为单位)。因此缓冲区的大小是9*sizeof(GLfloat) 而不是12:

glBufferData(GL_ARRAY_BUFFER, 12, data, GL_STATIC_DRAW);

glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), data, GL_STATIC_DRAW);

【讨论】:

  • 谢谢!它起作用了……几乎。我看到一个白色三角形而不是红色,因为它是在着色器中指定的。这是为什么呢?
  • @SherlockHolmes 很可能您的着色器没有正确加载、编译、链接或激活,但这是另一个问题。
  • 是的。由于项目编译为 lib,因此输出与源文件分开使用。无法从代码访问着色器文件。
猜你喜欢
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多