Текстурирование .Х файла

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

Модератор: Mikle

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Текстурирование .Х файла

Сообщение longwair » 04.06.2012 (Пн) 19:00

В моём проекте имеется .Х файл, при создании его в 3DS Max были наложены несколько текстур. Задача состоит в том, что бы открыть все эти текстуры и наложить где они и должны быть. Как это реализовать?
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Текстурирование .Х файла

Сообщение DrKillJoy » 04.06.2012 (Пн) 20:18

Насколько я знаю, координаты текстур хранятся в самой моделе (.х). Если в 3ds max, модель сделана правильно, то в своем проекте достаточно просто "наложить" их сверху на модель, и они сами встанут на свое место.
В примере, загрузка файла (.х) и загрузка текстур к нему. Надеюсь это то, что тебе нужно. Пример написан на VB2008 + MDX.
У вас нет доступа для просмотра вложений в этом сообщении.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Текстурирование .Х файла

Сообщение longwair » 05.06.2012 (Вт) 9:26

DrKillJoy спасибо но у меня VB6
я делаю так:
Код: Выделить всё
Dim TexBothka As Direct3DTexture8 'текстура бочки

Private Type GameMesh
Model As D3DXMesh
MeshMaterials() As D3DMATERIAL8
NumMaterials As Long
End Type

Dim Bothka As GameMesh 'Mesh бочки
......
Private Sub InitGeometry()
'загружаю .Х
  Bothka = CreateGameMesh(App.Path + "\Bothka.x")
End Sub

Private Function CreateGameMesh(FileName As String) As GameMesh
  Dim MtrlBuffer As D3DXBuffer
  Dim i As Long
 
  Set CreateGameMesh.Model = d3dx.LoadMeshFromX(FileName, D3DXMESH_MANAGED, _
                                 d3dDevice, Nothing, MtrlBuffer, CreateGameMesh.NumMaterials)
  ReDim CreateGameMesh.MeshMaterials(CreateGameMesh.NumMaterials)
 
  For i = 0 To CreateGameMesh.NumMaterials - 1
     d3dx.BufferGetMaterial MtrlBuffer, i, CreateGameMesh.MeshMaterials(i)
     CreateGameMesh.MeshMaterials(i).Ambient = CreateGameMesh.MeshMaterials(i).diffuse
  Next
 
Set TexBothka = d3dx.CreateTextureFromFile(d3dDevice, App.Path + "\Bothka.dds")'загружаю текстуру
 
  Set MtrlBuffer = Nothing
End Function

Private Sub Render()
d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, SkyColor, 1, 0
  d3dDevice.BeginScene

  d3dDevice.SetTexture 0, TexBothka    'рендер
  DrawGameMesh Bothka, 0, 0, 0          'модели

d3dDevice.EndScene
  d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub


Так модель вся покрывается одной текстурой, если сделать две текстуры то модель покроется последней.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

DrKillJoy
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 56
Зарегистрирован: 10.04.2011 (Вс) 10:06

Re: Текстурирование .Х файла

Сообщение DrKillJoy » 05.06.2012 (Вт) 10:31

DrKillJoy спасибо но у меня VB6
Очень жаль! Но, я попробую помочь!

Когда у модели более одной текстуры, то при загрузке модели, из нее нужно вычленить названия всех текстур. И загружать текстуры в массив, через эти имена.
Вот, как это делаю я у себя в примере:
Код: Выделить всё
    Private Sub LoadMesh(ByVal file As String)
        Dim mtrl As ExtendedMaterial() = Nothing
        mesh = mesh.FromFile(file, MeshFlags.SystemMemory, Direct3D_Device, mtrl)
        If meshMaterials Is Nothing Then
            ' Мы должны извлечь свойств материалов и имена текстур
            meshTextures = New Texture(mtrl.Length) {}
            meshMaterials = New Direct3D.Material(mtrl.Length) {}
            Dim i As Integer
            For i = 0 To mtrl.Length - 1
                meshMaterials(i) = mtrl(i).Material3D
                ' Установить окружающего цвета материала (D3DX этого не делает)
                meshMaterials(i).Ambient = meshMaterials(i).Diffuse
                If mtrl(i).TextureFilename <> Nothing Then
                    ' Создание текстуры
                    meshTextures(i) = TextureLoader.FromFile(Direct3D_Device, mtrl(i).TextureFilename)
                End If
            Next i
        End If
    End Sub


