Почему не рисуется материал меша?

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

Модератор: Mikle

VladPro
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 15.10.2005 (Сб) 23:52

Почему не рисуется материал меша?

Сообщение VladPro » 30.06.2007 (Сб) 23:21

Такой вопрос. Вот функция, загружающая меш.

Public Function CreateGameMesh(FileName As String) As GameMesh
Dim MtrlBuffer As D3DXBuffer
Dim i As Long
Dim strTexName As String

Set CreateGameMesh.Model = g_D3DX.LoadMeshFromX(FileName, D3DXMESH_MANAGED, _
g_D3DDevice, Nothing, MtrlBuffer, CreateGameMesh.NumMaterials)
ReDim CreateGameMesh.MeshMaterials(CreateGameMesh.NumMaterials)
ReDim CreateGameMesh.MeshTextures(CreateGameMesh.NumMaterials)

For i = 0 To CreateGameMesh.NumMaterials - 1
g_D3DX.BufferGetMaterial MtrlBuffer, i, CreateGameMesh.MeshMaterials(i)
CreateGameMesh.MeshMaterials(i).Ambient = CreateGameMesh.MeshMaterials(i).diffuse
strTexName = g_D3DX.BufferGetTextureName(MtrlBuffer, i)
If strTexName <> "" Then
Set CreateGameMesh.MeshTextures(i) = g_D3DX.CreateTextureFromFile(g_D3DDevice, App.Path + "\" + strTexName)
End If
Next

Set MtrlBuffer = Nothing
End Function

Вот вывод меша на экран:

For i = 0 To mDrawing.NumMaterials - 1
g_D3DDevice.SetMaterial mDrawing.MeshMaterials(i)
g_D3DDevice.SetTexture 0, mDrawing.MeshTextures(i)
mDrawing.Model.DrawSubset i
Next

Рисую в Максе меш. Конвертирую в X Пандой. Если накладываю текстуру - всё в порядке, текстура нормально выводится этим кодом. Если только материал (Ambient делаю синим, к примеру, и назначаю этот материал мешу) - меш выводится белым. В то же время DXViewer - утилита из SDK - показывает меш правильно, окрашенный синим цветом. Конечно, можно всё обклеить текстурами и жить без проблем, но - почему так происходит?

В общем, если кто-то понимает, в чём дело, дайте знать.

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

Сообщение Bonesnapper » 01.07.2007 (Вс) 10:26

свет нужно поставить

K0GG
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 28.02.2011 (Пн) 14:26
Откуда: Москва

Re: Почему не рисуется материал меша?

Сообщение K0GG » 28.02.2011 (Пн) 14:38

Похожий вопрос, как устанавливать цвета SubSet -ов не применяя текстуры.
Объект создан
Код: Выделить всё
Set g_D3DDevice = g_D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, _
                                         D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)

Почему-то все Subset -ы рисуются в одном цвете
Вот полный код (VBA)

Код: Выделить всё
Option Explicit
Public g_DX As New DirectX8
Public g_D3DX As New D3DX8
Public g_D3D As Direct3D8
Public g_D3DDevice As Direct3DDevice8

Public Type GameMesh
    Model As D3DXMesh
    MeshMaterials() As D3DMATERIAL8
'    MeshTextures() As Direct3DTexture8              '++
    NumMaterials As Long
End Type

Public Const Num_Mesh As Integer = 5
Public g_Mesh(Num_Mesh) As GameMesh                   ' Íàøè 3d îáúåêòû

Public Const g_pi = 3.14159265358979

