2016-06-07 16 views
1

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!

Antwort

2

Soweit OpenGL betroffen ist (ich bin nicht so fest auf die Details von WebGL) GlCopyTexImage fügt einen Synchronisationspunkt, so dass keine Race-Bedingung sein sollte. Aus Performance-Gründen hätte ich dort sowieso kein glCopyTexImage. Stattdessen würde ich einen zweiten FBO vorbereiten und das Ziel rendern, einen glBlitFrameBuffer machen, zum zweiten Framebuffer wechseln und dort weiter rendern. Dies wird Ihnen im Allgemeinen eine bessere Dosierung ermöglichen und das Problem, dem Sie begegnet sind, sehr wahrscheinlich umgehen.

Natürlich verwenden Sie die Textur nicht als Quelle zum Rendern eines Framebuffers, der als Ziel ausgewählt wurde. Machst du?

+0

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

+0

@karhu: Durch "hat es nicht geschafft" denke ich, du meinst 'gl.BlitFrameBuffer' (was Teil der WebGL 2.0 Spezifikationen ist), nicht copyTexImage. –

+1

@ Paul-Jan: Ja, du hast vollkommen recht! Mein Fehler. – karhu