タイトルのD3DはMicrosoft.DirectX.Direct3D名前空間です。文字数が50文字なので入らなくて(汗
Public Class DirectGraphicsManager
Implements System.IDisposable
Private presentparameters As New Microsoft.DirectX.Direct3D.PresentParameters
Private Direct3DDevice As Microsoft.DirectX.Direct3D.Device
Private VertexBuffer As Microsoft.DirectX.Direct3D.VertexBuffer
Private stm As Microsoft.DirectX.GraphicsStream
Private disposed As Boolean
Private MyForm As System.Windows.Forms.Form
Private SpriteTexture As Microsoft.DirectX.Direct3D.Texture
Private Sprite As Microsoft.DirectX.Direct3D.Sprite
'// For Debug
Private verts(4) As Microsoft.DirectX.Direct3D.CustomVertex.PositionTextured
Private vertsList As New System.Collections.Generic.List(Of Microsoft.DirectX.Direct3D.CustomVertex.PositionTextured)
Sub New(ByVal parameterForm As System.Windows.Forms.Form)
MyForm = parameterForm
CreateDevice()
End Sub
Sub New()
MyForm = New System.Windows.Forms.Form
MyForm.ClientSize = New System.Drawing.Size(800, 600)
CreateDevice()
Sprite = New Microsoft.DirectX.Direct3D.Sprite(Direct3DDevice)
End Sub
Function CreateDevice() As Boolean
presentparameters.Windowed = True
presentparameters.EnableAutoDepthStencil = True
presentparameters.AutoDepthStencilFormat = Microsoft.DirectX.Direct3D.DepthFormat.D16
presentparameters.SwapEffect = Microsoft.DirectX.Direct3D.SwapEffect.Discard
presentparameters.PresentationInterval = Microsoft.DirectX.Direct3D.PresentInterval.Immediate
presentparameters.BackBufferWidth = 0
presentparameters.BackBufferHeight = 0
presentparameters.DeviceWindowHandle = MyForm.Handle
presentparameters.DeviceWindow = MyForm
MyForm.Show()
'デバイスを作成
'Try
Direct3DDevice = New Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, MyForm, Microsoft.DirectX.Direct3D.CreateFlags.SoftwareVertexProcessing, presentparameters)
System.Console.WriteLine("デバイス生成に成功しました")
VertexBuffer = New Microsoft.DirectX.Direct3D.VertexBuffer(GetType(Microsoft.DirectX.Direct3D.CustomVertex.PositionTextured), 600, Direct3DDevice, 0, Microsoft.DirectX.Direct3D.CustomVertex.PositionTextured.Format, Microsoft.DirectX.Direct3D.Pool.Managed)
''Catch ex As Microsoft.DirectX.Direct3D.DeviceLostException 'デバイスが消失しましたが、現時点ではリセットできません。したがって、レンダリングできません。
'Catch ex As Microsoft.DirectX.Direct3D.DeviceNotResetException 'デバイスが消失しましたが、現時点でリセットできます。
'Catch ex As Microsoft.DirectX.Direct3D.DriverInternalErrorException '内部ドライバ エラー。このエラーを受け取った場合、一般に、アプリケーションはシャットダウンする必要があります。
'Catch ex As Microsoft.DirectX.Direct3D.DriverInvalidCallException 'ドライバは、現在のメソッドの呼び出しが無効であることを報告します。
'Catch ex As Microsoft.DirectX.Direct3D.InvalidCallException 'メソッドの呼び出しが無効です。
'Catch ex As Microsoft.DirectX.Direct3D.InvalidDeviceException '要求されたデバイスの種類が無効です。
'Finally
'End Try
SpriteTexture = Microsoft.DirectX.Direct3D.TextureLoader.FromFile(Direct3DDevice, "C:hoge.png")
Do
Try
Direct3DDevice.Clear(Microsoft.DirectX.Direct3D.ClearFlags.Target Or Microsoft.DirectX.Direct3D.ClearFlags.ZBuffer, System.Drawing.Color.DarkBlue, 1.0F, 0)
Direct3DDevice.Transform.View = Microsoft.DirectX.Matrix.LookAtLH(New Microsoft.DirectX.Vector3(0.0F, 0.0F, -5.0F), New Microsoft.DirectX.Vector3(0.0F, 0.0F, 0.0F), New Microsoft.DirectX.Vector3(0.0F, 1.0F, 0.0F))
Direct3DDevice.Transform.Projection = Microsoft.DirectX.Matrix.PerspectiveFovLH(System.Math.PI / 4.0, Single.Parse(MyForm.ClientSize.Width.ToString(System.Globalization.CultureInfo.InvariantCulture), System.Globalization.CultureInfo.InvariantCulture) / Single.Parse(MyForm.ClientSize.Height.ToString(System.Globalization.CultureInfo.InvariantCulture), System.Globalization.CultureInfo.InvariantCulture), 3.0F, 15.0F)
Direct3DDevice.RenderState.CullMode = Microsoft.DirectX.Direct3D.Cull.None
Direct3DDevice.RenderState.Lighting = True
' stm = VertexBuffer.Lock(0, 0, 0)
'頂点データをバッファに書き込み
' stm.Write(vertsList.ToArray)
'バッファのロックを解除
' VertexBuffer.Unlock()
System.Windows.Forms.Application.DoEvents()
'System.Diagnostics.Debugger.Break()
Direct3DDevice.BeginScene()
Direct3DDevice.SetStreamSource(0, VertexBuffer, 0)
Direct3DDevice.VertexFormat = Microsoft.DirectX.Direct3D.CustomVertex.TransformedColored.Format
Direct3DDevice.DrawPrimitives(Microsoft.DirectX.Direct3D.PrimitiveType.TriangleList, 0, CInt(vertsList.Count / 3))
System.Windows.Forms.Application.DoEvents()
'//スプライト描画
Sprite.Begin(Microsoft.DirectX.Direct3D.SpriteFlags.None)
Sprite.Draw2D(SpriteTexture, New System.Drawing.Rectangle(32, 64, 32, 64), New System.Drawing.SizeF(32, 64), New System.Drawing.PointF(0, 0), 0, New System.Drawing.PointF(20, 20), System.Drawing.Color.White.ToArgb())
Sprite.End()
Direct3DDevice.EndScene()
System.Windows.Forms.Application.DoEvents()
vertsList.Clear()
'// For Retail
System.Windows.Forms.Application.DoEvents()
System.Windows.Forms.Application.DoEvents()
System.Windows.Forms.Application.DoEvents()
System.Windows.Forms.Application.DoEvents()
System.Windows.Forms.Application.DoEvents()
Direct3DDevice.Present()
Catch ex As Microsoft.DirectX.Direct3D.DeviceLostException 'デバイスが消失しましたが、現時点ではリセットできません。したがって、レンダリングできません。
'
System.Threading.Thread.Sleep(10)
Direct3DDevice.Reset(presentparameters)
Catch ex As Microsoft.DirectX.Direct3D.DeviceNotResetException 'デバイスが消失しましたが、現時点でリセットできます。
'
Direct3DDevice.Reset(presentparameters)
'
End Try
Loop
Return True
End Function
'// Microsoftのサイトのどこかからまるっとコピーしたもの
Public Overloads Sub Dispose() Implements System.IDisposable.Dispose
Me.Dispose(True)
' This object will be cleaned up by the Dispose method.
' Therefore, you should call GC.SupressFinalize to
' take this object off the finalization queue
' and prevent finalization code for this object
' from executing a second time.
System.GC.SuppressFinalize(Me)
End Sub
' Dispose(bool disposing) executes in two distinct scenarios.
' If disposing equals true, the method has been called directly
' or indirectly by a user's code. Managed and unmanaged resources
' can be disposed.
' If disposing equals false, the method has been called by the
' runtime from inside the finalizer and you should not reference
' other objects. Only unmanaged resources can be disposed.
Private Overloads Sub Dispose(ByVal disposing As Boolean)
' Check to see if Dispose has already been called.
If Not Me.disposed Then
' If disposing equals true, dispose all managed
' and unmanaged resources.
If disposing Then
' Dispose managed resources.
Direct3DDevice.Dispose()
MyForm.Dispose()
VertexBuffer.Dispose()
End If
' Call the appropriate methods to clean up
' unmanaged resources here.
' If disposing is false,
' only the following code is executed.
End If
disposed = True
End Sub
End Class
なんて打っていたわけなんだが。
Microsoft.DirectX.Direct3D.TextureLoader.FromFile
で読み込んでいるC:hoge.pngってGIMPやPaint.NETなどで128px * 192px(どこぞで配布していたRPGツクール用キャラ画像データ。32px * 48pxの物が4*4並んだ画像)って認識されているんですが
Sprite.Draw2DでNew System.Drawing.Rectangle(32, 48, 32, 48)だとなぜかうまく行かず、手当たり次第に打ってみたNew System.Drawing.Rectangle(32, 64, 32, 64)だとうまくいくんだよなー。
激しく納得がいかなくて悩み中。