C++ OpenGL-重新排序渲染方法后崩溃

C++ OpenGL-重新排序渲染方法后崩溃,c++,opengl,rendering,glsl,C++,Opengl,Rendering,Glsl,正如标题所说,我的问题是当我渲染一个“对象”,特别是地形,在水网格之后,它运行得很好,但是如果我简单地在水渲染之后放置地形渲染,它会出现以下错误: 已解决-文本底部。 Pan3Da Engine.exe中0x55C3B970(atioglxx.dll)处未处理的异常: 0xC0000005:访问冲突读取位置0x00000000 我不想发布所有的代码,因为它相当长。我使用fbo-s渲染水纹理。然后绑定水着色器并使用发布的方法渲染水 我的地形也一样: terrainShader->bindSh

正如标题所说,我的问题是当我渲染一个“对象”,特别是地形,在水网格之后,它运行得很好,但是如果我简单地在水渲染之后放置地形渲染,它会出现以下错误:

已解决-文本底部。

Pan3Da Engine.exe中0x55C3B970(atioglxx.dll)处未处理的异常: 0xC0000005:访问冲突读取位置0x00000000

我不想发布所有的代码,因为它相当长。我使用fbo-s渲染水纹理。然后绑定水着色器并使用发布的方法渲染水

我的地形也一样:

terrainShader->bindShader();
terrainShader>sendUniform("light_position",pndskybox.light_position.x,pndskybox.light_position.y,pndskybox.light_position.z);
pndheightmap.p_rendermap_h();
我的主要渲染方法如下所示:

void PNDRENDER::render()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    maprenderer.p_renderskybox();
    maprenderer.p_renderHeightMap();
    maprenderer.p_renderWater();
}
但如果我改变它们:

....
maprenderer.p_renderWater();
maprenderer.p_renderHeightMap();
....
然后它崩溃了。我真的不知道是什么可能导致这个问题,但这很烦人。 提前谢谢


附言:如果你需要,我可以发布更多的代码。

好的,我刚刚发现了问题所在。因为我使用的是VAO-s,所以我在它们中启用了顶点属性,而不必禁用它们。但是我在void p_renderwater()和p_renderterrain()中的draw调用之前“重新启用”了它们,所以如果我是对的,它的行为就像它是全局启用的一样,不仅在该VAO的范围内,而且在水VAO中,我只使用了1个属性,而不是两个。如果我将地形渲染放在水之后,它是正常的,但是如果地形方法是第一个,水会尝试接受第二个属性,因为我全局启用了该属性

如果我错了,或者误解了什么,请纠正我,但现在它运行良好

void PNDRENDER::render()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    maprenderer.p_renderskybox();
    maprenderer.p_renderHeightMap();
    maprenderer.p_renderWater();
}
....
maprenderer.p_renderWater();
maprenderer.p_renderHeightMap();
....