代码之家  ›  专栏  ›  技术社区  ›  nick2225

直接状态访问(DSA)失败,但4.3之前的OpenGL可以工作

  •  1
  • nick2225  · 技术社区  · 4 年前

    我目前有一个OpenGL项目,其中我使用GLFW创建窗口和上下文,并使用GLAD加载OpenGL函数。我使用的GLAD版本是OpenGL 4.6,兼容配置文件,具有所有扩展(包括ARB_direct_state_access)。

    我当前的图形卡设置为

    OpenGL Version: 4.6.0 NVIDIA 457.09
    GLSL Version: 4.60 NVIDIA
    Renderer: GeForce GTX 970/PCIe/SSE2
    Vendor: NVIDIA Corporation
    

    当我运行以下非DSA代码时,它工作正常。

    // Create vertex array object and bind it
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    
    // Create an index buffer object and use the data in the indices vector
    GLuint ibo;
    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicies.size()*sizeof(GLint), indicies.data(), GL_STATIC_DRAW);
    
    // Create a array buffer object and use the positional data which has x,y,z components
    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, positions.size()*sizeof(GLfloat), positions.data(), GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);
    

    但是,当我尝试将此代码转换为DSA格式并运行它时,程序会打开一个窗口,然后在没有有用调试信息的情况下终止。

    GLuint vao;
    glGenVertexArrays(1, &vao);
    
    GLuint vbo;
    glCreateBuffers(1, &vbo);
    glNamedBufferStorage(vbo, positions.size()*sizeof(GLfloat), positions.data(), GL_DYNAMIC_STORAGE_BIT);
    glVertexArrayVertexBuffer(vao, 0, vbo, 0, 0);
    glEnableVertexArrayAttrib(vao, 0);
    glVertexArrayAttribFormat(vao, 0, 3, GL_FLOAT, GL_FALSE, 0);
    glVertexArrayAttribBinding(vao, 0, 0);
    
    GLuint ibo;
    glCreateBuffers(1, &ibo);
    glNamedBufferStorage(ibo, sizeof(GLint)*indicies.size(), indicies.data(), GL_DYNAMIC_STORAGE_BIT);
    glVertexArrayElementBuffer(vao, ibo);
    

    在这两种情况下,我都会在绘制之前绑定顶点阵列对象,如下所示

    glBindVertexArray(vao);
    glDrawElements(GL_TRIANGLES, indicies.size(), GL_UNSIGNED_INT, 0);
    

    为什么我的DSA类代码不起作用?

    1 回复  |  直到 4 年前
        1
  •  2
  •   Rabbid76    4 年前

    当你使用 glVertexArrayVertexBuffer 您必须指定 步幅 争论。当 步幅 为0,如使用时 glVertexAttribPointer ,使用时不适用 gl顶点阵列顶点缓冲区 .

    glVertexArrayVertexBuffer(vao, 0, vbo, 0, 0);

    glVertexArrayVertexBuffer(vao, 0, vbo, 0, 3*sizeof(float));
    

    如果满足以下条件,则不会导致错误 步幅 是0,但这并不意味着它有意义。

    推荐文章
    Ty Q.  ·  分段故障GLFW3/GLAD
    3 年前