Jens Konerow's Bloghttp://blog.jenskonerow.deNews und Artikel rund um das Thema Game Development mit DirectX/ XNACopyright 2005 - 2009 Jens KonerowKostenloser Artikel zum XNA FrameworkDie Fachzeitschrift Visual Studio One nimmt die Microsoft Developer Community als Zielgruppe ins Visier. Alle zwei Monate halten Sie bekannte Autoren zu den Themen .NET, Visual Studio, SharePoint, Silverlight, Windows Mobile, C#, VB &amp; Co. auf dem Laufenden.<br />Mit freundlicher Unterst&#252;tzung von Visual Studio One kann ich Ihnen heute einen Artikel zum Thema XNA Framework im PDF-Form als kostenlosen Download anbieten. Der Artikel fokussiert die Audio- und Videowiedergabe im XNA Framework. Der Artikel entstammt einer Serie zur Spieleentwicklung mit dem XNA Game Studio. Alle anderen Artikel der Serie k&#246;nnen Sie nachtr&#228;glich unter <a href="http://www.visualstudio1.de">www.visualstudio1.de</a> in Papierform oder als elektronische Ausgabe beziehen. <ul><li>Meine erste XNA-Anwendung (Vincent Zahnd)<br />Ausgabe 02/2009</li><li>Zweidimensionalit&#228;t<br />Ausgabe 03/2009</li><li>Dreidimensionale Echtzeit<br />Ausgabe 04/2009</li><li>XNA-Flexibilit&#228;t dank der GPU<br />Ausgabe 06/2009</li><li>Sound und Video im XNA-Framework<br />Ausgabe 01/2010</li><li>XNA-Framework im Netz<br />Ausgabe 02/2010</li></ul>Die Serie beginnt bei der zweidimensionalen Grafikausgabe, legt dann die Grundsteine f&#252;r die Dreidimensionalit&#228;t und f&#228;hrt mit der Shader-Programmierung fort. Die letzten beiden Artikel erkl&#228;ren Ihnen, wie Sie Audio- und Videodaten wiedergeben und Verbindungen im Netzwerk aufbauen sowie Ihr fertiges Computerspiel &#252;ber den Xbox LIVE Marktplatz verteilen.<br /><br /><a href="http://blog.jenskonerow.de/blog/files/VS10110_XNA.pdf">Artikeldownload: Sound und Video im XNA-Framework</a><br /><br /><a href="http://www.visualstudio1.de"><img src="http://www.visualstudio1.de/images/logo2.jpg" /></a>http://blog.jenskonerow.de/blog/Default.aspx?ID=0f97a69f-df89-41fa-bc0c-66826f99133bWed, 10 Mar 2010 08:29:44 GMTErste Infos zum XNA Game Studio 4.0Die letzten Tage ging die Information schon mehrfach durch die Presse: Microsoft erweitert die verf&#252;gbare Plattform-Palette des XNA Frameworks auf Windows Phone 7. Somit werden XNA Framework-Entwickler &#252;ber Nacht zu Entwickler f&#252;r neue Smart Phones, die ab Ende des Jahres mit der Einf&#252;hrung von Windows Phone 7 auf den Markt kommen werden. Insgesamt erm&#246;glicht das XNA Framework dann die Entwicklung f&#252;r Windows-PC’s, die Xbox 360 und Windows Phone 7-Smart Phones. Zune-Ger&#228;te unterstützt das XNA Game Studio 4.0 nicht mehr. Allerdings lassen sich XNA Game Studio 3.1 und XNA Game Studio 4.0 parallel betreiben. Im optimalen Fall gen&#252;gen ca. 10% Codeanpassungen f&#252;r die jeweilige Plattform, um Eigenheiten wie die Steuerung zu optimieren.<br />Auf der diesj&#228;hrigen Games Developer Conference (GDC) hat Microsoft nun erstmals Informationen zum XNA Framework 4.0 ver&#246;ffentlicht, das es wahrscheinlich noch in diesem Sommer in die virtuellen Regale schaffen wird. <br />Unter Windows Phone 7 dreht sich im Spielesektor alles um den Games Hub und den Marketplace Hub. Der Games Hub enth&#228;lt alle vom Benutzer bezogenen Spiele. Dar&#252;ber hinaus stehen folgende Xbox LIVE Features zur Verf&#252;gung:<br /><ul><li>Sammeln von Achievements und Ausbau des Gamer Score</li><li>Anzeige des Xbox LIVE Leaderboards</li><li>Anzeige des Xbox LIVE Avatars</li><li>Zugriff auf Spotlight Feeds</li><li>Verwaltung der Xbox LIVE Freunde</li></ul>&#220;ber den Marketplace Hub beziehen Benutzer Applikationen und Spiele. Sowohl freie Entwickler als auch professionelle Entwickler k&#246;nnen ihre Applikationen und Spiele auf dem Marketplace ver&#246;ffentlichen. <br />Besonderer Clou ist die plattform&#252;bergreifende Speicherung der Spielst&#228;nde. Erreichte Spielst&#228;nde werden online vermerkt und k&#246;nnen auf einer anderen Plattform fortgef&#252;hrt werden.<br />Doch damit nicht genug, das XNA Framework hält auch weitere neue Features bereit:<ul><li>Visual Studio 2010 Support</li><li>Dynamic Audio Output</li><li>Microphone Input</li><li>Neue Effekt-Klassen:<ul><li>SkinnedEffect</li><li>EnvironmentMapEffect</li><li>DualTextureEffect</li><li>AlphaTestEffect</li></ul></li></ul>http://blog.jenskonerow.de/blog/Default.aspx?ID=eb9463ab-e7f9-47e2-922d-c768cada911fWed, 10 Mar 2010 08:09:15 GMTVideos der PDC 2009 onlineF&#252;r alle die der diesj&#228;hrigen PDC nicht pers&#246;nlich beiwohnen konnten, stehen jetzt Videos der Sessions online zur Verf&#252;gung. Zwei Sessions, Advanced Graphics Functionality Using DirectX und Modern 3D Graphics Using Windows 7 and Direct3D 11 Hardware, von Michael Oneppo geben Einblick in die neuen M&#246;glichkeiten von Windows 7 und DirectX 11.<br /><br /><a href="http://microsoftpdc.com/Videos">Videos der PDC 2009 Sessions</a>http://blog.jenskonerow.de/blog/Default.aspx?ID=ebf9784a-03cf-4f5e-9538-bf078a1b7db3Thu, 26 Nov 2009 17:57:22 GMTUnrealEngine 3 und CryENGINE 3 kostenlosK&#252;rzlich hat Epic Games seine UnrealEngine 3 f&#252;r nicht kommerzielle Projekte zum kostenlosen Download bereitgestellt. Nun zieht auch das Frankfurter Studio Crytek nach und ver&#246;ffentlichte seine CryENGINE 3. Crytek m&#246;chte seine Engine u.a. Universit&#228;ten anbieten. Interessenten m&#252;ssen sich auf der Website der CryENGINE bewerben.<br /><br /><a href="http://www.udk.com/">Unreal Developer Kit Download</a><br /><br /><a href="http://mycryengine.com/">CryENGINE 3 Bewerbung</a>http://blog.jenskonerow.de/blog/Default.aspx?ID=9f5c942f-ab3b-4bd5-9ff2-4ef182d89591Thu, 19 Nov 2009 11:57:54 GMTNeues Buch zum Thema XNA FrameworkSeit langer Zeit ist mein Buch &quot;Spieleentwicklung mit dem Microsoft XNA Framework&quot; angek&#252;ndigt. Oft wurde es aufgrund chronischen Zeitmangels verschoben. Nun kann ich endlich mitteilen, dass das Buch in den Druck gegangen ist. Das hei&#223;t, das Buch wird Ende November bei <a href="http://www.entwicklerpress.de">entwickler.press</a> erh&#228;ltlich sein. Dem Buch liegt keine CD-Rom bei. Stattdessen werden die Beispielprojekte im Laufe dieses Monats online zur Verf&#252;gung stehen. <br /><a href="images/xna_cover.jpg" rel="lightbox" title="Spieleentwicklung mit dem Microsoft XNA Framework"><img class="image" alt="" src="./images/xna_cover.jpg" /></a><br /><br />Selbstverst&#228;ndlich m&#246;chte man nicht die Katze im Sack kaufen, weshalb Sie unter folgendem Link das Inhaltsverzeichnis des Buchs einsehen k&#246;nnen.<br /><br /><a href="./files/XNA_Inhalt.pdf">Entwicklung mit dem Microsoft XNA Framework - Inhaltsverzeichnis</a><br /><br />Wie immer begr&#252;&#223;e ich Hinweise auf Fehler und sonstige Kritik. Letzteres wird selbstverst&#228;ndlich in einer evtl. 2. Auflage, sofern m&#246;glich, ber&#252;cksichtigt.http://blog.jenskonerow.de/blog/Default.aspx?ID=a0f05b86-41b9-43bf-9583-d27372585a46Mon, 09 Nov 2009 09:23:00 GMTFeature LevelsDie Entwicklung von Computerspielen f&#252;r Personal Computer gestaltet sich schwieriger als die Entwicklung f&#252;r Konsolen, denn herrk&#246;mmliche Computer variieren sehr stark in deren Hard- und Softwareausstattung. W&#228;hrend bei Konsolen die F&#228;higkeiten der Grafikkarte bekannt sind, muss beim PC immer abgefragt werden, welche Features die Grafikkarte unterst&#252;tzt. Infolgedessen bedarf es diverser Codepfade, um Effekte abgeschw&#228;cht auf &#228;lterer Hardware auszuf&#252;hren oder ganz zu deaktivieren. <br />Unter DirectX 9 fragen Sie die F&#228;higkeiten der Grafikkarte &#252;ber die CAPS (Capabilities) ab. Das DirectX SDK enth&#228;lt eine vollst&#228;ndige Auflistung aller CAPS. Ausgedruckt bringt es die Liste auf mehrere A4-Bl&#228;tter. Um jener Komplexit&#228;t Herr zu werden, f&#252;hrte Microsoft mit DirectX 10.1 die sog. Feature Levels ein. Unter DirectX 11 existieren sechs Feature Levels, die die CAPS gruppieren. <br /><ul><li>Feature Level 11.0</li><li>Feature Level 10.1</li><li>Feature Level 10.0</li><li>Feature Level 9.3</li><li>Feature Level 9.2</li><li>Feature Level 9.1</li></ul><br />In obiger Auflistung, von oben nach unten gesehen, repr&#228;sentiert jedes Feature Level ein Superset der darunterliegenden Ebene. Jetzt stellt sich die Frage, welchen Sinn die Feature Levels haben? Haupts&#228;chlich sollen die Feature Levels die Entwicklung vereinfachen, indem die vielen Permutationen der CAPS in den Griff zu kriegen. Statt unz&#228;hliger CAPS gibt es nun eben maximal sechs Feature Levels die die F&#228;higkeiten der Grafikkarte beschreiben. Dar&#252;berhinaus vereinfachen die Feature Levels die Verwendung des API, denn Sie k&#246;nnen ebenso ein Direct3D 11 Device auf Basis von Direct3D 9 Hardware erzeugen (gleiches gilt f&#252;r ein Direct3D 10.1 Device auf Basis von Direct3D Hardware).<br />Das Feature Level 9.1 umfasst beispielsweise das Shader Model 2.0. Feature Level 9.2 beinhaltet alle Funktionen aus dem Feature Level 9.1. Dar&#252;berhinaus unterst&#252;tzt das Feature Level 9.2 u.a. vier simultane Render Targets. Ab Feature Level 9.3 steht zum Beispiel das Shader Model 3.0 zur Verf&#252;gung. <br />W&#228;hrend bei Direct3D 10.1 beispielsweise f&#252;r jedes Feature Level versucht werden muss ein Device zu erzeugen, gen&#252;gt bei Direct3D 11 die Erzeugung des Device. Auf welchem Feature Level das Device basiert, gibt die D3D11CreateDevice()-Funktion zur&#252;ck.<br />Folgendes Beispiel demonstriert die Vorgehensweise beim Erzeugen eines Direct3D 10.1 Devices.<div class="code"><span style="color:#0000FF">const</span> D3D10_FEATURE_LEVEL1 pFeatureLevels[] =<br />{<br />&nbsp;&nbsp;D3D10_FEATURE_LEVEL_10_1,<br />&nbsp;&nbsp;D3D10_FEATURE_LEVEL_10_0,<br />&nbsp;&nbsp;D3D10_FEATURE_LEVEL_9_3,<br />&nbsp;&nbsp;D3D10_FEATURE_LEVEL_9_2,<br />&nbsp;&nbsp;D3D10_FEATURE_LEVEL_9_1,<br />};<br /><br /><span style="color:#0000FF">const</span> D3D10_DRIVER_TYPE pDriverTypes[] =<br />{<br />&nbsp;&nbsp;D3D10_DRIVER_TYPE_HARDWARE,<br />&nbsp;&nbsp;D3D10_DRIVER_TYPE_WARP,<br />&nbsp;&nbsp;D3D10_DRIVER_TYPE_REFERENCE,<br />};<br /><br /><span style="color:#0000FF">const</span> UINT iDriverCount = sizeof(pDriverTypes) / <br />&nbsp;&nbsp;sizeof(pDriverTypes[0]);<br /><span style="color:#0000FF">const</span> UINT iFeatureCount = sizeof(pFeatureLevels) / <br />&nbsp;&nbsp;sizeof(pFeatureLevels[0]);<br /><br /><span style="color:#0000FF">for</span>(UINT iDriverType = 0; iDriverType &lt; iDriverCount; <br />&nbsp;&nbsp;iDriverType++)<br />&nbsp;&nbsp;<span style="color:#0000FF">for</span>(UINT iFeatureLevel = 0; iFeatureLevel &lt; iFeatureCount; <br />&nbsp;&nbsp;&nbsp;&nbsp;iFeatureLevel++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hResult = D3D10CreateDevice1(pAdapter, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDriverTypes[iDriverType], NULL, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3D10_CREATE_DEVICE_BGRA_SUPPORT, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pFeatureLevels[iFeatureLevel], <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3D10_1_SDK_VERSION, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;_pD3D10Device);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF">if</span>(SUCCEEDED(hResult))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF">return</span> S_OK;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div>Unter Direct3D 11 wurde der Vorgang vereinfacht. Hier bedarf es lediglich der Iteration aller Device Types, bis schlie&#223;lich ein Device erzeugt werden konnte.<div class="code"><span style="color:#0000FF">const</span> D3D_FEATURE_LEVEL pFeatureLevels[] =<br />{<br />&nbsp;&nbsp;D3D_FEATURE_LEVEL_11_0,<br />&nbsp;&nbsp;D3D_FEATURE_LEVEL_10_1,<br />&nbsp;&nbsp;D3D_FEATURE_LEVEL_10_0,<br />&nbsp;&nbsp;D3D_FEATURE_LEVEL_9_3,<br />&nbsp;&nbsp;D3D_FEATURE_LEVEL_9_2,<br />&nbsp;&nbsp;D3D_FEATURE_LEVEL_9_1,<br />};<br /><br /><span style="color:#0000FF">const</span> D3D_DRIVER_TYPE pDriverTypes[] =<br />{<br />&nbsp;&nbsp;D3D_DRIVER_TYPE_HARDWARE,<br />&nbsp;&nbsp;D3D_DRIVER_TYPE_WARP,<br />&nbsp;&nbsp;D3D_DRIVER_TYPE_REFERENCE,<br />};<br /><br /><span style="color:#0000FF">const</span> UINT iDriverCount = sizeof(pDriverTypes) / <br />&nbsp;&nbsp;sizeof(pDriverTypes[0]);<br /><span style="color:#0000FF">const</span> UINT iFeatureCount = sizeof(pFeatureLevels) / <br />&nbsp;&nbsp;sizeof(pFeatureLevels[0]);<br /><br /><span style="color:#0000FF">for</span>(UINT iDriverType = 0; iDriverType &lt; iDriverCount; <br />&nbsp;&nbsp;iDriverType++)<br />{<br />&nbsp;&nbsp;hResult = D3D11CreateDeviceAndSwapChain(NULL, <br />&nbsp;&nbsp;&nbsp;&nbsp;pDriverTypes[iDriverType], NULL, <br />&nbsp;&nbsp;&nbsp;&nbsp;D3D11_CREATE_DEVICE_DEBUG | <br />&nbsp;&nbsp;&nbsp;&nbsp;D3D11_CREATE_DEVICE_BGRA_SUPPORT, <br />&nbsp;&nbsp;&nbsp;&nbsp;pFeatureLevels, <br />&nbsp;&nbsp;&nbsp;&nbsp;iFeatureCount,<br />&nbsp;&nbsp;&nbsp;&nbsp;D3D11_SDK_VERSION, <br />&nbsp;&nbsp;&nbsp;&nbsp;&amp;_GraphicsDeviceManager.SwapChainDesc, <br />&nbsp;&nbsp;&nbsp;&nbsp;&amp;_GraphicsDeviceManager.SwapChain, <br />&nbsp;&nbsp;&nbsp;&nbsp;&amp;_GraphicsDeviceManager.GraphicsDevice,<br />&nbsp;&nbsp;&nbsp;&nbsp;&amp;_GraphicsDeviceManager.FeatureLevel, <br />&nbsp;&nbsp;&nbsp;&nbsp;&amp;_GraphicsDeviceManager.DeviceContext);<br />}</div>http://blog.jenskonerow.de/blog/Default.aspx?ID=13184fd5-7e0b-4703-9f8a-8fcf06b9bc65Sun, 08 Nov 2009 13:43:00 GMTBlog reloadedLange Zeit war sowohl meine Internetseite als auch mein Blog aufgrund technischer Schwierigkeiten offline. Umso gl&#252;cklicher bin ich, Ihnen mein neuen Blog nun pr&#228;sentieren zu koennen. Die Arbeiten an der Seite sind noch nicht vollst&#228;ndig abgeschlossen, weshalb es in n&#228;chster Zeit unter Umst&#228;nden zu kurzfristigen Aussetzern kommen kann. Feedback zum Blog ist selbstverst&#228;ndlich willkommen!http://blog.jenskonerow.de/blog/Default.aspx?ID=5c489a2b-2df8-423d-9ae8-9f4357b8f677Tue, 27 Oct 2009 19:33:03 GMTEffect Pools im XNA FrameworkIn der Regel verwenden Computerspiele unz&#228;hlige Effekte. Dabei besitzen fast alle Effekte mindestens eine Hand voll gleicher Parameter (globale Variablen). Ein gutes Beispiel sind die Sicht- und Projektionsmatrizen. Die Anwendung muss nun f&#252;r jeden Effekt dieselben Daten immer und immer wieder zuweisen. <br />Dem Problem begegnet man mit sog. Effect Pools. Alle Effekte die einem Effect Pool angeh&#246;ren k&#246;nnen auf gemeinsam verwendete Variablen zugreifen. Als Konsequenz muss man nur noch einem Effekt die entsprechenden Parameter-Werte zuweisen und alle anderen Effekte &#252;bernehmen die Daten ebenfalls. Wenn man nun die Effekte &#252;ber die Content Pipeline l&#228;dt, dann geh&#246;ren diese automatisch einem statischen Effect Pool an. Gemeinsam verwendete Variablen kennzeichnen Sie in der Effekt-Datei mit dem Modifier shared.<div class="code"><span style="color:#0000FF">shared</span> <span style="color:#0000FF">float3</span> LightPosition = 0.0f;</div>Per Default geh&#246;ren alle Effekte, die Sie &#252;ber die Content Pipeline laden also demselben Effect Pool an. Wie aber k&#246;nnen Effekte unterschiedlichen Effect Pools zugewiesen werden? Wirft man einen Blick auf die Konstruktor&#252;berladungen der Effect-Klasse, dann wird man eine Signatur finden, die eine GraphicsDevice-Instanz, den kompilierten Effekt-Code, Compiler-Optionen und einen Effect Pool entgegen nimmt. Jetzt gilt es nur noch den Code des kompilierten Effekts zu ermitteln. Hierf&#252;r wird ein neuer Content Processor entwickelt, der das Resultat des Effect Importers entgegen nimmt, den Effekt kompiliert und den Code als byte-Array zur&#252;ckgibt.<div class="code">[ContentProcessor(DisplayName = &quot;Plain Effect Processor&quot;)]<br /><span style="color:#0000FF">public</span> class PlainEffectProcessor : ContentProcessor<br />{<br />&nbsp;&nbsp;<span style="color:#0000FF">public</span> override <span style="color:#0000FF">byte</span>[] Process(<br />&nbsp;&nbsp;&nbsp;&nbsp;EffectContent input, ContentProcessorContext context)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;CompiledEffect oEffect = context.Convert(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input, &quot;EffectProcessor&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF">return</span> oEffect.GetEffectCode();<br />&nbsp;&nbsp;}<br />}</div>Zur Laufzeit laden Sie das byte-Array und erzeugen eine neue Effect-Instanz:<div class="code">m_oEffectPool = <span style="color:#0000FF">new</span> EffectPool();<br /><br /><span style="color:#0000FF">byte</span>[] oCompiledEffect = <span style="color:#0000FF">this</span>.Content.Load(&quot;Effect1&quot;);<br />m_oEffect1 = <span style="color:#0000FF">new</span> Effect(<span style="color:#0000FF">this</span>.GraphicsDevice, oCompiledEffect, CompilerOptions.None, m_oEffectPool); </div>http://blog.jenskonerow.de/blog/Default.aspx?ID=93c924a4-77fe-4c01-b6f3-68cf1fc0aa16Wed, 15 Jul 2009 15:35:00 GMTXNA Game Studio 3.1 ist erschienenEs ist soweit, Microsoft geht mit dem XNA Game Studio 3.1 in die f&#252;nfte Runde. Mit der neuen Version k&#246;nnen Sie Avatars rendern und animieren. Es existiert eine M&#246;glichkeit die Sprachkommunikation zu erhalten, auch wenn der Freund einen anderen Titel spielt. Au&#223;erdem wurde das XNA Framework um eine Videoplayback-Funktionalit&#228;t erweitert, damit Logos oder sonstige Inhalte dargestellt werden k&#246;nnen. Eine genaue Beschreibung der neuen Features ist in der Dokumentation des XNA Game Studio 3.1 oder alternativ auf der Website des Creators Club zu finden.<br /><br /><a href="http://creators.xna.com">XNA Game Studio 3.1</a>http://blog.jenskonerow.de/blog/Default.aspx?ID=c500c992-6a41-47fd-81e5-89f26a8efb5bFri, 12 Jun 2009 13:11:00 GMTKamerawackeln als Post Processing EffectJeder aktuelle Spieletitel setzt Post Processing Effects ein, um dem Spiel eine gewisse Note zu verleihen oder besonders spektakul&#228;re Spezialeffekte umzusetzen. Allerdings muss ein derartiger Effekt nicht immer sehr aufw&#228;ndig sein, um dem Spiel zu einem besseren &quot;Feeling&quot; zu verhelfen. Ein Kamerawackler, der zum Beispiel eingesetzt werden kann, wenn der eigene Panzer getroffen wurde unterst&#252;tzt die Action eines Spiels. Ein Kamerawackeln l&#228;sst sich sehr leicht als Post Processing Effect realisieren. <br /><br />Zur Realisierung des Effekts muss die Szene in einem Render Target vorliegen, dass wir als Textur an einen Shader geben k&#246;nnen. Der Pixel Shader macht nichts anderes, als die Texturkoordinaten zu verzerren, so dass die komplette Szene auf einer Ellipse bewegt wird. Die Translation muss nur schnell genug stattfinden, damit die Verzerrung als Kamerawackeln erscheint. Wie folgt sieht der Pixel Shader aus:<div class="code"><span style="color:#0000FF">float</span> fTime;<br /><br /><span style="color:#0000FF">uniform</span> <span style="color:#0000FF">extern</span> <span style="color:#0000FF">texture</span> ScreenTexture;<br /><span style="color:#0000FF">sampler</span> ScreenS = sampler_state<br />{<br />Texture = &lt;ScreenTexture&gt;;<br />};<br /><br /><span style="color:#0000FF">float4</span> PixelShaderFunction(<span style="color:#0000FF">float2</span> oTexCoord : TEXCOORD0) : COLOR0<br />{<br />&nbsp;&nbsp;<span style="color:#0000FF">return</span> <span style="color:#0000FF">tex2D</span>(ScreenS, <br />&nbsp;&nbsp;&nbsp;&nbsp;oTexCoord + <span style="color:#0000FF">float2</span>(cos(fTime * 1000.0f) * 0.01f, <br />&nbsp;&nbsp;&nbsp;&nbsp;sin(1.0f + (1.5f - fTime) * 1000.0f) * 0.0005f) * fTime);<br />}</div>Der Pixel Shader addiert zu den Texturkoordinaten einen zweiten Vektor. Jener Vektor errechnet sich aus der Kosinus- und Sinusfunktion, um eine Kreisbewegung zu erzeugen. Die Variable fTime wird von der Anwendung hereingegeben und geht gegen 0. Somit nimmt das Kamerawackeln gegen Ende stetig ab. Da die Zeit in Sekunden angegeben wird, skaliert der Pixel Shader die Zeit mit einem Faktor von 1000. Die Ellipse entsteht dadurch, dass die Kosinus- und Sinusfunktion unterschiedlich skaliert wird. <br />Die Technique sieht folgenderma&#223;en aus:<div class="code"><span style="color:#0000FF">technique</span><br />{<br />&nbsp;&nbsp;<span style="color:#0000FF">pass</span> P0<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;PixelShader = <span style="color:#0000FF">compile</span> ps_2_0 PixelShaderFunction);<br />&nbsp;&nbsp;}<br />}</div>Die Szene wird mit einem BasicEffect-Objekt gerendert:<div class="code">oSpriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.None);<br />oEffect.Parameters[&quot;fTime&quot;].SetValue(m_fTime);<br /><br />oEffect.Begin();<br />oEffect.CurrentTechnique.Passes[0].Begin();<br />oSprite.Draw(oTexture, <span style="color:#0000FF">new</span> Rectangle(0, 0, <br />&nbsp;&nbsp;<span style="color:#0000FF">this</span>.GraphicsDevice.Viewport.Width, <br />&nbsp;&nbsp;<span style="color:#0000FF">this</span>.GraphicsDevice.Viewport.Height), Color.White);<br />oSprite.End();<br /><br />oEffect.CurrentTechnique.Passes[0].End();<br />oEffect.End();</div>Im n&#228;chsten Blogeintrag werden wir uns dann einer kleinen Druckwelle f&#252;r zweidimensionale Spiele widmen. Diese kann ebenfalls mit einer Sinusfunktion realisiert werden und erweckt dennoch Eindruck beim Benutzer.http://blog.jenskonerow.de/blog/Default.aspx?ID=cb0056e2-1445-43a9-a406-068845314cadTue, 26 May 2009 17:57:00 GMTClip DistancesIn vielen Situationen, zum Beispiel beim Rendern von Wasseroberfl&#228;chen, m&#252;ssen diverse Objekte in der virtuellen Welt geclippt werden. Beispielsweise wird Clipping eingesetzt, wenn Sie die Umgebung rendern, die in der Wasserspiegelung sichtbar ist. Die Geometrie unterhalb der Wasseroberfl&#228;che ist f&#252;r die Reflektion irrelevant.<br /><br />In &#228;lteren DirectX-Versionen kommen Clip Planes zum Einsatz, um Geometrie ober- oder unterhalb dieser Ebene zu entfernen. Clip Planes waren Bestandteil der Fixed Function Pipeline. Demzufolge ist diese Technik dem Rotstift verfallen. In DirectX 10 existieren Clip Distances. Vertex oder Geometry Shader weisen einer Ausgabe die Semantik SV_ClipDistance[n] zu, wobei n entweder 0 oder 1 ist.<br /><br />F&#252;r jeden Vertex berechnen Sie einen Wert, den die Grafikkarte &#252;ber die Primitive hinweg interpoliert. Alle Pixel, deren „Distanz“ unter 0 liegt werden verworfen. Clip Planes simulieren Sie mit folgender Ebenengleichung:<br /><br />Ax + By + Cz + D = 0<br /><br />Die Koeffizienten A, B und C repr&#228;sentieren die Normale der Clip Plane. D ist die Distanz von der Ebene zum Koordinatenursprung, sprich: Zum Beispiel die H&#246;he des Wasserspiegels. Wenn Sie die Schnittebene in Weltkoordinaten definieren, dann m&#252;ssen Sie die Vertices vorher ebenfalls in Weltkoordinaten &#252;berf&#252;hren, bevor Sie die Komponenten x, y und z in die Gleichung einsetzen. Insgesamt bringt ein Register der Grafikkarte bis zu vier float-Werte unter. Demnach d&#252;rfen Sie bis zu acht Kriterien mit den Clip Distances angeben. <br /><br />Um Clip Distances zu verwenden, definierten Sie f&#252;r die Vertex Shader-Ausgabe eine Struktur wie folgende:<div class="code"><span style="color:#0000FF">struct</span> VertexShaderOutput<br />{<br />&nbsp;&nbsp;//...<br />&nbsp;&nbsp;<span style="color:#0000FF">float</span> Distance : SV_ClipDistance0;<br />};</div>Der Vertex Shader selbst, kann beispielsweise wie folgt aussehen. Hierbei gilt es zu beachten, dass die Ebene in Weltkoordinaten spezifiziert wird.<div class="code">VertexShaderOutput VS_TerrainWithClipping(VertexShaderInput oInput)<br />{<br />&nbsp;&nbsp;VertexShaderOutput oOutput = (VertexShaderOutput)0;<br />&nbsp;&nbsp;<span style="color:#0000FF">float4</span> oPosition = <span style="color:#0000FF">mul</span>(oInput.Position, World);<br />&nbsp;&nbsp;oOutput.Distance = ClipPlaneNormal.x * oPosition.x + ClipPlaneNormal.y * <br />&nbsp;&nbsp;&nbsp;&nbsp;oPosition.y + ClipPlaneNormal.z * oPosition.z + Distance;<br /><br /><span style="color:#0000FF">return</span> oOutput;<br />}</div>Den Vektor ClipPlaneNormal und die Distanz &#252;bergibt die Anwendung dem Shader. http://blog.jenskonerow.de/blog/Default.aspx?ID=d5307184-ce5e-442e-afe6-57fb7cdbb74aSat, 14 Mar 2009 11:24:00 GMT