Public Function InitD3d(hwnd As Long) As Boolean
    On Local Error Resume Next '÷òîáû ïðè îøèáêå ïðîãðàììà ïðîäîëæàëà ðàáîòàòü äàëüøå
   
    Set g_D3D = g_DX.Direct3DCreate() 'ïîëó÷àåì îáúåêò Direct3d
    If g_D3D Is Nothing Then Exit Function  'åñëè íè÷åãî íå ïðîèñõîäèò - âûõîä èç ôóíêöèè
   
    Dim Mode As D3DDISPLAYMODE
    g_D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Mode
   
    Dim d3dpp As D3DPRESENT_PARAMETERS
    d3dpp.Windowed = 1
    d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
    d3dpp.BackBufferFormat = Mode.Format
    d3dpp.BackBufferCount = 1
    d3dpp.EnableAutoDepthStencil = 1
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16
   
    'ñîçäà¸ì  óñòðîéñòâî ðåíäåðèíãà
    Set g_D3DDevice = g_D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, _
                                         D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
    If g_D3DDevice Is Nothing Then Exit Function
   
    'âûêëþ÷àåì culling
    g_D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
    'âêëþ÷àåì z-áóôôåðèíã
    g_D3DDevice.SetRenderState D3DRS_ZENABLE, 1
    'âûêëþ÷àåì 3d îñâåùåíèå
'    g_D3DDevice.SetRenderState D3DRS_LIGHTING, 0
    '+++
    g_D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, True
    g_D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA
    g_D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
   ' g_D3DDevice.SetRenderState D3DRS_DIFFUSEMATERIALSOURCE, True
    '+++
    InitD3d = True 'èíèöèàëèçàöèÿ Direct3d ïðîøëà óñïåøíî
End Function

Public Sub Render()
    Dim i As Long
    g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &H0, 1, 0   ' ×åðíûé ôîí
    ' Íà÷àëî ñöåíû
    g_D3DDevice.BeginScene
    '+++
    SetupLights
    '+++
    SetupMatrices
    Call DrawGameMesh(g_Mesh(1), 0, 0, 0)
'    Call DrawGameMesh(g_Mesh(1), -100, -100, -100)
'    Call DrawGameMesh(g_Mesh(2), -100, 100, -100)
'    Call DrawGameMesh(g_Mesh(3), 100, 100, 100)
'    Call DrawGameMesh(g_Mesh(4), 100, -100, 100)
'    Call DrawGameMesh(g_Mesh(5), 0, 0, -100)
    ' Êîíåö ñöåíû
    g_D3DDevice.EndScene
   
    g_D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

Public Sub Cleanup()
    'Erase g_MeshTextures
    Dim i As Integer
    For i = 1 To Num_Mesh
        Erase g_Mesh(i).MeshMaterials
'        Erase g_Mesh(i).MeshTextures
        Set g_Mesh(i).Model = Nothing
    Next
    Set g_D3DDevice = Nothing
    Set g_D3D = Nothing
End Sub

Public Function InitGeometry() As Boolean
    On Local Error Resume Next
    Dim MtrlBuffer As D3DXBuffer
    Dim i As Long, j As Long
    Dim g_D3DLVERTEX As D3DLVERTEX
    Dim col As D3DCOLORVALUE
    Dim mtrl As D3DMATERIAL8
    For i = 1 To Num_Mesh
        Set g_Mesh(i).Model = g_D3DX.CreateSphere(g_D3DDevice, 70, 30, 30, Nothing)
        g_Mesh(i).NumMaterials = g_Mesh(i).Model.GetNumVertices() '+++++++++
'       g_Mesh(i).NumMaterials = g_Mesh(i).Model.GetNumFaces()  '+++++++++
'         g_Mesh(i).NumMaterials = 10
        ReDim g_Mesh(i).MeshMaterials(g_Mesh(i).NumMaterials)
     '   ReDim g_Mesh(i).MeshTextures(g_Mesh(i).NumMaterials)
