проблема с внутренностями *.x файла

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

проблема с внутренностями *.x файла

Сообщение d3drm » 12.11.2005 (Сб) 3:47

дело такое. надо достать из x файла всю инфу: атрибуты, индексы, вершины и отрендерить с помощью DrawIndexedPrimitiveUP.

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

попытки "методом тыка" заканчиваются перезагрузкой компутера, а сообразить что неверно не получается...

может дело в рендеринге?

вот код:

Код: Выделить всё

Public Sub Render()
    Dim i As Integer
   
    For i = 0 To Model.NumAttributes - 1
        Device.SetVertexShader FVF_VERTEX
        If Not Tex(i) Is Nothing Then
            Device.SetTexture 0, Tex(i)
        Else
            Device.SetTexture 0, Nothing
        End If
        Device.DrawIndexedPrimitiveUP D3DPT_TRIANGLELIST, 0, UBound(Model.Vertices) + 1, Model.AttTable(i).NumFaces, Model.Indices(Model.AttTable(i).StartFace * 3), D3DFMT_INDEX32, Model.Vertices(0), Len(Model.Vertices(0))

    Next i
End Sub


Может кто-то увидит ошибку и скажет мне?
ХЎ

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 12.11.2005 (Сб) 13:26

А зачем доставаить их.Даст ли это слудующее.Можно будет при таком способе рендерить отдельные часть X файла.Не весь, а только части по именам?
А почему комп у тебя перезагружаеться?

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 12.11.2005 (Сб) 14:50

вопрос не в том, ЗАЧЕМ это надо, а КАК это реализовать.

А комп перезагружается у меня давольно часто, при серьезных ошибках устройства. Видеокарта страптивая.
ХЎ

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 12.11.2005 (Сб) 15:05

вот мой пример, убрал все лишнее...
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.11.2005 (Сб) 15:40

Здесь я давал пример с DrawIndexedPrimitives:
http://bbs.vbstreets.ru/viewtopic.php?t ... c&start=30
А вот переделка с DrawIndexedPrimitivesUp, использует модель из первого примера:

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 12.11.2005 (Сб) 15:43

я пример не смотрел но длятого чтобы взять Attribute Table
нужно было отимизировить месш (вроде)
НО после оптимизации количество вертексов в каждом сабсете изменяется

у меня было чтото типа етого хотя может здесь другое

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 12.11.2005 (Сб) 22:52

Bonesnapper писал(а):...длятого чтобы взять Attribute Table
нужно было отимизировить месш


открыл америку :lol:

Bonesnapper писал(а):НО после оптимизации количество вертексов в каждом сабсете изменяется


это с чего это вдруг и откуда ты это придумал?
ХЎ

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 12.11.2005 (Сб) 23:38

Mikle, в примере нифига не по сабсетам рендерится... проблема именно в этом...
ХЎ

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 13.11.2005 (Вс) 0:22

оппа, у Майкла тот же баг, что и у меня.

