将OpenGL 4.5内容转换为OpenGL 4.0会使我的程序崩溃

时间:2020-07-28 15:40:57

标签: c++ opengl

如果标题不明确,我会原谅我

我有一个小程序可以在屏幕上打印一些网格,用于初始化和绘制的代码如下:

(这里有初始化代码)

glGenVertexArrays(1, &VAO);

glCreateBuffers(1, &VerticesVBO);
glCreateBuffers(1, &NormalVBO);
glCreateBuffers(1, &ColorVBO);

glBindVertexArray(VAO);
glNamedBufferStorage(VerticesVBO,vertexData.GetCount() * sizeof(float),&(vertexData[0]), GL_MAP_READ_BIT  | GL_MAP_WRITE_BIT);
glNamedBufferStorage(NormalVBO,normalData.GetCount() * sizeof(float),&(normalData[0]), GL_MAP_READ_BIT  | GL_MAP_WRITE_BIT);
glNamedBufferStorage(ColorVBO,colorData.GetCount() * sizeof(float),&(colorData[0]), GL_MAP_READ_BIT  | GL_MAP_WRITE_BIT);

glBindBuffer(GL_ARRAY_BUFFER,VerticesVBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER,NormalVBO);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);

glBindBuffer(GL_ARRAY_BUFFER,ColorVBO);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(2);

(以下是渲染代码)

    glBindVertexArray(VAO);
    if(showMesh && noLight.IsLinked() && light.IsLinked()){
        OpenGLProgram&  prog = (showLight)? light : noLight;
        prog.Bind();
        if(showLight)prog.SetVec3("viewPos",viewPosition.x,viewPosition.y,viewPosition.z);
        prog.SetMat4("ViewMatrix", viewMatrix);
        prog.SetMat4("ProjectionMatrix", projectionMatrix);
        prog.SetMat4("ModelMatrix", transform.GetModelMatrice());
        glDrawArrays(((prog.ContainTCS()) ? GL_PATCHES : GL_TRIANGLES), 0, SurfaceCount);
    }

但是,由于此OpenGL代码仅与OpenGL 4.5兼容,因此我作了一些更改以确保与OpenGL 4.0兼容: (这是我更改初始化代码的方式)

glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VerticesVBO);
glGenBuffers(1, &NormalVBO);
glGenBuffers(1, &ColorVBO);

glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER,VerticesVBO);
glBufferSubData(GL_ARRAY_BUFFER,0,vertexData.GetCount() * sizeof(float),&(vertexData[0]));
glBindBuffer(GL_ARRAY_BUFFER,NormalVBO);
glBufferSubData(GL_ARRAY_BUFFER,0,normalData.GetCount() * sizeof(float),&(normalData[0]));
glBindBuffer(GL_ARRAY_BUFFER,ColorVBO);
glBufferSubData(GL_ARRAY_BUFFER,0,colorData.GetCount() * sizeof(float),&(colorData[0]));

glBindBuffer(GL_ARRAY_BUFFER,VerticesVBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER,NormalVBO);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);

glBindBuffer(GL_ARRAY_BUFFER,ColorVBO);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(2);

我没有更改抽奖代码。问题是,当使用OpenGL 4.5初始化代码时,一切正常,但是当使用4.0时,代码在glDrawArrays(...)之后的第一个循环时崩溃。我不知道问题是否与OpenGL有关,但由于它与我的4.5代码完全兼容...

有人可以帮助我吗?谢谢

1 个答案:

答案 0 :(得分:3)

您必须使用glBufferData而不是glBufferSubData,因为它不会在gpu中分配空间