(Questa domanda si basa su ulteriori indagini this altra domanda, ma non è la stessa domanda, questa è la domanda molto specifica sui problemi di verniciatura.)Come disegnare una superficie trasparente usando SharpDX?
sto cercando di disegnare una superficie trasparente sovrapposto su una finestra di destinazione, il problema è che non so come dipingerlo trasparente, quindi nel momento in cui la mia superficie è nera, e non riesco a vedere il modo corretto per cancellare il colore nero di quella superficie nel codice qui sotto.
Ho letto di pixelformats e alphamodes, tuttavia, sembra che non sia possibile utilizzare lo AlphaMode.Straight
che presumibilmente è per consentire la trasparenza.
Sono consapevole di un'applicazione freeware che può fare questo, il suo nome è TurboHUD (un'applicazione che disegna una superficie trasparente sulla finestra di un client di gioco per disegnare oggetti, cioè, un HUD). Per essere onesto e forse ridicolo: sto cercando di ottenere questo risultato da più di due anni fa, non so ancora come iniziare a fare questo facendo la trasparenza di cui ho bisogno per iniziare a disegnare oggetti su una superficie trasparente.
Cosa sto facendo male ?. Questo codice di esempio è scritto in VB.NET, ma accetto anche una soluzione 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
Il codice di cui sopra è un adattamento VB.NET della risposta accettata di this domanda.
Ecco un link vale la pena guardare - http://stackoverflow.com/questions/26646715/how-can-i-draw-a-transparent-3d-object- with-the-sharpdx-toolkit – AGrammerPro
Grazie per il commento e per aver cercato di aiutare. Ho anche trovato questa domanda, ma penso (penso) che non sia applicabile a questo scenario, perché è per rendere trasparente una forma/oggetto, non una superficie. Onestamente non so come testare/riprodurre quell'esempio. – ElektroStudios
Guardando [questa pagina MSDN] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd756766 (v = vs.85) .aspx # supported_formats_for__id2d1hwndrendertarget) sembra che l'alfa 'Straight' la modalità non è supportata quando si ha a che fare con l'interfaccia 'ID2D1HwndRenderTarget' (che suppongo che SharpDX stia usando). –