Ich habe einige WebGL-Code geerbt, der Zeichen von Rendering-Artefakten zeigt, die durch eine Race-Bedingung verursacht werden. Das Problem tritt nur bei bestimmter Hardware auf (bei Nvidia dediziert, aber nicht bei integrierten Intel-Grafikkarten) und scheint mit gl.copyTexImage2D
verwandt zu sein.WebGL: gl.copyTexImage2D Race-Bedingung
Der problematische Code ist wie folgt aufgebaut:
<draw things> // render to frame buffer
gl.copyTexImage2D(...); // copy frame buffer to texture
<draw more things> // render to frame buffer
<bind texture to uniform> // start using texture
<draw overlays> // render to frame buffer using data from the texture
Leider sind die gezogenen Overlays Artefakte zeigen, dass falsche Daten in die Textur aus dem Bildpuffer kopiert anzuzeigen. Auch dies funktioniert auf einigen Hardware einwandfrei, während es bei anderen fehlschlägt.
Ich kann das Problem beheben, indem Sie einen Aufruf an gl.flush()
Hinzufügen (oder gl.finish()
für was es wert ist) nach gl.copyTexImage2D(...)
. Während dies mein Problem löst, frage ich mich immer noch, ob ich einen Fehler in der WebGL-Implementierung oder in meinem Code sehe.
Irgendwelche Ideen? Vielen Dank im Voraus!
Danke für die Antwort! Ich würde auch einen Synchronisationspunkt erwarten, weshalb ich verwirrt bin. Und nein, wir lesen und schreiben nicht dieselbe Textur. Das Rendern erfolgt nur mit dem Standard-Framebuffer. Danke auch für die Info über 'glCopyTexImage' leider, dass man noch nicht den Weg in WebGL gefunden hat. – karhu
@karhu: Durch "hat es nicht geschafft" denke ich, du meinst 'gl.BlitFrameBuffer' (was Teil der WebGL 2.0 Spezifikationen ist), nicht copyTexImage. –
@ Paul-Jan: Ja, du hast vollkommen recht! Mein Fehler. – karhu