2014-10-30 6 views
5

Ich arbeite an einer Anwendung, die SharpDX und das SharpDX Toolkit verwendet, um einfache 3D-Formen zu zeichnen, und das Geometrics.Desktop-Beispiel war sehr hilfreich beim Einstieg. Jetzt versuche ich, einige Formen transparent zu machen, und um die Dinge einfach zu halten, versuche ich nur, das Teekannenmodell in diesem Muster transparent erscheinen zu lassen (vielleicht wäre das durchscheinender genauer).Wie kann ich ein transparentes 3D-Objekt mit dem SharpDX Toolkit zeichnen?

Für diejenigen, die mit dem Geometrics.Desktop-Beispiel nicht vertraut sind, zeichnet es einige einfache primitive geometrische Formen in 3D. Da es sich um eine Beispiel-App handelt, ist es ziemlich einfach, so dass es ein ziemlich gutes Scratchpad zum Experimentieren mit den 3D-Funktionen der SharpDX "Toolkit" -Bibliothek ist.

Ich habe dies dem Loadcontent-Methode hinzugefügt (die beim Start einmal ausgeführt wird), in dem Bemühen, Direct3D vorzubereiten Mischen zu tun:

 var blendStateDescription = new BlendStateDescription(); 

     blendStateDescription.AlphaToCoverageEnable = false; 

     blendStateDescription.RenderTarget[0].IsBlendEnabled = true; 
     blendStateDescription.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha; 
     blendStateDescription.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha; 
     blendStateDescription.RenderTarget[0].BlendOperation = BlendOperation.Add; 
     blendStateDescription.RenderTarget[0].SourceAlphaBlend = BlendOption.Zero; 
     blendStateDescription.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero; 
     blendStateDescription.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add; 
     blendStateDescription.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All; 

     var blendState = SharpDX.Toolkit.Graphics.BlendState.New(this.GraphicsDevice, blendStateDescription); 
     this.GraphicsDevice.SetBlendState(blendState); 

Ich habe die Tiefe Schablone wie folgt festgelegt:

Und in der Draw-Methode (die mit der Bildrate laufen und iteriert durch eine kleine Reihe von 3D-Modellen, die jeweils zeichnen), habe ich den folgenden Code hinzugefügt. Sie verschiebt die Teekanne in die Mitte des Ansichtsfensters und macht sie groß genug, um einige der anderen Objekte zu verdecken. Die Teekanne ist zuletzt gezogen, so haben die anderen Modelle bereits gemacht worden, so dass ich habe gehofft, dass das wirklich eine durchscheinende Teekanne auf sie ziehen würde:

// Draw the primitive using BasicEffect 
if (i == 6) 
{ 
    basicEffect.Alpha = 0.5f; 
    basicEffect.World *= Matrix.Translation(-x, -y, 0); 
    basicEffect.World *= Matrix.Scaling(3); 
} 
else 
{ 
    basicEffect.Alpha = 1; 
} 

primitive.Draw(basicEffect); 

(Der Kommentar und die letzte Aufforderung waren Teil Zeichnen von der ursprüngliche Beispielcode)

Aber leider ist das Ergebnis eine große undurchsichtige Teekanne unter den anderen Objekten.

enter image description here

Was muß ich tun, um diese te zu machen Apot transparent?

Fehle ich etwas oder habe ich den Mischstatus falsch konfiguriert?

Und nur der Vollständigkeit halber habe ich auch versucht, meine Objekte mit Bildern zu texturieren, die den Alpha-Kanal bei 50% haben, aber das führt immer noch zu opaken Objekten.

Vielen Dank im Voraus für jede Hilfe!

+0

Verwenden Sie direct3d11? Weil es kein * primitiv * nur * Kontext * gibt. –

+0

Ja ich benutze D3D11, aber ich benutzte das Wort "primitive" im geometrischen Sinne - Würfel, Kugel, Zylinder, und so weiter. Das SharpDX-Toolkit verfügt über Klassen, die das Zeichnen solcher Formen erleichtern und mit denen Sie problemlos arbeiten können. Meist. Es war sehr schwierig, sie transparent zu machen. – NSFW

Antwort

2

Ich habe SourceAlphaBlend und DestinationAlphaBlend auf Null gesetzt und es funktioniert wie es sollte. Anders als diese sieht die Zustandsbeschreibung für mich korrekt aus. Stellen Sie außerdem sicher, dass AlphaToCoverage im Mischzustand deaktiviert ist, da sonst die anderen Dinge merkwürdig wirken.

Stellen Sie außerdem sicher, dass Sie den BlendState vor dem Zeichnen jedes Frames festlegen.

+0

Sind Sie sicher, dass dies die einzigen Änderungen sind, die Sie vorgenommen haben? Ich habe gerade diese Änderungen an meiner Test-App vorgenommen und die Teekanne ist immer noch undurchsichtig. Dass du Alpha überhaupt hast, gibt mir große Hoffnung! – NSFW

+1

Verwenden Sie Visual Studio?Ist dies der Fall, verwenden Sie das Werkzeug "Debug-> Graphics-> Start Diagnostics", um das D3D11-Gerät zu debuggen und zur Laufzeit zu debuggen. Vielleicht wird ein Zustand nicht korrekt gebunden. –

+0

Ich habe eine transparente Teekanne! Der im Diagnosewerkzeug angezeigte Mischzustand stimmt nicht mit dem überein, den ich im Code konfiguriert habe. Ich habe das in die Renderschleife verschoben und die Transparenz funktioniert jetzt. Ich möchte es natürlich aus der Render-Schleife entfernen, aber ich werde mich als nächstes damit befassen. – NSFW

Verwandte Themen