2012-04-05 17 views
0

Ich habe eine Oberfläche (OffScreenPlain oder RenderTarget mit D3DFMT_A8R8G8B8), die ich Pixel (ARGB) zu, von einer Drittanbieter-Funktion kopieren. Vor dem Kopieren von Pixeln wird von LockRect auf Bits zugegriffen.D3D9 Alpha Blending auf den Oberflächen

Diese Oberfläche ist dann StretchRect zum Backbuffer, der (D3DFMT_A8R8G8B8) ist. Surface und Backbuffer sind verschiedene Dimensionen. Die Filterung ist auf D3DTEXF_NONE eingestellt.

Kurz nach dem d3d Gerät erstellt Ich habe Set folgende RenderState Einstellungen

D3DRS_ALPHABLENDENABLE -> TRUE 
D3DRS_BLENDOP   -> D3DBLENDOP_ADD 
D3DRS_SRCBLEND   -> D3DBLEND_SRCALPHA 
D3DRS_DESTBLEND  -> D3DBLEND_INVSRCALPHA 

Aber ich sehe keine Alpha-Blending passiert. Ich habe überprüft, dass Alpha in Pixel angegeben ist.

Ich habe einen einfachen Test gemacht, indem ich einen Vertex-Puffer erstellt habe und ein Dreieck zeichne (DrawPrimitive), das mit Alpha Blending angezeigt wird.

In dieser Testoberfläche wurde zunächst StretchRect und dann DrawPrimitive verwendet, und der Oberflächeninhalt wird ohne Alpha-Überblendung angezeigt, und das Dreieck wird mit Alpha-Überblendung angezeigt.

Was fehlt mir hier? Danke

Antwort

2

Die Staaten, die Sie erwähnten, beeinflussen nur Eckpunkte. Um Texturen korrekt zu mischen, müssen Sie angeben, wie Textur-Alpha mit den Vertexen eins gemischt wird. Sie tun dies wie folgt aus:

d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); 

standardmäßig ALPHAOP ist SELECTARG1, das heißt nur Textur alpha ist in Rendering betrachtet.

Eine andere Lösung verwendet ID3DXSprite::Draw Methode zum Kopieren von Textur in den Backbuffer. Pass einfach die Farbe D3DCOLOR_ARGB(X, 255, 255, 255) wo X dein Alpha ist. Diese Methode wird alle Anpassungen des Bundesstaates vornehmen und das Endergebnis wird Ihren Erwartungen entsprechen.