Heute habe ich mich damit beschäftigt, eine 3D-Engine auf Windows Phone (8) zu portieren. Im Prinzip handelte es sich schon vor dieser Aktion um relativ viele Klassen, welche sauber auf Windows Desktop und WinRT laufen (auch ARM). Ich wusste zwar schon, dass die Phone-Plattform noch einmal deutlich eingeschränkter ist, als etwa die WinRT-Plattform für Tablets, das ich so viel rumbasteln muss, hätte ich aber nicht gedacht. Hier eine kurze Sammlung der Punkte, auf die ich gestoßen bin.
Blog
Direct3D Adapter- und Output-Informationen per DXGI laden
Eine einfache Aufgabe, die man gerne vergisst, wenn man mit Direct3D arbeitet. Für gewöhnlich arbeitet man mit dem Adapter (=Grafikkarte), welcher als Standard am Rechner eingestellt ist. Dies ist nämlich der Fall, wenn bei allen Initialisierungs-Methoden nicht explizit angegeben wird, welcher Adapter verwendet werden soll bzw. der Standard-Adapter mit Index 0. Aber was ist, wenn mehrere Grafikkarten im Rechner stecken, über die mehrere Monitore (>2) angebunden sind? Was ist, wenn der Software-Renderer (WARP) verwendet werden soll? In diesem Beitrag beschreibe ich ein Beispielprogramm, welches per DXGI (DirectX Graphics Infrastructure) alle verfügbaren Adapter ermittelt und in einer WPF-Oberfläche einige Informationen dazu anzeigt.
Einfacher Media Player mit C# und der Windows Media Foundation #3
In den letzten Beiträgen habe ich es schon öfters geschrieben: Die API der MediaFoundation (MF) finde ich prinzipiell überraschend einfach anzuwenden. Meine Probleme entstanden aber i. d. R. dadurch, dass der von mir verwendete Wrapper SharpDX.MediaFoundation alles andere als ausgereift ist. Aus diesem Grund habe ich in den letzten Tagen im Internet nach Alternativen gesucht – und prompt das (leider schon seit 2012 eingestellte) OpenSource Projekt MediaFoundation.Net gefunden. Die Tatsache, dass daran nicht mehr entwickelt wird, schreckt zunächst ab, aber nach einem kurzen Blick über die Klassen und Interfaces erkennt man, dass die MF-API grundsätzlich sauberer abgebildet ist. Aus diesem Grund habe ich meinen Video Player aus den letzten Blog-Einträgen genommen und auf diese Bibliothek umgestellt.
Media Foundation Transcoding mit C#
Langsam aber sicher hangele ich mich durch die MF (Media Foundation) durch. Im Gegensatz zu dem Video Player aus den letzten beiden Posts geht es hier um eine andere Aufgabe: Dem Transcoding (Konvertieren). Mein Beispielprogramm lässt dem Benutzer eine Quell- und eine Zieldatei auswählen und eine neue Auflösung für das Video einstellen. Nach Klick auf „Transcode!“ wird das Video entsprechend konvertiert und in die neue Zieldatei geschrieben. Rein von der MF-API her ist diese Aufgabe relativ einfach zu lösen, wie aber bei meinen letzten Posts lag die Schwierigkeit auch hier eher bei der Brücke zwischen C# und MF-API. Die Stolpersteine hier waren allerdings noch etwas größer und zeitaufwändiger.
Triangulation von WPF-Path Objekten
Zugegeben, der Titel dieses Beitrags hört sich etwas komisch an. Was Besseres ist mir aber leider nicht eingefallen. Im Grunde habe ich mir folgendes in den Kopf gesetzt: Ich möchte in meinem Programm diverse 3D-Objekte wie Pfeile, Böden (nicht nur rein rechteckige) o. Ä. relativ einfach dynamisch erzeugen können. Die Path-Objekte aus WPF bieten mir dafür schon die Grundlage, die ich brauche, nur leider lediglich in 2D. Daher habe ich ein kleines Programm geschrieben, welches aus einen Path per Triangulation-Algorithmus ein Modell aus Dreiecken errechnen kann. Daraus im Anschluss ein wirkliches 3D-Objekt zu machen, ist bekanntlich kein großes Problem mehr.
XBox 360 Controller in C# per SharpDX ansprechen
Im Zuge des Steam Winter Sale habe ich mich mit ein paar kleinen Gelegenheitsspielen für das kommende Jahr eingedeckt. Viel Zeit dafür ist zwar neben Arbeit und Studium nicht mehr, die ein oder andere Viertelstunde lässt sich dafür aber gerne entbehren. Neben den Spielen habe ich mir auch einen XBox 360 Controller für den PC bestellt. Der PC ist nämlich sowieso schon per Hdmi mit dem Fernseher verbunden. Zusammen mit dem Controller und Steam wird daraus dann eine kleine, leistungsstarke Console. Was mich aber neben dem Spielen selbst auch noch interessiert hat, ist, wie man den Controller auch für andere Sachen nutzen kann. Kurzerhand habe ich mir die XInput Schnittstelle angeschaut, mit der der Controller angesprochen werden kann.. und bin überrascht, wie einfach diese gestrickt ist.
Einfacher Media Player mit C# und der Windows Media Foundation #2
In meinem letzten Blogeintrag habe ich meine ersten Gehversuche mit der Media Foundation (MF) beschrieben. Herausgekommen ist ein einfacher Media Player.. und wenig wieder verwendbarer Code. Aus diesem Grund habe ich etwas aufgeräumt und eine Komponente daraus entwickelt, über die relativ einfach ein kleiner Video Player in eine Windows.Forms basierte Anwendung integriert werden kann. Die Details der MF-API liegen dabei vollständig in dieser Komponente und sind für den Verwender der Komponente schlicht nicht sichtbar. In diesem Blogeintrag stelle ich die Komponente kurz vor, als was sie macht, welche Schnittstelle sie bereitstellt usw.
Einfacher Media Player mit C# und der Windows Media Foundation
Seit kurzem beschäftige ich mich nebenbei mit der Windows Media Foundation (MF). Im Grunde geht es mir darum, einen relativ einfachen Weg zu haben, Videos wiederzugeben und Videos zu erzeugen. Für Ersteres ist die MF nicht zwingend notwendig, klar, für Letzteres aber schon. Konkret hätte ich im Kopf, aus einer eigenen 3D-Engine heraus selbst ohne Zusatzsoftware ein Video aufzunehmen und z. B. auf die Festplatte zu schreiben. Davon bin ich im Moment aber selbstverständlich noch ein paar Wochen bis Monate entfernt ^^. Zunächst habe ich mich oberflächlich mit dem Thema beschäftigt. Gleich vorweg kann ich das Buch Developing Microsoft Media Foundation Applications von Anton Polinger empfehlen. Es wurde auch mir empfohlen und bietet einen detaillierten Überblick über das Thema. Bis jetzt hat es mir als gutes Nachschlagewerk gedient, vor allem auch deshalb, weil ich mit der Hilfe von Msdn so meine Probleme hatte.
Mausklick in Win.Forms per Reactive Extensions abfragen
Die Reactive Extensions von Microsoft können schon ein cooles Werkzeug sein. Wer sich schon einmal damit beschäftigt hat, weiß, dass dieses Framework vom Funktionsumfang her eine sehr gute Ergänzung ist, von der Syntax her aber sehr ungewohnt.
Ein gutes Beispiel dafür habe ich neulich bei einem relativ einfachen Thema gemacht: Einen einfachen Mausklick in einem Windows.Forms Panel abfangen. Das Standard-Ereignis konnte ich nicht nehmen, da dieses auch dann feuert, wenn die Maustaste länger unten gehalten wurde. In diesem Fall möchte ich das Ereignis aber nicht, da länger gedrückte Maustaste in diesem Fall eine andere Bedeutung hat.
Shader debuggen mit Visual Studio 2012
Aktuell bin ich dabei, verschiedene Shader-Effekte wie z. B. Blur, Grayscale, Pixel-Lightning usw. zu entwickeln. Schwierig ist dabei eigentlich immer, Fehler in den Shadern zu finden. Was macht man als Anfänger? Man geht her, programmiert den Shader in Visual Studio, kompiliert diesen und bindet ihn in das Programm ein. Das Ergebnis ist dann meistens erst einmal nicht das, was man erwartet. Und dann? Tja, im Hlsl-Coding nach dem möglichen Fehler suchen, ausbessern, wieder kompilieren und dann wieder schauen. Und so geht das eine ganze Weile weiter.. dabei kann man diesen Ablauf in Visual Studio mittlerweile wesentlich produktiver gestalten.