Когда все текстуры загружены в массив, можно и отрисовать модель!
Вот моя отрисовка:
Код: Выделить всё
    Private Sub DrawMesh(ByVal yaw As Single, ByVal pitch As Single, ByVal roll As Single, ByVal x As Single, ByVal y As Single, ByVal z As Single)
        angle += 0.01

        Direct3D_Device.Transform.World = Matrix.RotationYawPitchRoll(yaw, pitch, roll) * Matrix.Translation(x, y, z)

        Dim i As Integer
        For i = 0 To meshMaterials.Length - 1
            Direct3D_Device.Material = meshMaterials(i)
            Direct3D_Device.SetTexture(0, meshTextures(i))
            mesh.DrawSubset(i)
        Next

    End Sub


Если не сможешь разобраться, то скинь свой проект на VB6, я попробую его доделать...

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Текстурирование .Х файла

Сообщение longwair » 07.06.2012 (Чт) 9:00

DrKillJoy закинул в личку проект, помоги разобраться

дописано позже: Всё спасибо сам разобрался))
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Текстурирование .Х файла

Сообщение longwair » 09.06.2012 (Сб) 23:42

Текстуры накладываются как надо, но это серьёзно ударило по FPS с 72 упал до 30-40, может кто посоветует что делать. И вообще с какими текстурами лучше работать, я в смысле формата какого?
ps у меня seleron 1800, radeon 9600. оперативы 512. И вообще вопрос, можно ли на VB6 сделать игруху типа Half-Life 1.
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Текстурирование .Х файла

Сообщение Mikle » 10.06.2012 (Вс) 8:41

longwair писал(а):можно ли на VB6 сделать игруху типа Half-Life 1.

Можно. И по быстродействию от C++ версии будет отличаться, разве что, версия с Soft Render.
longwair писал(а):с какими текстурами лучше работать, я в смысле формата какого?

Такого, какой требуется. Если запросы "типа Half-Life 1", то достаточно A8R8G8B8 и X8R8G8B8.
longwair писал(а):у меня seleron 1800, radeon 9600. оперативы 512

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

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Текстурирование .Х файла

Сообщение longwair » 13.06.2012 (Ср) 16:35

Наконец то нашёл почему так падал FPS, думаю кому то это тоже пригодиться. Проблема была в тексте. На экран выводилось 6 строк текста: 1 строка показывала сколько FPS, 4 строки показывали пересечение интерсект, и ещё одна строка выводила плюсик(+) в центр экрана(типа прицел). Так вот когда я убрал всё это, оставил только строку с FPS, то FPS вырос опять до 75 стабильно, а так был 40-45 иногда даже до 30 падал. Неужели текст так садит FPS? Ну короче я доволен что смог найти причину :D :D :D
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/

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

Re: Текстурирование .Х файла

Сообщение Mikle » 14.06.2012 (Чт) 9:50

longwair писал(а):Наконец то нашёл почему так падал FPS

Получается, что тут ты нас ввёл в заблуждение:
longwair писал(а):Текстуры накладываются как надо, но это серьёзно ударило по FPS с 72 упал до 30-40

Ты, видимо, в каждом кадре пишешь эти шесть строк с помощью D3DX, а это, всё-таки, растеризация векторного шрифта. Более эффективно рендерить текст в текстуру, и делать это только тогда, когда текст меняется, и только тот кусок, который поменялся. Но переключение рендер-таргет - тоже вещь не бесплатная, чтобы этого избежать, можно писать текст в битмап (или PictureBox) с помощью API или обычного Print, потом локать текстуру и переносить туда изображение. Вот исходник моей игры AoS2:
http://tuapse-mikle.narod.ru/AoS2.zip
Посмотри там modConsole - это как раз то самое.

longwair
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 21.04.2010 (Ср) 12:37
Откуда: Крым.

Re: Текстурирование .Х файла

Сообщение longwair » 14.06.2012 (Чт) 12:21

Спасибо за подсказку, В принципе и сам думал как то так сделать, но не знал как подойти. Теперь буду разбирать твой код)).
P.S. Игра бомба как включил её так и заигрался, даже забыл зачем я её включил)).
Тут же #000000 по #ffffff написано
Уроки по 3DS Max для начинающих - http://3dlong.ucoz.ru/


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

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

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

    TopList