2013-10-04 34 views
0

正如标题所说,我的问题是当我渲染一个“对象”,特别是地形,并在水网之后,它进展顺利,但如果我简单地在渲染后渲染地形,它与此错误崩溃:OpenGL - 重新排序渲染方法后崩溃

解决 - 文本的底部。

Unhandled exception at 0x55C3B970 (atioglxx.dll) in Pan3Da Engine.exe: 0xC0000005: Access violation reading location 0x00000000.

void PNDHEIGHTMAP::p_renderwater() 
{ 
    waterShader->bindShader(); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D,waterReflection.fbo_texture); 
    glActiveTexture(GL_TEXTURE1); 
    glBindTexture(GL_TEXTURE_2D,waterRefraction.fbo_texture); 
    glActiveTexture(GL_TEXTURE5); 
    glBindTexture(GL_TEXTURE_2D,waterGlobalReflection.fbo_texture); 
    glActiveTexture(GL_TEXTURE6); 
    glBindTexture(GL_TEXTURE_2D,waterDepthBufferID); 

    glActiveTexture(GL_TEXTURE2); 
    glBindTexture(GL_TEXTURE_2D,water_normal_map1); 
    glActiveTexture(GL_TEXTURE3); 
    glBindTexture(GL_TEXTURE_2D,water_normal_map2); 
    glActiveTexture(GL_TEXTURE4); 
    glBindTexture(GL_TEXTURE_2D,water_dudv_map); 

    waterShader->sendUniform("water_level",waterlevel); 
    waterShader->sendUniform("reflection_texture",0); 
    waterShader->sendUniform("reflection_global_texture",5); 
    waterShader->sendUniform("water_depth_texture",6); 
    waterShader->sendUniform("refraction_texture",1); 
    waterShader->sendUniform("bump_map_1",2); 
    waterShader->sendUniform("bump_map_2",3); 
    waterShader->sendUniform("dudv_map",4); 


    glEnableVertexAttribArray(0); 
    glBindVertexArray(waterVertArrayBuffer); 
    for(unsigned long indRow=0;indRow<pndwater.indexRows;indRow++) 
    {glDrawElements(GL_TRIANGLES,pndwater.indexRange,GL_UNSIGNED_INT,(void*)(sizeof(unsigned long)*pndwater.indexRange*indRow));} <--------crash 
}; 

这是我的水呈现代码,地形是相同的,但用2个VertexAttribArrays:(0)和(1),和较少的纹理。该程序在最后一行崩溃。

glEnable(GL_POLYGON_OFFSET_EXT); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
    glPolygonOffset(0.5f,0.5f); 
    glDisable(GL_CULL_FACE); 
    waterShader->bindShader(); 
    waterShader->sendUniform("light_position",pndskybox.light_position.x,pndskybox.light_position.y,pndskybox.light_position.z); 
    waterShader->sendUniform("camera_position",camera.cameraPosition.x,camera.cameraPosition.y,camera.cameraPosition.z); 
    waterShader->sendUniform("d_time",timer); 
    pndheightmap.p_renderwater(); 
    glEnable(GL_CULL_FACE); 
    glPolygonOffset(0,0); 
    glDisable(GL_BLEND); 
    glDisable(GL_POLYGON_OFFSET_EXT); 

我不想发布所有的代码cuz其相当长。我用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(); 
.... 

然后崩溃。我真的不知道什么可能会导致这个问题,但它很烦人。 在此先感谢!

P.S .:我可以发布更多的代码,如果你需要它。

回答

1

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

纠正我,如果我错了,或误解了一些东西,但现在它运作良好。