Documents & code‎ > ‎

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

DirectX-D3D9 Test`ing IT [Создание высоко-детализированного каркаса из простого примитива [Mesh.Box]]   
post id43 
post length2555 
post datetime3/20/2010 9:32:48 PM 
post ip77.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

 

Шаг 3

 

Шаг 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 As Integer = 0 To vertices.Length - 1 Step 
            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. 
Comments