DirectX-D3D9 Test`ing IT [Создание высоко-детализированного каркаса из простого примитива [Mesh.Box]]

DirectX-D3D9 Test`ing IT [Создание высоко-детализированного каркаса из простого примитива [Mesh.Box]]

post id: 43

post length: 2555

post datetime: 3/20/2010 9:32:48 PM

post ip: 77.51.63.105

DirectX-D3D9 Test`ing IT [Создание высоко-детализированного каркаса из простого примитива [Mesh.Box]]

/к примеру: для последующего наложения [карты высот]/

Порядок телодвижений:

1. Создание примитива [Mesh.Box]

2. Тесселяция - как самый оптимальный способ получить

большее кол-во вершин при сохранении

формы объекта.

3. [СПЛЮЩИТЬ] объект.

4. Упрощение через [WeldVertices()].

5. ОПТИМИЗАЦИЯ.

Пункты [3], [4] и [5] нужны для максимальной оптимизации итогового меша с целью

как можно большего числа повторения всей операции для получения большей детализации

[к примеру: 128:128 из 1:1]

Шаг 1:

Шаг 2:

Шаг 4 и 5:

ИТОГО:

----------------

INFO:

[!] Информация о тесселяции взята из книги Миллера [Managed DirectX]

Sub [CreateIT]()

IMesh = Mesh.Box(device, 10, 2, 10)

' Пересчёт нормалей меша.

...

' Тесселяция:

Dim Patch As PatchMesh = PatchMesh.CreateNPatchMesh(IMesh)

Dim TLevel As Integer = 12 _

, numberVerts As Single = IMesh.NumberVertices * Math.Pow(TLevel, 3) _

, numberFaces As Single = IMesh.NumberFaces * Math.Pow(TLevel, 3)

Dim IIMesh As New Mesh(numberFaces, numberVerts _

, MeshFlags.Managed, CustomVertex.PositionNormal.Format, device)

Patch.Tessellate(TLevel, IIMesh)

IMesh = IIMesh

' СПЛЮЩИТЬ:

Dim vertices As CustomVertex.PositionNormal() _

= CType(IMesh.VertexBuffer.Lock(0, GetType(CustomVertex.PositionNormal) _

, 0, IMesh.NumberVertices), CustomVertex.PositionNormal())

IMesh.VertexBuffer.Unlock()

For i As Integer = 0 To vertices.Length - 1 Step 1

If vertices(i).Y < GetScaleIT(IMesh) Then

vertices(i).Y = 0

End If

Next

IMesh.VertexBuffer.SetData(vertices, 0, LockFlags.None)

' Упрощение объекта:

IMesh.WeldVertices(WeldEpsilonsFlags.WeldAll, New WeldEpsilons(), Nothing)

'и оптимизация:

OptimizeIT()

End Sub

THE END.