Absolut unverständlicher Fehler
-
Hallo Leute,
ich bin hier am verzweifeln mit einem Fehler. Es geht um folgende Funktion (für das Problem muss der Code nicht genau verstanden werden):
void Terrain::updateRenderQueue(RenderQueue* queue) { for(uint i=0; i < mVisiblePatches.size();i++) { mVisiblePatches[i]->fixCracks(); } for(int i=0; i < mVisiblePatches.size(); i++) { mDevice->IASetIndexBuffer(mVisiblePatches[i]->mCurrentIB, DXGI_FORMAT_R32_UINT, 0); uint strides[] = { sizeof(float), sizeof(D3DXVECTOR3) }; uint offsets[] = { 0, 0 }; ID3D10Buffer* buffers[] = { mVisiblePatches[i]->mHeightsVB, mVisiblePatches[i]->mNormalsVB }; mDevice->IASetVertexBuffers(1, 2, buffers, strides, offsets); mTerrainTechnique->GetPassByIndex(0)->Apply(0); mDevice->DrawIndexed(mPatchNumIndicesLOD[mVisiblePatches[i]->mCurrentLOD], 0, 0); } }Die Funktion macht folgendes: Sie hat 2 Schleifen; in der 1. Schleife iteriert die Funktion über den std::vector<TerrainPatch*> mVisiblePatches und ruft für jeden TerrainPatch fixCracks() auf. Dann iteriert sie nochmal über alle TerrainPatches und rendert diese (der Code in der 2. Schleife ist eher unwichtig).
Die Funktion TerrainPatch::fixCracks() macht im Grunde nichts anderes als einen Buffer zu manipulieren und danach den Zeiger TerrainPatch::mCurrentIB auf diesen Zeiger zu setzen. (Nur zur Vollständigkeit: hier werden Terrain Patches unterschiedlicher Auflösung gerendert und wenn 2 Patches mit unterschiedlicher Auflösung neben einander liegen, dann muss bei einem Patch die Schnittkante manipuliert werden. Genau das macht fixCracks)Jetzt kommt, was ich absolut nicht verstehe: Wenn ich diesen Code ausführe, arbeitet er nicht richtig. Das Programm stürzt nicht ab, aber das Ergebnis ist falsch (es sieht so als, als würde TerrainPatch::mCurrentIB auf was falsches zeigen).
Das absolut verrückte: Wenn ich den Code aus der 2. Schleife (also die Zeilen 8 bis 17) in die 1. Schleife packe (sprich: Schleife 1 ruft zunächst fixCracks auf und danach der gesamte Code aus Schleife 2), dann geht alles!
Wie kann das sein? Es muss doch völlig egal sein, ob ich das in einem Durchlauf mache oder zwei?
-
Nein, muss nicht sein.
Wenn du das in einer Schleife machst, dann machst du den zweiten Teil ja bevor du fixCracks für die anderen Teile aufrufst, was, wenn du eine Abhängigkeit zu anderen Patches hast (was du ja anscheinend hast) durchaus ein anderes Ergebnis geben kann.