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

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

12.01.2014, 20:07

[DX11] AlphaBlending

Hi,

ich lerne seit kurzem DirectX 11.

Ich habe AlphaBlending aktiviert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
blendStateDescription.RenderTarget[0].BlendEnable = TRUE;
    blendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;
    blendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
    blendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
    blendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
    blendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
    blendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
    blendStateDescription.RenderTarget[0].RenderTargetWriteMask = 0x0f;


Trotzdem wird beim Rendern einer Sprite der Hintergrund Weiß angezeigt.
Wenn ich die Texture mit Photoshop öffne, ist der Hintergrund Transparent.

Hab ich was vergessen, oder hat jemand ne Idee was ich falsch mache?



Gruß
»Schwarzefee« hat folgendes Bild angehängt:
  • alpha.jpg

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

12.01.2014, 21:17

Du musst ein BlendState Objekt erzeugen (CreateBlendState) und im Outputmerger setzen (OMSetBlendState).
@D13_Dreinig

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

3

12.01.2014, 21:41

Ausserdem hast du blendest du die Quellefarbe mit einem Faktor von eins ein. Da wird das Weiß immer durchkommen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

4

13.01.2014, 10:10

Hi,

Zitat

Du musst ein BlendState Objekt erzeugen (CreateBlendState) und im Outputmerger setzen (OMSetBlendState).
Ja, das mache ich schon.
Bei meiner Font-Engine wird der schwarze Hintergrund richtig transparent.

Zitat

Ausserdem hast du blendest du die Quellefarbe mit einem Faktor von eins ein. Da wird das Weiß immer durchkommen.
Das versteh ich nicht so ganz, kannst du das ein bisschen näher erklären?


Gruß

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

13.01.2014, 10:21

Alphablending ist eine Art des Blendings, die man in Direct3D implementieren kann und setzt sich aus verschiedenen Blend-Parametern zusammen. Diese bestimmen, wie Quell- und Zielfarbe miteinander kombiniert werden. Für Alphablending braucht man also eine bestimme Verrechnung von Alphawerten. Bei dir sollte, wenn du auch semitransparenzen haben willst, Additives Alphablending ok sein. Da ich mir das auch nie merken kann, suche ich meistens danach, also Alpha Blending BlendState Direct3D11 :)

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

6

13.01.2014, 20:15

Hi,

dank Google hab ich das glaubich erstmal hinbekommen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
blendStateDescription.RenderTarget[0].BlendEnable = TRUE;
blendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
blendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
blendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendStateDescription.RenderTarget[0].RenderTargetWriteMask = 0x0f;


Allerdings ist mir dabei ein weiterer Fehler aufgefallen:
Ich hab über der Sprite in jeder Frame eine seltsame Linie (siehe Anhang).

Die Texture-Koordinaten der beiden oberen Vertices sind richtig (y = 0.0f)

Woran kann das sonst noch liegen?


P.S: So wie es aussieht, gehört die Linie eigentlich unten an die Sprite (also sollte sie eigentlich die unterste Pixel-Linie der Sprite sein)
Woran kann das liegen?


Gruß
»Schwarzefee« hat folgendes Bild angehängt:
  • line.png

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schwarzefee« (13.01.2014, 20:21)


TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

14.01.2014, 13:42

Verschiedene Gründe. Es könnte sein, dass an den stellen, wo Linien sind, tatsächlich keine Transparenz vorherrscht. Prüfe das am besten mit einem Bildtool deiner Wahl, z. B. in dem du die Grafik auf einen schwarzen Hintergrund platzierst. Wenn du die Rahmen ebenfalls siehst, dann ist dein Bild nicht korrekt. Ansonsten erinnere ich mich, dass Multisampling teilweise solche Probleme erzeugen kann, da bin ich mir aber ziemilch unsicher.

Werbeanzeige