OpenGL三角形未绘制

问题描述

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

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,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,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循环中做其他事情。我知道,不应该那样做,但是实际问题发生在其他地方,我想看看代码是否可以在循环内直接正常工作。

解决方法

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

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

glBufferData(GL_ARRAY_BUFFER,12,data,GL_STATIC_DRAW);

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...