如果标题不明确,我会原谅我
我有一个小程序可以在屏幕上打印一些网格,用于初始化和绘制的代码如下:
(这里有初始化代码)
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代码完全兼容...
有人可以帮助我吗?谢谢