Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: текстурирование Добавлено: 19.01.09 19:53  

Автор вопроса:  diplay
Недавно начал учить 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

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 20.01.09 00:00
сделай куб из 12 треугольников будет проще, чем понять, почему это не работает

Ответить

Номер ответа: 2
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #2
Добавлено: 20.01.09 00:22
вообще это делается так:
  1.  
  2. WithEvents device As Device
  3.     Dim presentParams As New PresentParameters()
  4.     Dim tex As Texture
  5.     Dim mesh As Mesh
  6.     Dim angle As Single
  7.     Public Sub InitGraphics()
  8.         Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
  9.         Me.SetStyle(ControlStyles.Opaque, True)
  10.         presentParams.Windowed = True
  11.         presentParams.SwapEffect = SwapEffect.Discard
  12.         device = New Device(0, DeviceType.Hardware, Me, CreateFlags.SoftwareVertexProcessing, presentParams)
  13.         device.RenderState.Lighting = False
  14.         SetupCamera()
  15.         InitTexture()
  16.         mesh = Direct3D.Mesh.Box(device, 10, 10, 10)
  17.         Dim tempBox As Mesh = mesh.Clone(mesh.Options.Value, CustomVertex.PositionNormalTextured.Format, device)
  18.         mesh.Dispose()
  19.         mesh = tempBox
  20.         Dim verts() As CustomVertex.PositionNormalTextured = mesh.VertexBuffer.Lock(0, GetType(CustomVertex.PositionNormalTextured), LockFlags.None, mesh.NumberVertices)
  21.         For i As Integer = 0 To verts.Length - 1 Step 4
  22.             verts(i + 0).Tu = 0.0F
  23.             verts(i + 0).Tv = 0.0F
  24.             verts(i + 1).Tu = 1.0F
  25.             verts(i + 1).Tv = 0.0F
  26.             verts(i + 2).Tu = 1.0F
  27.             verts(i + 2).Tv = 1.0F
  28.             verts(i + 3).Tu = 0.0F
  29.             verts(i + 3).Tv = 1.0F
  30.         Next
  31.         mesh.VertexBuffer.Unlock()
  32.     End Sub
  33.     Private Sub SetupCamera()
  34.         device.Transform.Projection = Matrix.PerspectiveFovLH(3.14 / 4, Me.Width / Me.Height, 1, 100)
  35.         device.Transform.View = Matrix.LookAtLH(New Vector3(0, 0, -25), New Vector3(), New Vector3(0, 1, 0))
  36.     End Sub
  37.     Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  38.         If device Is Nothing Then
  39.             InitGraphics()
  40.         End If
  41.         device.Clear(ClearFlags.Target, Color.CadetBlue, 0.5, 0)
  42.         device.BeginScene()
  43.         device.Transform.World = Matrix.RotationYawPitchRoll(angle, angle + 1.5, angle - 1)
  44.         mesh.DrawSubset(0)
  45.         device.EndScene()
  46.         device.Present()
  47.         angle += 0.03
  48.         Me.Invalidate()
  49.     End Sub
  50.     Private Sub OnDeviceResize(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles device.DeviceResizing
  51.         e.Cancel() = True
  52.     End Sub
  53.     Private Sub InitTexture()
  54.         tex = New Texture(device, Image.FromFile("D:\abc.bmp"), 0, Pool.Managed)
  55.         device.SetTexture(0, tex)
  56.         device.VertexFormat = CustomVertex.PositionNormalTextured.Format
  57.     End Sub



т.е. бокс вначале имеет какой-то левый формат вершин, мы его сначала клонируем с нужным нам форматом, потом получаем вершины куба и прописываем текстурные координаты, с треугольниками было бы не намного сложнее, но нагляднее)

Ответить

Номер ответа: 3
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #3 Добавлено: 20.01.09 17:06
А как понять, какие тектурные координаты надо прописывать. Просто я еще новичек в DX.

Ответить

Номер ответа: 4
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #4
Добавлено: 20.01.09 18:34
текстурные координаты изменяются от 0 до 1. Левый верхний угол картинки (0,0), правый нижний (1,1). Tu - координата по иксу вроде, Tv - по игреку. Получается, чтоп наложить текстуру на квадрат, нада углам установить след коорд:

(0,0)------------(1,0)
     |..................|
     |..................|
     |..................|
     |..................|
(0,1)------------(1,1)

Ответить

Номер ответа: 5
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #5 Добавлено: 20.01.09 19:12
а что если у иеня более сложный меш типа чайника и т.п.?

Ответить

Номер ответа: 6
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #6
Добавлено: 20.01.09 22:01
сложные меши типа монстров всяких и т.п. делают в 3д редакторах типа 3d max. из этих редакторов эскпортируешь модельку в какой-нить формат, например родной для директ икса .x (но он кстати без анимации), либо ищешь алгоритмы загрузки других форматов. (я видел 3ds, md2 (модели из квейка 2)). при эскпорте модели из редакторов текстурные координаты, координаты вершин, анимация прописаны согласно формату файла.

Ответить

Номер ответа: 7
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #7 Добавлено: 21.01.09 17:17
я пробовал грузить из х-файлов, но модель грузилась почему-то белая без текстуры

Ответить

Номер ответа: 8
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #8
Добавлено: 23.01.09 00:28
  1. Private myMaterials() As Material
  2.     Private myTextures() As Texture
  3. Public Sub ReloadResources()
  4.         Dim mtrls() As ExtendedMaterial
  5. Dim mesh_ As Mesh = Mesh.FromFile(myPath, MeshFlags.Managed, device, mtrls)
  6.             If mtrls IsNot Nothing And mtrls.Length > 0 Then
  7.                 ReDim myMaterials(mtrls.Length - 1)
  8.                 ReDim myTextures(mtrls.Length - 1)
  9.                 For i As Integer = 0 To mtrls.Length - 1
  10.                     myMaterials(i) = mtrls(i).Material3D
  11.                     If mtrls(i).TextureFilename IsNot Nothing And mtrls(i).TextureFilename <> String.Empty Then myTextures(i) = TextureLoader.FromFile(dev, mtrls(i).TextureFilename)
  12.                 Next
  13.             End If
  14.         mesh_ = mesh_.Clone(MeshFlags.Managed, CustomVertex.PositionNormalTextured.Format, device)
  15.         mesh_.ComputeNormals()
  16.     End Sub
  17. Public Sub Render(ByRef cam As Camera)
  18.         For i As Integer = 0 To myMaterials.Length - 1
  19.             device.Material = myMaterials(i)
  20.             device.SetTexture(0, myTextures(i))
  21.             mesh_.DrawSubset(i)
  22.         Next
  23.     End Sub
  24.  

Ответить

Номер ответа: 9
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #9 Добавлено: 23.01.09 19:27
Skywalker пишет:
ByRef cam As Camera

Камера? Я думал в DX вместо камеры просто матрица.

Ответить

Номер ответа: 10
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #10
Добавлено: 23.01.09 20:13
ет я просто из своего проекта вырезал не обращай внимания)

Ответить

Номер ответа: 11
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #11 Добавлено: 24.01.09 19:31
а, понятно

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам