(Diese Frage auf weitere Untersuchungen von this andere Frage basiert, ist aber nicht die gleiche Frage, ist diese sehr spezifische Frage über die Malerei Fragen.)Wie zeichne ich eine transparente Oberfläche mit SharpDX?
Ich versuche, eine transparente Oberfläche auf überlappt zu ziehen ein Zielfenster, das Problem ist, dass ich nicht weiß, wie man es transparent malt, also bis zu dem Moment, wo meine Oberfläche schwarz ist, und ich kann nicht den richtigen Weg sehen, die schwarze Farbe dieser Oberfläche im Code unten zu löschen.
Ich habe über Pixelformats und Alphamodes gelesen, scheint jedoch, dass ich die AlphaMode.Straight
nicht verwenden kann, die angeblich für Transparenz ist.
Ich bin mir dessen bewusst ein Freeware-Anwendung, die dies tun kann, ist sein Name TurboHUD (eine Anwendung, die auf dem Fenster eines Spiel-Client eine transparente Oberfläche zieht Objekte zu zeichnen, das heißt, ein HUD). Um ehrlich zu sein und vielleicht lächerlich: Ich versuche, dies vor mehr als zwei Jahren zu erreichen, ich weiß immer noch nicht, wie ich damit anfangen soll, indem ich die Transparenz mache, die ich brauche, um Objekte auf einer transparenten Oberfläche zu zeichnen.
Was mache ich falsch ?. Dieser Beispielcode ist in VB.NET geschrieben, aber ich akzeptiere auch eine Lösung in C#.
Imports SharpDX
Imports SharpDX.Direct2D1
Imports SharpDX.Direct3D
Imports SharpDX.DXGI
Imports SharpDX.Mathematics.Interop
Imports SharpDX.Windows
Public NotInheritable Class Form1 : Inherits Form
Private factory As New Direct2D1.Factory(Direct2D1.FactoryType.SingleThreaded)
Private render As WindowRenderTarget
Private renderProps As HwndRenderTargetProperties
Private renderThread As Thread = Nothing
Private Sub Form1_Load() Handles MyBase.Shown
Dim hwnd As IntPtr = Process.GetProcessesByName("notepad").Single().MainWindowHandle
Me.renderProps = New HwndRenderTargetProperties()
Me.renderProps.Hwnd = hwnd
Me.renderProps.PixelSize = New Size2(1920, 1080)
Me.renderProps.PresentOptions = PresentOptions.None
Me.render = New WindowRenderTarget(Me.factory, New RenderTargetProperties(New PixelFormat(Format.B8G8R8A8_UNorm, Direct2D1.AlphaMode.Premultiplied)), Me.renderProps)
Me.renderThread = New Thread(New ParameterizedThreadStart(AddressOf Me.DoRender))
Me.renderThread.Priority = ThreadPriority.Normal
Me.renderThread.IsBackground = True
Me.renderThread.Start()
End Sub
Private Sub DoRender(ByVal sender As Object)
While True
Me.render.BeginDraw()
' Me.render.Clear(New RawColor4(0, 0, 0, 0))
Me.render.Clear(SharpDX.Color.Transparent)
Me.render.Flush()
Me.render.EndDraw()
End While
End Sub
End Class
Der obige Code ist eine VB.NET Anpassung der akzeptierten Antwort von this Frage.
Hier ist ein Link einen Blick wert - http://stackoverflow.com/questions/26646715/how-can-i-draw-a-transparent-3d-object- with-the-sharpdx-toolkit – AGrammerPro
Danke für den Kommentar und für den Versuch zu helfen. Ich habe auch diese Frage gefunden, aber ich denke (denke ich), dass das nicht auf dieses Szenario anwendbar ist, weil das eine Form/ein Objekt transparent macht, keine Oberfläche. Ehrlich gesagt weiß ich nicht, wie man dieses Beispiel testet/reproduziert. – ElektroStudios
Mit Blick auf [diese MSDN-Seite] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd756766 (v = vs.85) .aspx # supported_formats_for_id2d1hwndrendertarget) scheint es, dass die 'Straight' alpha Modus wird nicht unterstützt, wenn es um die 'ID2D1HwndRenderTarget'-Schnittstelle geht (was ich denke SharpDX verwendet). –