Frage

Ich habe mich gefragt, ob ich eine Szene mit einem Shader machen, auf die ich in einer Textur übergeben, die auch das Renderziel für diese Szene sein geschieht, wird es ein unerwünschtes Verhalten verursachen?

Also im Grunde:

texture t;

shader->SetTexture("texture",t);

device->SetRenderTarget( 0, t->surface );

shader->Begin("effect")
// do some more shader stuff

device->EndScene();

Was wird diese Ursache genau?

Wenn ich nicht klar, das Ziel machen vor dem Rendern wird die Textur alle noch funktionieren auf die gleiche? Ich gehe davon nur die letzten Änderungen werden nicht in die Textur geschrieben, bis Gerät-> Ende genannt wird?

War es hilfreich?

Lösung

Ich nehme an, Sie über DirectX9 sprechen. Die Dokumentation sagt nichts über diesen speziellen Fall, aber ich kann Ihnen die folgende sagen:

  

Ich gehe davon nur die letzten Änderungen in der Textur werden nicht bis geräte- geschrieben> Ende heißt

Dies ist eine falsche Annahme. Denken Sie darüber nach, Sie gehen davon aus, alle Pixel aller Dreiecke Sie werden gespeichert ‚irgendwo‘ ziehen und alle Ihre Textur ausgeführt holt ohne irgendwelche Pixel zurück in die Renderziel geschrieben werden. Dies erfordert eine beliebige Menge an Speicher und ist daher nicht möglich.

In der Praxis:

  • die Hardware-Prozesse in der Regel Dreiecke, wie sie kommen, viele auf einmal
  • aktualisiert sie den Frame-Buffer (die in Ihrem Fall die Trägertexturspeicher ist), wenn er will, vorausgesetzt, es gibt keine Rennbedingungen sein kann

Also, DX9 Annahme nicht beschweren (versuchen Sie es, wenn Sie wirklich wissen wollen, mache ich nicht mehr DX9), es wird nicht definiert sein.

Wie gesagt, ist DirectX10 darüber expliziter sein (

Andere Tipps

Obwohl ich nicht Spezifika kann darauf hinweisen, ich bin ziemlich sicher, dass es nicht definiertes Verhalten ist. Die Verfahren verwendet eine Grafikkarte für die Fragmente Schattierung kann, aber in jedem praktischen Fall, es kann mehr als ein Fragment zu einer Zeit variiert (unterschiedliche Mengen zu einer Zeit, etc zu tun). Dies bedeutet, dass Sie an die gleichen Stellen sowohl das Lesen und Schreiben werden sein, Rennbedingungen verursacht. Ich glaube nicht, es wird empfohlen.

Die Debug-Runtime wird verhindert, dass Sie dies tun und eine Warnung geben. Die Freigabe der Laufzeit „Macht“ (aber wahrscheinlich nicht) zu arbeiten.

Das Problem kommt die Tatsache bildet, dass es zwischen dem Laden des Pixels von einer Textur recht eine Verzögerung ist, und es verwendet wird. Dies wird durch Laden eines Blocks von Texeln in einem Cache fixiert. Die Schreibvorgänge werden gepuffert und gerade in den Speicher geschrieben. So werden Sie wahrscheinlich mit einem Problem am Ende, die ein Texel werden lesen können, die bereits aktualisiert worden sein, aber der Cache veraltet sein. Wenn Sie nur die Texel lesen, die „kann“ Arbeit aber realistisch solche Details der Implementierung, um es geschrieben wird an den IHVs links. Sie sind nicht verpflichtet, dies zu ermöglichen, zu arbeiten.

, sagte Wie von anderen ... es ist sehr viel nicht definiertes Verhalten.

scroll top