Майкл, посмотри мою модель scene.x из моего примера, кубик-то - отдельный сабсет :wink: а у тебя, как и у меня, из него выделяются только несколько полигонов (((
ХЎ

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 13.11.2005 (Вс) 0:55

я америку не открывал :evil:

ты с начало проверь сколько вертексов в обычном меше
и сколько в оптимизированном

вот пример с начало запусти так как есть
а затем в функции CreateMesh
разкоментируй все после
'':::::::::::::::::::::[ Optimaze Mesh ]:::::::::::::::::::::::::
во втором лист боксе написано сколько вертексов

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.11.2005 (Вс) 9:34

d3drm
в примере нифига не по сабсетам рендерится... проблема именно в этом...

Как это не по сабсетам? Там есть комбобокс - выбрать сабсет.
Твой пример скачал, посмотрю.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.11.2005 (Вс) 15:58

Усе понятно.
У тебя половина индексов Long, половина Integer, еще бы оно работало :lol:
Так работает:
Код: Выделить всё
Option Explicit

Private Type ModelVertex
    x As Single: y As Single: z As Single
    nx As Single: ny As Single: nz As Single
    tu As Single: tv As Single
End Type

Private Type AttributeRange
    StartVertex As Long
    NumVertices As Long
    StartFace As Long
    NumFaces As Long
End Type

Private Type ModelInfo
    NumVertices As Long
    NumIndecies As Long
    NumAttributes As Long
    AttTable() As AttributeRange
    Vertices() As ModelVertex
    Indices() As Integer
    TexName() As String * 64
    Materials() As D3DMATERIAL8
End Type '// ModelInfo

Dim Tex() As Direct3DTexture8
Dim Model As ModelInfo
Dim Mesh As D3DXMesh

Public Sub CreateFromXFile(FilePath As String)
Dim TexBuffer As D3DXBuffer
Dim vBuf As Direct3DVertexBuffer8
Dim iBuf As Direct3DIndexBuffer8
Dim AT() As D3DXATTRIBUTERANGE
Dim NumMat As Long
Dim Vert() As D3DVERTEX
Dim Ind() As Integer
   
    Set Mesh = D3DX.LoadMeshFromX(FilePath, D3DXMESH_MANAGED, Device, Nothing, TexBuffer, NumMat)
    Set Mesh = Mesh.CloneMeshFVF(D3DXMESH_MANAGED, FVF_VERTEX, Device)
    Set Mesh = Mesh.Optimize(D3DXMESHOPT_ATTRSORT, ByVal 0, ByVal 0, ByVal 0, Nothing)
    Set vBuf = Mesh.GetVertexBuffer
    Set iBuf = Mesh.GetIndexBuffer
   
    Dim SizeOfVertex As Long
    SizeOfVertex = Len(Vert(0))
   
    ReDim Vert(Mesh.GetNumVertices - 1&)
    ReDim Ind(Mesh.GetNumFaces * 3& - 1&)
    ReDim AT(NumMat - 1)
   
    D3DVertexBuffer8GetData vBuf, 0&, (Mesh.GetNumVertices - 1) * SizeOfVertex, 0&, Vert(0&)
    D3DIndexBuffer8GetData iBuf, 0&, (Mesh.GetNumFaces - 1) * 3 * Len(Ind(0&)), 0&, Ind(0&)
 
    Mesh.GetAttributeTable AT(0), NumMat
   
    Model.NumAttributes = NumMat
    Model.NumIndecies = UBound(Ind) + 1
    Model.NumVertices = UBound(Vert) + 1
 
    ReDim Model.AttTable(Model.NumAttributes - 1)
    ReDim Model.TexName(Model.NumAttributes - 1)
    ReDim Model.Materials(Model.NumAttributes - 1)
    ReDim Model.Indices(Model.NumIndecies - 1)
    ReDim Model.Vertices(Model.NumVertices - 1)
 
Dim i As Integer
   
    For i = 0 To Model.NumAttributes - 1
        Model.AttTable(i).NumFaces = AT(i).FaceCount
        Model.AttTable(i).NumVertices = AT(i).VertexCount
        Model.AttTable(i).StartFace = AT(i).FaceStart
        Model.AttTable(i).StartVertex = AT(i).VertexStart
    Next i

    For i = 0 To Model.NumIndecies - 1
        Model.Indices(i) = Ind(i)
    Next i
   
    For i = 0 To Model.NumVertices - 1
        Model.Vertices(i).x = Vert(i).x
        Model.Vertices(i).y = Vert(i).y
        Model.Vertices(i).z = Vert(i).z
        Model.Vertices(i).nx = Vert(i).nx
        Model.Vertices(i).ny = Vert(i).nx
        Model.Vertices(i).nz = Vert(i).nz
        Model.Vertices(i).tu = Vert(i).tu
        Model.Vertices(i).tv = Vert(i).tv
    Next i
   
Dim strTexFile As String
    ReDim Tex(NumMat)
   
    For i = 0 To NumMat - 1

       'D3DX.BufferGetMaterial TexBuffer, i, MeshMaterial(i)
       
        strTexFile = D3DX.BufferGetTextureName(TexBuffer, i)
        If FileExists(strTexFile) And (strTexFile <> "") Then _
            Set Tex(i) = D3DX.CreateTextureFromFile(Device, strTexFile)
           
        Model.TexName(i) = strTexFile
    Next i
End Sub

Public Sub SaveModel(FilePath As String)
    Dim f As Integer, i As Integer
    f = FreeFile
    Open FilePath For Binary As f
        Put f, , CONV_VERSION
        Put f, , Model.NumVertices
        Put f, , Model.NumIndecies
        Put f, , Model.NumAttributes
        Put f, , Model.AttTable
        Put f, , Model.Vertices
        Put f, , Model.Indices
        Put f, , Model.TexName
        Put f, , Model.Materials
    Close f
End Sub

Public Sub Render()
    Dim i As Integer
   
    For i = 0 To Model.NumAttributes - 1
        Device.SetVertexShader FVF_VERTEX
        If Not Tex(i) Is Nothing Then
            Device.SetTexture 0, Tex(i)
        Else
            Device.SetTexture 0, Nothing
        End If
        Device.DrawIndexedPrimitiveUP D3DPT_TRIANGLELIST, 0, UBound(Model.Vertices) + 1, Model.AttTable(i).NumFaces, Model.Indices(Model.AttTable(i).StartFace * 3), D3DFMT_INDEX16, Model.Vertices(0), Len(Model.Vertices(0))
        '// Убрать камент со следующей строки, чтобы увидеть, как правильно
        '// рисуеццо модель.
        'Mesh.DrawSubset (i)
    Next i
End Sub

Public Sub Destroy()
    Erase Model.AttTable
    Erase Model.Indices
    Erase Model.Vertices
    Model.NumAttributes = 0
    Model.NumIndecies = 0
    Model.NumVertices = 0
    Dim i As Integer
   
    For i = 0 To Model.NumAttributes - 1
        Set Tex(i) = Nothing
    Next i
    Erase Tex
End Sub

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 14.11.2005 (Пн) 0:14

Mikle, спасибо... невнимательность меня погубит...
ХЎ


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList