Недавно начал учить Managed DirectX и столкнулся с проблемой. Когда я запускаю прогу, куб, вместо того чтобы покрываться текстурой, просто закрашивается в цвет левого верхнего пикселя bmp-файла, из которого я создаю текстуру. В чем моя ошибка?
Public Class Form1
WithEvents device As Device
Dim presentParams As New PresentParameters()
Dim tex As Texture
Dim mesh As Mesh
Dim angle As Single
Public Sub InitGraphics()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.Opaque, True)
presentParams.Windowed = True
presentParams.SwapEffect = SwapEffect.Discard
device = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParams)
device.RenderState.Lighting = False
SetupCamera()
InitTexture()
mesh = Direct3D.Mesh.Box(device, 10, 10, 10)
End Sub
Private Sub SetupCamera()
device.Transform.Projection = Matrix.PerspectiveFovLH(3.14 / 4, Me.Width / Me.Height, 1, 100)
device.Transform.View = Matrix.LookAtLH(New Vector3(0, 0, -25), New Vector3(), New Vector3(0, 1, 0))
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
If device Is Nothing Then
InitGraphics()
End If
device.VertexFormat = CustomVertex.PositionNormalTextured.Format
device.Clear(ClearFlags.Target, Color.CadetBlue, 0.5, 0)
device.BeginScene()
device.Transform.World = Matrix.RotationYawPitchRoll(angle, angle + 1.5, angle - 1)
mesh.DrawSubset(0)
device.EndScene()
device.Present()
angle += 0.03
Me.Invalidate()
End Sub
Private Sub OnDeviceResize(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles device.DeviceResizing
e.Cancel() = True
End Sub
Private Sub InitTexture()
tex = New Texture(device, Image.FromFile("D:\abc.bmp"), 0, Pool.Managed)
device.SetTexture(0, tex)
End Sub
End Class
device = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParams)
device.RenderState.Lighting = False
SetupCamera()
InitTexture()
mesh = Direct3D.Mesh.Box(device, 10, 10, 10)
Dim tempBox As Mesh = mesh.Clone(mesh.Options.Value, CustomVertex.PositionNormalTextured.Format, device)
mesh.Dispose()
mesh = tempBox
Dim verts() As CustomVertex.PositionNormalTextured = mesh.VertexBuffer.Lock(0, GetType(CustomVertex.PositionNormalTextured), LockFlags.None, mesh.NumberVertices)
т.е. бокс вначале имеет какой-то левый формат вершин, мы его сначала клонируем с нужным нам форматом, потом получаем вершины куба и прописываем текстурные координаты, с треугольниками было бы не намного сложнее, но нагляднее)
текстурные координаты изменяются от 0 до 1. Левый верхний угол картинки (0,0), правый нижний (1,1). Tu - координата по иксу вроде, Tv - по игреку. Получается, чтоп наложить текстуру на квадрат, нада углам установить след коорд:
сложные меши типа монстров всяких и т.п. делают в 3д редакторах типа 3d max. из этих редакторов эскпортируешь модельку в какой-нить формат, например родной для директ икса .x (но он кстати без анимации), либо ищешь алгоритмы загрузки других форматов. (я видел 3ds, md2 (модели из квейка 2)). при эскпорте модели из редакторов текстурные координаты, координаты вершин, анимация прописаны согласно формату файла.