C++ OpenGL,绘制形状返回错误

Posted

技术标签:

【中文标题】C++ OpenGL,绘制形状返回错误【英文标题】:C++ OpenGL, drawing shapes is returning an error 【发布时间】:2020-01-13 20:51:03 【问题描述】:

我正在尝试在我的应用程序上绘制形状。我已将#include <glad/glad.h> 添加到我的代码中。

我在头文件中将顶点数组、顶点缓冲区和索引缓冲区设置为无符号整数。

在我的 application.h 文件中我添加了这个:

unsigned int m_FCvertexArray; // Textured Phong VAO
unsigned int m_FCvertexBuffer;// Textured Phong VBO
unsigned int m_FCindexBuffer; // Index buffer for texture Phong cube

在我的构造函数的 application.cpp 中,我添加了这个:

Application::Application()

    //------------- OPENGL VALUES -----------//

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    // Enabling backface culling to ensure triangle vertices are correct ordered (CCW)

    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    ////--------DRAW VERTICES---------//

    float FCvertices[3 * 3] = 
                -0.5f, -0.5f, 0.0f,
                 0.5f, -0.5f, 0.0f,
                 0.0f,  0.5f, 0.0f
            ;

    glGenVertexArrays(1, &m_FCvertexArray);
    glBindVertexArray(m_FCvertexArray);

    glCreateBuffers(1, &m_FCvertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_FCvertexBuffer);

    //
    //

    glBufferData(GL_ARRAY_BUFFER, sizeof(FCvertices), FCvertices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(sizeof(float) * 3));


    ////--------DRAW INDICES---------//

    glCreateBuffers(1, &m_FCindexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_FCindexBuffer);

    unsigned int indices[3] = 0, 1, 2;

    glBufferData(GL_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

在我的void Application::run() 中我添加了:

glUseProgram(m_FCprogram);
glBindVertexArray(m_FCvertexArray);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);

现在的问题是当我运行代码时,它给了我标题中提到的错误:

Exception thrown at 0x000000005D78F420 (nvoglv64.dll) in Sandbox.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

我一直在尝试解决此问题的方法,但似乎不起作用。如果我注释掉 glDrawElements,代码会运行并且可以工作,但不会绘制任何形状(很明显)。

【问题讨论】:

你打电话给gladLoadGLLoader吗? @Rabbid76 我在哪里叫它,我写什么? 见glad 【参考方案1】:

创建索引缓冲区时,需要使用 GL_ELEMENT_ARRAY_BUFFER 而不是 GL_ARRAY_BUFFER。

【讨论】:

以上是关于C++ OpenGL,绘制形状返回错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL不在C++中绘制三角形

无法获得简单的 2D 着色器以在 C++ openGL 中绘制红色三角形(无编译器错误)

OpenGL几何着色器三角形不会没有错误地绘制

无法在opengl中绘制多个对象

C++ OpenGL/Glut 无法绘制

纹理未正确显示 - 可能坐标是错误的 OpenGL、C++