Frage

Ich habe einige OpenGL-Code, der inkonsistent über verschiedene verhält Hardware. Ich habe einige Code bekam, dass:

  1. Erstellt einen Render-Puffer und bindet eine Textur seiner Farbpuffer (Texture A)
  2. Stellt dieser Puffer als aktiv machen, und passt die Darstellungs usw.
  3. Aktiviert einen Pixel-Shader (Gaußsche Unschärfe in diesem Fall).
  4. Zeichnet
  5. ein Quad auf Vollbild, mit Textur A auf sich.
  6. Löst die Bindung der renderbuffer, etc.

Auf meiner Entwicklung Maschine funktioniert dies gut, und hat die beabsichtigten Wirkung der Textur „in place“, jedoch auf anderen Hardware-Unschärfe dies scheint nicht zu funktionieren.

Ich habe es zwei Möglichkeiten bekommen nach unten.

A) Erstellen einer renderbuffer sich machen wird nicht funktionieren soll, und funktioniert nur auf meiner Entwicklung Maschine aufgrund irgendeine Art von Zufall.

oder

B) Dieser Ansatz sollte funktionieren, aber etwas anderes nicht in Ordnung ist.

Irgendwelche Ideen? Ehrlich gesagt habe ich habe eine harte Zeit Besonderheiten zu diesem Problem zu finden.

War es hilfreich?

Lösung

A) ist die richtige Antwort. Rendering in den gleichen Puffer, während von ihm zu lesen ist nicht definiert. Es könnte funktionieren, könnte es nicht -. Das ist genau das, was geschieht

In OpenGL Fall von framebuffer_object Erweiterung hat Abschnitt „4.4.3 Rendering Wenn ein Bild eines Bound-Textur-Objekt auch an den Framebuffer-Attached“, die erzählen, was passiert (im Grunde genommen nicht definiert). In Direct3D9 wirft die Debug-Laufzeit laut, wenn Sie, dass das Setup verwenden (aber es könnte je nach Hardware / Treiber funktionieren). In D3D10 entbindet die Laufzeit immer das Ziel, das als Ziel verwendet wird, denke ich.

Warum ist dies nicht definiert? Einer der Gründe GPUs so schnell ist, dass sie eine Menge von Annahmen getroffen werden können. Zum Beispiel können sie davon ausgehen, dass Einheiten, die Pixel holen nicht mit Einheiten kommunizieren müssen, die Pixel zu schreiben. So kann eine Oberfläche gelesen werden, N Zyklen später der Lese abgeschlossen ist, N Zyklen später die Pixelshader beendet er die Ausführung ist, dann ist es sie in einem gewissen Ausgang setzen fusionieren Puffer auf der GPU und schließlich an einem gewissen Punkt wird es in den Speicher geschrieben. Hinzu kommt, dass, rastern die GPUs in „undefiniert“, um (eine GPU könnte in Reihen, eine andere in irgendeiner Cache-freundlich um, ein anderer in völlig anderen Ordnung rastern), so dass Sie nicht wissen, welche Teile der Oberfläche geschrieben werden In dem ersten.

Also, was Sie tun sollten, ist mehrere Puffer erstellen. In Blur / Glow Fall ist zwei in der Regel genug - macht in dem ersten, dann lesen und verschwimmen, dass, während in der zweiten zu schreiben. Wiederholen Sie diesen Vorgang benötigt, wenn in Pingpong Art und Weise.

Andere Tipps

In einigen Sonderfällen sogar die Backbuffer könnte genug sein. Sie einfach nicht tun, eine glClear, und was Sie vorher noch dort gezeichnet ist. Der Nachteil ist natürlich, dass man nicht wirklich von dem Backbuffer lesen kann. Aber für Effekte wie in und aus Fading, das funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top