OpenGL - 重新排序渲染方法后崩溃
OpenGL - crash after reorder rendering methods
正如标题所说,我的问题是当我渲染一个"对象"时,尤其是地形,并且在水网之后,它运行良好,但是如果我简单地将地形渲染放在水渲染之后,它会出现此错误:
已解决 - 文本底部。
Pan3Da Engine.exe 中 0x55C3B970 (atioglxx.dll( 处未处理的异常: 0xC0000005:访问违规读取位置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 个顶点 AttribArray:(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);
我不想发布所有代码,因为它很长。我用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();
....
然后它崩溃了。我真的不知道什么可能导致这个问题,但这很烦人。提前感谢!
PS:如果你需要,我可以发布更多代码。
好的,我刚刚发现了问题所在。因为我使用的是 VAO-s,所以我在其中启用了顶点属性,我不必禁用它们。但是我在 void p_renderwater(( 和 p_renderterrain(( 中的绘制调用之前"重新启用"了它们,所以如果我是对的,它就像全局启用一样,不仅在该 VAO 的范围内,而且在水中 VAO 我只使用了 1 个属性,而不是两个。如果我将地形渲染放在水之后,则可以,但如果地形方法是第一个,则水尝试接受第二个属性,因为我将其全局启用。
如果我错了,或者误解了什么,请纠正我,但现在效果很好。
相关文章:
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 类指针方法崩溃程序
- 使用push_back方法获取智能指针矢量时应用崩溃
- 在崩溃时释放分配的指针的正确方法
- 具有协变返回类型的方法在 VC++ 上崩溃
- C++ 程序在应用主题方法上崩溃
- 这种遍历二叉树的递归方法在一些递归后崩溃!为什么?
- 为什么我的C++程序有时会在离开方法时崩溃
- 我的 Word Addin 在调用 IDTExtensibility2 的 OnDisconnection 方法后崩溃
- 使用成员编写移动构造函数的正确方法unique_ptr(崩溃)
- QTimer 在以单独的方法启动时崩溃
- Push_back指针向量的方法会导致崩溃C++
- OpenGL - 重新排序渲染方法后崩溃
- 获取方法上的代码崩溃,C++
- Android JNI :调用对象方法时应用程序崩溃
- C# 应用程序在对 COM 类的方法调用时崩溃
- 调用不访问 null 对象指针上数据的方法有时有效,有时崩溃。为什么它不总是崩溃?
- 带有自定义对象的矢量:当我想使用用.at方法接收的矢量时崩溃
- 同名类之间的共享 vtables:强制转换为基类型时,对虚拟方法的调用崩溃
- 类的实例只允许1个方法或程序崩溃