'        Select Case i
'         Case 1
'            With col: .r = 1: .g = 0: .b = 0: .a = 0: End With
'         Case 2
'            With col: .r = 1: .g = 1: .b = 0: .a = 0: End With
'         Case 3
'            With col: .r = 0: .g = 1: .b = 0: .a = 0: End With
'         Case 4
'            With col: .r = 0: .g = 1: .b = 1: .a = 0: End With
'         Case 5
'            With col: .r = 0: .g = 0: .b = 1: .a = 0: End With
'        End Select
'        mtrl.diffuse = col
'        mtrl.ambient = col
        For j = 0 To g_Mesh(i).NumMaterials - 1
                With col
                    .r = Raduga3(j / g_Mesh(i).NumMaterials).r
                    .g = Raduga3(j / g_Mesh(i).NumMaterials).g
                    .b = Raduga3(j / g_Mesh(i).NumMaterials).b
                    .a = Raduga3(j / g_Mesh(i).NumMaterials).a
'                    .r = Raduga3((Sin(j / 12) + 1) / 2).r
'                    .g = Raduga3((Sin(j / 12) + 1) / 2).g
'                    .b = Raduga3((Sin(j / 12) + 1) / 2).b
                End With
                mtrl.diffuse = col
                mtrl.ambient = col
            g_Mesh(i).MeshMaterials(j) = mtrl
            'g_Mesh(i).MeshTextures(i) = g_D3DX.CreateTexture(g_D3DDevice,  Width As Long, Height As Long, MipLevels As Long, Usage As Long, PixelFormat As CONST_D3DFORMAT, Pool As CONST_D3DPOOL)
          '  g_Mesh(i).MeshTextures(i) = g_D3DX.CreateTexture(g_D3DDevice, 64, 64, 1, Usage, D3DFMT_D32, D3DPOOL_SYSTEMMEM)
        Next
    Next
    If g_Mesh(1).Model Is Nothing Then Exit Function
    Set MtrlBuffer = Nothing
    InitGeometry = True
End Function
Function vec3(x As Single, y As Single, z As Single) As D3DVECTOR
    vec3.x = x
    vec3.y = y
    vec3.z = z
End Function

Public Sub SetupMatrices()
    Dim matWorld As D3DMATRIX 'Ìàòðèöà Ìèðà
    'D3DXMatrixRotationY matWorld, Timer / 4
    'g_D3DDevice.SetTransform D3DTS_WORLD, matWorld
   
    Dim matView As D3DMATRIX 'Ìàòðèöà Îáçîðà
    D3DXMatrixLookAtLH matView, vec3(0, 0, -350), _
                                vec3(0, 0, 0), _
                                vec3(0, 1, 0)
                                 
    g_D3DDevice.SetTransform D3DTS_VIEW, matView
   
    Dim matProj As D3DMATRIX 'Ìàòðèöà Ïðîåêöèè
    D3DXMatrixPerspectiveFovLH matProj, g_pi / 4, 1, 1, 1000
    g_D3DDevice.SetTransform D3DTS_PROJECTION, matProj

End Sub
Public Sub SetupLights()
    Dim light(3) As D3DLIGHT8
    light(1).Type = D3DLIGHT_DIRECTIONAL
    light(1).diffuse.r = 1#
    light(1).diffuse.g = 1
    light(1).diffuse.b = 1
    light(1).Direction.x = 0.2
    light(1).Direction.y = -0.5
    light(1).Direction.z = 1
    light(1).Range = 250
    g_D3DDevice.SetLight 0, light(1)     'Let Direct3D know about the light.
    g_D3DDevice.LightEnable 0, 1
    g_D3DDevice.SetRenderState D3DRS_AMBIENT, &H202020
    g_D3DDevice.SetRenderState D3DRS_LIGHTING, 1    'Make sure lighting is enabled.
End Sub

