0

タイトルが示すように、私の問題は、1 つの「オブジェクト」、特に地形をレンダリングするときであり、水グリッドの後でうまくいきますが、単純に地形レンダリングを水のレンダリングの後に置くと、次のエラーでクラッシュします。

解決済み - テキストの下部。

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
};

これは私の水のレンダリング コードです。地形は同じですが、VertexAttribArrays:(0) と (1) が 2 つあり、テクスチャが少なくなっています。プログラムは最後の行でクラッシュします。

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 でレンダリングします。次に、water-shader をバインドし、投稿されたメソッドで水をレンダリングします。

私の地形と同じ:

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: 必要に応じて、さらにコードを投稿できます。

4

1 に答える 1

1

わかりました、何が問題なのかがわかりました。私は VAO を使用しているので、それらの頂点属性を有効にしました。それらを無効にする必要はありません。しかし、void p_renderwater() および p_renderterrain() での描画呼び出しの前にそれらを「再度有効化」したので、私が正しければ、その VAO の範囲内だけでなく、水の VAO でのみグローバルに有効化されたように動作しました。 2 つではなく 1 つの属性を使用しました。水の後に Terrain-render を配置しても問題ありませんでしたが、terrain-method が最初の場合、水は 2 番目の属性を受け入れようとしました。

私が間違っていたり、何かを誤解している場合は修正してください。しかし、今ではうまくいきます。

于 2013-10-05T07:34:01.260 に答える