Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.01.2013, 15:06

Stencilbuffer im Shader

Hallo.
Wie kann ich in einem HLSL Pixelshader (Model 2.a) aus dem aktuellen (oder evtl. dem Effekt übergebenen) Stencilbuffer samplen? Ist das in dieser Version überhaupt möglich?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

19.01.2013, 15:17

Das kann rein prinzipiell nicht gehen, gleich wie du auch nicht aus dem aktuellen Rendertarget lesen kannst...

3

19.01.2013, 21:13

Könnte ich nicht den Stencilbuffer mit CreateTexture und D3DUSAGE_DEPTHSTENCIL erzeugen und einfach als Textur setzen und dann im Shader ganz normal aus dem sampler2D-Objekt samplen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

19.01.2013, 21:43

Ja, man kann rein prinzipiell einen bereits befüllten DepthStencil Buffer in einem späteren Durchgang als Textur lesen (beachte allerdings, dass das in Direct3D9 nur über Hacks, die auf herstellerspezifischen Texturformaten basieren, möglich ist). An den momentan in Verwendung befindlichen Buffer, kommst du aber nicht ran.

5

20.01.2013, 19:21

Danke für den Link. Ich glaube nicht, dass das ganze mit dem GPU-Hack auf meiner (etwas rustikalen) GeForce 9100MG mit DX9 und Shadermodel 2.a noch läuft. Ich denke, ich mache es mit Stencil-Test und mehreren Passes, da sowieso nur zwei oder drei verschiedene Werte im Puffer vorliegen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

21.01.2013, 07:28

Was genau hast du denn eigentlich vor zu machen?

7

21.01.2013, 21:57

Es geht um eine 2D-Lichtengine. Ich render das Bild in eine Textur und die Lichter in eine zweite. Die werden im Shader dann multipliziert. Nur will ich jetzt auch selbstleuchtende oder zumindest nicht beleuchtete Objekte haben. Meine erste Idee, den Grad des Selbstleuchtens im Alphachannel der ersten Textur unterzubringen, hat nicht ganz geklappt, weil transparente Objekte dann diesen Channel falsch beschreiben. Dann kam ich halt auf den Stencil-Buffer. Aus Performancegründen möchte ich eigentlich keine extra Textur dafür nehmen.
Allerdings fällt mir gerade auf, dass ich, da ich für DestBlend sowieso immer nur InvSrcAlpha nehme, den Alphakanal vorher gar nicht brauche und dann mit ColorWriteEnable das Schreiben darein verhindern kann. Dann könnte ich selbstleuchtende Objekte ein zweites Mal nur in Alpha rendern.


Kann ich dieses Thema irgendwie in die Grafik-Abteilung verschieben?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

21.01.2013, 22:18

Meine erste Idee, den Grad des Selbstleuchtens im Alphachannel der ersten Textur unterzubringen, hat nicht ganz geklappt, weil transparente Objekte dann diesen Channel falsch beschreiben.

Wieso genau beschreiben die den Alpha Channel denn falsch?

Dann kam ich halt auf den Stencil-Buffer. Aus Performancegründen möchte ich eigentlich keine extra Textur dafür nehmen.

Naja, aber wenn du den Stencil Buffer dafür verwendest, dann ist das doch auch nicht wirklich viel anders, als wenn du eine eigene Textur dafür verwendest!?

Allerdings fällt mir gerade auf, dass ich, da ich für DestBlend sowieso immer nur InvSrcAlpha nehme, den Alphakanal vorher gar nicht brauche und dann mit ColorWriteEnable das Schreiben darein verhindern kann. Dann könnte ich selbstleuchtende Objekte ein zweites Mal nur in Alpha rendern.

Zumindest auf einigermaßen aktuellen Grafikkarten kannst du das Blending für den Alphakanal separat konfigurieren; vielleicht würde dir das auch schon helfen!?

Kann ich dieses Thema irgendwie in die Grafik-Abteilung verschieben?

Schon erledigt ;)

9

21.01.2013, 22:36

Falsch im Sinne von, sie beschreiben ihn überhaupt, was ja nicht passieren soll, da die Werte darin später ganz anders interpretiert werden. Mein Spiel arbeitet viel mit teilweise völlig transparenten Texturen, was bei dieser Umsetzung zu einer Katastrophe geführt hat. Davon geschockt habe ich das mit den Alphawerten erst mal schnell vergessen.

Zitat

Naja, aber wenn du den Stencil Buffer dafür verwendest, dann ist das doch auch nicht wirklich viel anders, als wenn du eine eigene Textur dafür verwendest!?
Dachte ich auch zuerst, aber dann ist mir aufgefallen, dass einmal das ganze Bild mit Stenciltesting zu rendern weit weniger auf die Framerate geht als im Shader, der das gleiche Bild bearbeitet, einen zusätzlichen Sample zu machen.

Zitat

Zumindest auf einigermaßen aktuellen Grafikkarten kannst du das Blending für den Alphakanal separat konfigurieren;
Was genau meinst du damit? Etwa dass ich für Farbe und Tranzparenz separat festlegen kann, wie sie geblendet werden und auf diese Weise das Beschreiben des Alphachannels bei transparenten Objekten verhindern kann?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

21.01.2013, 23:16

Zitat

Zumindest auf einigermaßen aktuellen Grafikkarten kannst du das Blending für den Alphakanal separat konfigurieren;
Was genau meinst du damit? Etwa dass ich für Farbe und Tranzparenz separat festlegen kann, wie sie geblendet werden und auf diese Weise das Beschreiben des Alphachannels bei transparenten Objekten verhindern kann?

Ganz genau ;)

Werbeanzeige