'Ýòà ïðîöåäóðà ðèñóåò 3d îáúåêò
'â îïðåäåë¸ííîé òî÷êå ïðîñòðàíñòâà
Private Sub DrawGameMesh(ByRef mDrawing As GameMesh, mX As Single, mY As Single, mZ As Single)
    Dim i As Long
    Dim matWorld As D3DMATRIX
    'Dim MtrlBuffer As D3DXBuffer
    'ìàòðèöà ìèðà ñëóæèò äëÿ ïåðåõîäà
    'îò êîîðäèíàò ìîäåëè ê ìèðîâûì êîîðäèíàòàì
   
    D3DXMatrixTranslation matWorld, mX, mY, mZ
    g_D3DDevice.SetTransform D3DTS_WORLD, matWorld
   
    For i = 0 To mDrawing.NumMaterials - 1
'    For i = 0 To 20
       ' g_D3DX.BufferSetMaterial MtrlBuffer, i, mDrawing.MeshMaterials(i)
        'Sub BufferSetData(Buffer As D3DXBuffer, index As Long, typesize As Long, typecount As Long, Data As Any)
        '    Member of DxVBLibA.D3DX8
        g_D3DDevice.SetMaterial mDrawing.MeshMaterials(i)
        'g_D3DDevice.SetTexture 0, mDrawing.MeshTextures(i)   '++
'        g_D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, True '++
'        g_D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA '++
'        g_D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA '++
        mDrawing.Model.DrawSubset i
    Next
    i = 1
End Sub

Public Sub Main()
    Do
       Render
       DoEvents
    Loop
End Sub

Sub Pusk()
    Form1.Show vbModal
End Sub

Function Raduga3(dolya As Single) As D3DCOLORVALUE
' Âûäàåò êîìïîíåíòû .r, .g, .b, .a  D3DCOLORVALUE  ñïåêòðàëüíîãî öâåòà ïî èíäåêñó (êðàñíûé – ôèîëåòîâûé: îò 0 äî 1), ëèáî îòòåíêà ñåðîãî (÷åðíûé - áåëûé: îò 1 äî 2).
    Dim i As Single
    i = dolya * 18
    Select Case i
        Case 0 To 3
            Raduga3.r = 1
            Raduga3.g = i / 3
            Raduga3.b = 0
        Case 3 To 6
            Raduga3.r = (6 - i) / 3
            Raduga3.g = 1
            Raduga3.b = 0
        Case 6 To 9
            Raduga3.r = 0
            Raduga3.g = 1
            Raduga3.b = (i - 6) / 3
        Case 9 To 12
            Raduga3.r = 0
            Raduga3.g = (12 - i) / 3
            Raduga3.b = 1
        Case 12 To 15
            Raduga3.r = (i - 12) / 3
            Raduga3.g = 0
            Raduga3.b = 1
        Case 15 To 18
            Raduga3.r = 1
            Raduga3.g = 0
            Raduga3.b = (18 - i) / 3
        Case 18 To 36
            Raduga3.r = dolya - 1
            Raduga3.g = dolya - 1
            Raduga3.b = dolya - 1
        Case Else
            Raduga3.r = 0
            Raduga3.g = 0
            Raduga3.b = 0
        End Select
        Raduga3.a = 0.2
End Function

K0GG
"Omnia ab uno et in unum omnia"
_____
http://gorkavchukkg.narod.ru

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

Re: Почему не рисуется материал меша?

Сообщение Mikle » 28.02.2011 (Пн) 19:40

K0GG писал(а): как устанавливать цвета SubSet -ов не применяя текстуры.

Перед рисованием каждого сабсета задавай материал соответствующего цвета, либо задавай цвет через TextureFactor.

K0GG
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 20
Зарегистрирован: 28.02.2011 (Пн) 14:26
Откуда: Москва

Re: Почему не рисуется материал меша?

Сообщение K0GG » 02.03.2011 (Ср) 21:08

Снимаю вопрос, догадался, просто метод CreateSphere
и аналогичные создают Mesh всего из 1-го Subset-а.
K0GG
"Omnia ab uno et in unum omnia"
_____
http://gorkavchukkg.narod.ru


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 20

    TopList