開始遷移到託管DirectX SlimDX框架的,例如,MDX應用的帕特里克Murrisa地形的瀏覽器。php
在託管DirectX代碼所示,到新的代碼,與SlimDX評論的形式。瀏覽器
下載並安裝「 2010年2月SlimDX SDK(微星)。 「。
添加一個引用到項目中。NET庫「C:\ Program Files文件\ SlimDX SDK(2010年2月)\ BIN \ X86 \ SlimDX.dll。 若是你添加了一個連接的添加引用對話框中,不經過標籤「。NET」和一個「瀏覽」,而後選擇「連接屬性複製到本機 - >真實而具體的版本 - >真實的。框架
/ /使用Microsoft.DirectX.Direct3D; / /使用Microsoft.DirectX的; / /使用Microsoft.DirectX.DirectInput; 使用SlimDX; 使用SlimDX.Direct3D9; 使用鍵= SlimDX.DirectInput.Key; 使用KeyboardState = SlimDX.DirectInput.KeyboardState; 使用鍵盤時,SlimDX.DirectInput.Keyboard; 採用的DirectInput = SlimDX.DirectInput.DirectInput;
爲何不直接使用使用SlimDX.DirectInput,? 能夠,但隨後會發生衝突,有一流的設備,這是在兩個命名空間。oop
/ /私有Microsoft.DirectX.Direct3D.Device _device; / /私有Microsoft.DirectX.DirectInput.Device _Keyboard,; / /的私人Microsoft.DirectX.Direct3D.Font _font; 專用設備_device; 私人的Direct3D _direct3d; 私人FilterCaps _textureFilterCaps; 私人DirectInput的_directInput; 私人鍵盤_keyb; 私人SlimDX.Direct3D9.Font _font;
只顯示須要轉換的代碼。字體
/ /建立設備 PresentParameters presentParams =的新PresentParameters(); / / PresentParams.AutoDepthStencilFormat的= DepthFormat.D16; / /設備新設備(0,DeviceType.Hardware,的,CreateFlags.HardwareVertexProcessing,presentParams); presentParams.AutoDepthStencilFormat = Format.D16; _direct3d新的Direct3D(); _device新的設備(_direct3d,0,DeviceType.Hardware,this.Handle,CreateFlags.HardwareVertexProcessing,presentParams);
/ / Device.DeviceReset的+ =的EventHandler(OnDeviceReset)的; / / Device.DeviceResizing的+ =:新CancelEventHandler(OnDeviceResizing);
相似物目前還沒有發現 ui
簡單類型:this
/ /渲染設置 / / Device.RenderState.ZBufferEnable的= TRUE; / / Device.RenderState.Ambient的ambientColor; / / Device.RenderState.FogStart的mapWidth == 0? 60:(浮動)mapWidth「/ 8; device.SetRenderState(RenderState.ZEnable,TRUE); / / BOOL device.SetRenderState(RenderState.Ambient,ambientColor.ToArgb()); / / int(COLOR4類型數據) device.SetRenderState(RenderState.FogStart,mapWidth == 0×60:(浮動)mapWidth / 8); / / INT
等等.net
類型的參數:線程
/ / Device.RenderState.FillMode的FillMode.Solid; / / Device.RenderState.CullMode的Cull.CounterClockwise; / / Device.RenderState.SourceBlend的Blend.SourceAlpha; / / Device.RenderState.FogTableMode的FogMode.Linear; device.SetRenderState (RenderState.FillMode,FillMode.Solid); device.SetRenderState (RenderState.CullMode,Cull.Counterclockwise); device.SetRenderState (RenderState.SourceBlend,Blend.SourceAlpha); device.SetRenderState (RenderState.FogTableMode,FogMode.Linear);
/ /紋理過濾 / / Device.SamplerState [0]。MinFilter = TextureFilter.Anisotropic; / / Device.SamplerState [0]。(MagFilter = TextureFilter.Linear); / / Device.SamplerState [0]。AddressU = TextureAddress.Clamp; / / Device.SamplerState [0]。AddressV = TextureAddress.Clamp; device.SetSamplerState(0,SamplerState.MinFilter,TextureFilter.Anisotropic); device.SetSamplerState(0,SamplerState.MagFilter,TextureFilter.Linear); device.SetSamplerState(0,SamplerState.AddressU,TextureAddress.Clamp); device.SetSamplerState(0,SamplerState.AddressV,TextureAddress.Clamp); / /紋理階段狀態。 / / Device.TextureState的[0]。ColorArgument2 = TextureArgument.Diffuse; / / Device.TextureState的[0]。AlphaArgument1 = TextureArgument.TextureColor; / / Device.TextureState的[0]。ColorOperation = TextureOperation.Modulate; / / Device.TextureState的[0]。AlphaOperation = TextureOperation.SelectArg1; ·device.SetTextureStageState(0,TextureStage.ColorArg2的,TextureArgument.Diffuse); device.SetTextureStageState(0,TextureStage.AlphaArg1,TextureArgument.Texture); device.SetTextureStageState(0,TextureStage.ColorOperation,TextureOperation.Modulate); device.SetTextureStageState(0,TextureStage.AlphaOperation型,TextureOperation.SelectArg1);
全部類型的檢查:設計
/ /檢查硬件頂點處理和純設備。 / /若是(device.DeviceCaps.TextureFilterCaps.SupportsMinifyAnisotropic的)... / /若是(device.DeviceCaps.TextureFilterCaps.SupportsMinifyLinear的)... / /若是(device.DeviceCaps.TextureFilterCaps.SupportsMagnifyAnisotropic的)... / /若是(device.DeviceCaps.TextureFilterCaps.SupportsMagnifyLinear的)...
切換到這樣的設計:
的能力deviceCaps = _direct3d.GetDeviceCaps(0,DeviceType.Hardware); FilterCaps textureFilterCaps deviceCaps.TextureFilterCaps; 若是((textureFilterCaps FilterCaps.MinAnisotropic)= 0)... 若是((textureFilterCaps FilterCaps.MinLinear)= 0)... 若是((textureFilterCaps FilterCaps.MagAnisotropic)= 0)... 若是((textureFilterCaps FilterCaps.MagLinear)= 0)...
顏色 - > SlimDX.Color4 / / Material.SpecularSharpness = 30.0f; / /薄亮點(小=大) material.Power = 30.0f; / /薄亮點(小=大)
/ /三維向量射線Vector3.Empty; 三維向量射線Vector3.Zero;
三維向量p1的=新的三維向量(的x,y,的MinZ); ... / / P1.Unproject(device.Viewport,device.Transform.Projection,device.Transform.View,device.Transform.World);
這條線的設計:
漂浮的MinZ = device.Viewport.MinZ; 浮動maxZ = device.Viewport.MaxZ; 寬度= device.Viewport.Width; 高度= device.Viewport.Height; VX = device.Viewport.X; 詮釋VY = device.Viewport.Y; 矩陣worldViewProjection:= device.GetTransform(TransformState.Projection)* device.GetTransform(TransformState.View)* device.GetTransform(TransformState.World); P1 = Vector3.Unproject(P1,VX,VY,寬度,高度的MinZ,maxZ,worldViewProjection);
/ / Ray.Scale的((浮動)U); 射線Vector3.Multiply(射線,(浮動)U);
三維向量POS =新的三維向量(); 和矩陣lightTrans = Matrix.Identity; ... / / Pos.TransformCoordinate的(lightTrans); POS = Vector3.TransformCoordinate(POS,lightTrans);
/ /燈光設置 私人無效LightSetup() { / /使用白色,定向光 / / Device.Lights [0]。漫= Color.White; / / Device.Lights [0]。鏡面= Color.FromArgb(0X80,0X80,0X80)/ /軟亮點 / / Device.Lights [0]。類型= LightType.Directional; 燈光燈(); light.Diffuse新Color4(Color.White); light.Specular =的新Color4(0.5F,0.5F,0.5F); / /軟亮點 light.Type = LightType.Directional; / / Device.SetLight的(0,光); / /(*** 1) / /計算光線的方向(三維向量名次) ... / / Device.Lights的[0]。方向=-軸位置; / / Device.Lights [0]。更新(); / /不是,更新,使用EnableLight() / / Device.Lights的[0]。啓用= TRUE; light.Direction =-POS; device.SetLight(0亮); / /搬到了這裏(*** 1) device.EnableLight(0,TRUE); ... }
/ /紋理質地TextureLoader.FromFile(設備,文件名); 質感紋理Texture.FromFile(設備,文件名); 質感紋理Texture.FromStream(設備,流); 但這種方法相對應的,直到我找到(建立紋理位圖): / /紋理T =的紋理(設備,B,0,Pool.Managed);
/ /鍵盤KEYB新Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard); / / Keyb.SetCooperativeLevel(這一點,CooperativeLevelFlags.Background CooperativeLevelFlags.NonExclusive); / / Keyb.Acquire的(); _directInput =新SlimDX.DirectInput.DirectInput(); _keyb =新鍵盤(_directInput)的; _keyb.SetCooperativeLevel(這一點,SlimDX.DirectInput.CooperativeLevel.Background | SlimDX.DirectInput.CooperativeLevel.Nonexclusive); _keyb.Acquire();
/ / KeyboardState的的鍵= keyb.GetCurrentKeyboardState(); / / BOOL轉變的=鍵[Key.LeftShift] | |鍵[Key.RightShift]; / / BOOL CTRL =鍵[Key.LeftControl] | |鍵[Key.RightControl];
/ /若是Ctrl鍵(鍵[Key.L] &&!移&&!) (keys.IsPressed(Key.L)&&!轉變&&!CTRL)
/ / _device.Transform.Projection的Matrix.PerspectiveFovLH(FOV的aspectRatio,mapWidth == 0?15F:(浮動)(mapWidth / 30F),mapWidth == 0?5000F:(浮動)(mapWidth * 3)); / / _device.Transform.View的= Matrix.LookAtLH(新的三維向量(0,0區),新的三維向量(0,0,0),新的三維向量(1,0,0)); 矩陣perspectiveFovLH Matrix.PerspectiveFovLH(FOV的aspectRatio,mapWidth == 0?15樓:(浮動)(mapWidth / 30F),mapWidth == 0?5000F:(浮動)(mapWidth * 3)); 和矩陣lookAtLH = Matrix.LookAtLH(新三維向量(0,0區),新的三維向量(0,0,0),新的三維向量(1,0,0)); _device.SetTransform(TransformState.Projection,perspectiveFovLH); _device.SetTransform(TransformState.View,lookAtLH);
/ /網目網(numFaces,numVertices,MeshFlags.Managed,CustomVertex.PositionNormalTextured.Format,設備); 網目=新的網(的設備,numFaces,numVertices,MeshFlags.Managed,CustomVertex.PositionNormalTextured.Format);
很是重要的區別。 在SlimDX,咱們使用線程,和MDX的System.Array。
/ / INT []行列=新的int [1]; / /行列[0] = mesh.NumberVertices / /行列[0] = mesh.VertexCount / / System.Array中ARR = mesh.VertexBuffer.Lock(0, ,LockFlags.None typeof運算(CustomVertex.PositionNormalTextured),職級); / /(Y = startY,Y <=恩迪,Y + +)/ / {/ /(詮釋x = STARTX; X <= endX; X + +)/ / {/ / CustomVertex.PositionNormalTextured PNT新CustomVertex.PositionNormalTextured(); / / ... / / Arr.SetValue的(PNT,vertIndex + +)/ /} / /} / / mesh.VertexBuffer.Unlock(); / /尺寸= sizeof(CustomVertex.PositionNormalTextured)的mesh.VertexCount使用(數據流流= mesh.VertexBuffer。鎖(0,mesh.VertexBuffer.Description.SizeInBytes,LockFlags.None)){CustomVertex.PositionNormalTextured [] ARR =新CustomVertex.PositionNormalTextured [mesh.VertexCount](詮釋y = startY; <= ENDY; Y + +){ (X = startx時,X <= endX,X + +){CustomVertex.PositionNormalTextured PNT =的新CustomVertex.PositionNormalTextured();「... arr.SetValue(PNT,vertIndex + +);}} stream.WriteRange (ARR)的mesh.VertexBuffer.Unlock();}
類是在CUSTOMVERTEX MDX,但不,在SlimDX,因爲在DirectX缺少直接對應的。 這裏不存在一個獨特的解決方案,因此我共享的最終版本。 你只須要建立一個定義良好的結構形式,可是建立一個類CUSTOMVERTEX的 - 你的狀況,我建立的代碼兼容MDX。 內部的內容也能夠實現的結構,以不一樣的方式,載體,或簡單的數據類型。
使用系統; 使用System.Runtime.InteropServices; 使用SlimDX; 使用SlimDX.Direct3D9; 命名空間TerrainViewer { 公共結構CUSTOMVERTEX { / /這句話強制的字節的順序被存儲在GPU的指望數據 [StructLayout(LayoutKind.Sequential)] 的公共結構PositionNormalTextured / / VertexTypePNT { 公衆持股量X; / /位置 公衆持股量Y; / /位置 公衆持股量Z; / /位置 公衆持股量Xn的; / /普通 公衆持股量YN / /正常 公衆持股量的鋅,/ /普通 公衆持股量塗; / /質地位置(德克薩斯州) 公衆持股量電視,/ /紋理的位置(TY) 公共常量VertexFormat格式= VertexFormat.Position | VertexFormat.Normal | VertexFormat.Texture1; / /選項 / /公共的三維向量的位置; / /公共的三維向量正常; / /公共的Vector2 TexturePosition的; / /公共的靜態詮釋SizeBytes的{{返回Marshal.SizeOf(typeof運算(PositionNormalTextured));}} } / /這句話強制的字節的順序被存儲在GPU的指望數據 [StructLayout(LayoutKind.Sequential)] 公共,結構PositionNormalColored / / VertexTypePNT { 公衆持股量X; / /位置 公衆持股量Y; / /位置 公衆持股量Z; / /位置 公衆持股量Xn的; / /普通 公衆持股量YN / /正常 公衆持股量的鋅,/ /普通 公衆詮釋的顏色; / /顏色 公共常量VertexFormat格式= VertexFormat.Position | VertexFormat.Normal | VertexFormat.Diffuse; / /選項 / /公共的三維向量的位置; / /公共的三維向量正常; / /公共COLOR4顏色/ / MDX / /公共的靜態詮釋SizeBytes的{{返回Marshal.SizeOf(typeof運算(PositionNormalColored));}} } } }
/ / / / / /建立一個字體。 / / / / / HTTP :/ / www.gamedev.net/community/forums/topic.asp?topic_id=557531 / /的公共Microsoft.DirectX.Direct3D.Font的CreateFont(字符串原諒我,浮動emSize,System.Drawing.FontStyle風格) 公共SlimDX.Direct3D9.Font的CreateFont(字符串原諒我,浮動emSize,System.Drawing.FontStyle風格) { 嘗試 { FontDescription的描述=新的FontDescription的(); description.FaceName familyName; / / Description.Height的=(int)的(1.9 * emSize的); / / Description.Quality的FontQuality.ClearTypeNatural; 若是(style! = System.Drawing.FontStyle.Regular) { / /若是((風格與System.Drawing.FontStyle.Italic)!= 0)description.IsItalic = TRUE; ((風格與System.Drawing.FontStyle.Italic)!= 0)description.Italic = TRUE; 若是((風格與System.Drawing.FontStyle.Bold)= 0)description.Weight,FontWeight.Heavy; / / Description.Quality的FontQuality.AntiAliased / / MDX description.Quality FontQuality.Antialiased; } / / FONT =新SlimDX.Direct3D9.Font(設備,15,0,FontWeight.Bold,0,假的, / / CharacterSet.Default的,Precision.TrueType,FontQuality.ClearTypeNatural, / / PitchAndFamily.Default的PitchAndFamily.DontCare,「宋體」); 返回新SlimDX.Direct3D9.Font(INT)(設備,(1.9 * emSize),0,FontWeight.Bold,0,假的, CharacterSet.Default,Precision.TrueType,FontQuality.Antialiased, PitchAndFamily.Default PitchAndFamily.DontCare,原諒我); / /返回新Microsoft.DirectX.Direct3D.Font(設備描述); / / MDX / / System.Drawing.Font的F =新System.Drawing.Font(新的FontFamily的(原諒我),emSize); / /返回新SlimDX.Direct3D9.Font的(設備,F); } 抓 { 返回null; } }
/ / Sprite.Begin(SpriteFlags.None); / / Font.DrawText的(雪碧,信息文本,矩形,DrawTextFormat.Left,Color.Black); sprite.Begin(SpriteFlags.AlphaBlend); font.DrawString(雪碧,信息文本,矩形,DrawTextFormat.Left,Color.Black);
原文連接:http://gis4all.ru/zh-CN/net/managed-directx/