Страница: 1 | 2 |
Вопрос: [B]Direct3D[/B] - Проблема с текстурированием!
Добавлено: 03.02.07 19:33
Автор вопроса: Константин | Web-сайт:
Помогите пожалуйста!!!
Я загужаю с помошью Direct3D (DirectX 8) *.x файл. В этом файле несколько обектов на которые нужно разным способом наложить текстуру. В моём примере текстура всегда растягивается. А мне нужно что бы она раскопировалась по всей области картинки "Замостить". Как мне это сделать???????
Но при этом надо учитывать что все обекты находятся в *.x файле.
Вот часть моего кода:
'здесь идёт инициализация фала и текстур
Function InitGeometry() As Boolean
On Local Error Resume Next
Dim MtrlBuffer As D3DXBuffer
Dim i As Long
' вот тут грузится X файл
Set g_Mesh = g_D3DX.LoadMeshFromX(App.Path + "\Tiger.x", D3DXMESH_MANAGED, _
g_D3DDevice, Nothing, MtrlBuffer, g_NumMaterials)
If g_Mesh Is Nothing Then Exit Function
ReDim g_MeshMaterials(g_NumMaterials)
ReDim g_MeshTextures(g_NumMaterials)
Dim strTexName As String
init_load g_NumMaterials - 1, False
For i = 0 To g_NumMaterials - 1
' Копирование материала из буффера MtrlBuffer в массив g_MeshMaterials
g_D3DX.BufferGetMaterial MtrlBuffer, i, g_MeshMaterials(i)
' Установка окружающего цвета материала (D3DX этого не делает)
g_MeshMaterials(i).Ambient = g_MeshMaterials(i).diffuse
' Создание текстуры
strTexName = g_D3DX.BufferGetTextureName(MtrlBuffer, i)
If strTexName <> "" Then
progress_load i, "Загрузка... " & strTexName
Set g_MeshTextures(i) = g_D3DX.CreateTextureFromFile(g_D3DDevice, App.Path + "\" + strTexName)
End If
Next
Set MtrlBuffer = Nothing
InitGeometry = True
End Function
'функция производет отрисовку сцены
Public Sub Render()
Dim i As Long
g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFF&, 1, 0
' Начало сцены
g_D3DDevice.BeginScene
SetupMatrices
' 3d объекты разделены на части (subsets).
' У каждой части свой материал и текстура.
' Рендеринг 3d объекта по частям в цикле:
For i = 0 To g_NumMaterials - 1
' Установка материала и текстуры для каждой части
g_D3DDevice.SetMaterial g_MeshMaterials(i)
g_D3DDevice.SetTexture 0, g_MeshTextures(i)
' Прорисовка части 3d объекта
g_Mesh.DrawSubset i
Next
' Конец сцены
g_D3DDevice.EndScene
g_D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
Dushes
ICQ: 249195431
Вопросов: 8
Ответов: 110
Профиль | | #1
Добавлено: 04.02.07 10:26
Что ты имеешь в виду под раскопировать ? Изменить позиционирование текстуры - это через Vertex'ы твоей модели. Через D3DXMeshVertexBuffer8GetData
получаешь буффер с вертексами, изменяешь, и через
D3DXMeshVertexBuffer8SetData возвращаешь буффер на место. Если изменить принципы позиционирования: D3DTSS_TEXCOORDINDEX, CONST_D3DTEXTUREADDRESS и т.д...
Номер ответа: 2
Автор ответа:
Константин
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #2
Добавлено: 04.02.07 11:23
Dushes, например в разных игрушках есть куча поверхностей таки как земля стены и т.д., но у них они сами раскопируются как, то и по этому разрешение хорошее, а у меня представь на кусок земли со всю карту растягивается кусочек текстуры 256х256, там такие квадратики по экрану. Понимаеш у меня растягивается текстура, а мне нужно что бы она раскопировалась по поверхности.
Как мне это сделать учитывая что все обекты находяться в одном *.x файле???
Если можешь допиши как нужно сделать дальше:
Dim i As Long
' вот тут грузится X файл
Set g_Mesh = g_D3DX.LoadMeshFromX(App.Path + "\Tiger.x", D3DXMESH_MANAGED, _
g_D3DDevice, Nothing, MtrlBuffer, g_NumMaterials)
... что делать дальше???
Номер ответа: 3
Автор ответа:
Dushes
ICQ: 249195431
Вопросов: 8
Ответов: 110
Профиль | | #3
Добавлено: 04.02.07 13:21
Ну если тебе нужно только текстурные координаты правильно расставить - открой модель в редакторе и сделай UV Mapping так, как тебе угодно.
А вот если тебе надо каждый раз по разному "натягивать" текстуры, то тогда через работу в Vertex буффером модели.
Номер ответа: 4
Автор ответа:
Константин
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #4
Добавлено: 04.02.07 13:40
В 3D MAX Все текстуры натянул как надо и экспортировал *.X файл с помощью плагина PandaDXExport. Но текстуры не то что не раскопировались, но даже и не повернулись как надо. ЧТО ДЕЛАТЬ?
А как? Исходник можно? Но только учитывайте у меня всё в *.x фале лежит.
По тому что я не понял как работать с D3DXMeshVertexBuffer8GetData. Там столько параметров. Где мне их взять? Что дальше с ними делать?
Пожулуста помогите. Я уже замучался ни где нет ответа.
Номер ответа: 5
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #5
Добавлено: 04.02.07 15:38
ЗАБЕЙ НА DIRECTX!
Номер ответа: 6
Автор ответа:
Константин
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #6
Добавлено: 04.02.07 19:34
Нашёлся умник! На этом форуме не место глупым людям. Я хочу получить квалифицированный ответ. А забивать я не стану, т.к. я не тупой и не хуже других. Разберусь. Не на этом форуме так на другом.
Номер ответа: 7
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #7
Добавлено: 04.02.07 20:43
Спокойно... Просто я сам долго писал на DX, после полугода работы над игрой купил книгу по OpenGL и сделал все за неделю.
В *.x файлах содержится только mesh без привязок текстур. Поэтому сколько не редактируй текстуру в 3дмаксе, всю привязку делать придется самому. Вообще могу посоветовать поискать библы для загрузки моделей из форматов, поддерживающих текстуры.
зы Щас сам посмотрю, интересно стало.
Номер ответа: 8
Автор ответа:
Константин
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #8
Добавлено: 04.02.07 22:19
Извини. Просто думал что кто то хочет постебаться над тем что у меня ничего не выходит.
Ну ты понял какая у меня проблема. Помоги её пожалуйста решить.
Номер ответа: 9
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #9
Добавлено: 05.02.07 19:41
Ну юзай P3D например. Максу пофик куда экспортировать, зато в этих файйлах есть инфа текстуры.
Номер ответа: 10
Автор ответа:
Константин
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #10
Добавлено: 05.02.07 21:08
Непонял. И что мне потом делать? Что за P3D? Какое он отношение несёт к *.x
Я же не телепат. Можно по подробней весь путь реализации. Пожалуйста. Т.к. об этом ни где не написано (имею виду форумы и статьи)
Номер ответа: 11
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #11
Добавлено: 06.02.07 05:39
Fever
Ты файл .х хоть раз открывал?
Константин
Насколько я понял ты добиться копирования одной текстуры на полигоне?
У тебя три выхода.
1. Возьми другу текстуру (где не один кубик. а много- как шахматная доска).
2. Привязывай текстурные координаты вручную (тогда моно добиться какого хочешь раскопирования).
3. Накладывай много одинаковых текстур (раскопируй) на свой полигон в самом махе.
А иначе конечно она будет растягиваться. В махе просто реализация скрыта, поэтому и выглядит все нормально.
Почитай как связыватся координтаы вершин с текстурными координатами.
Номер ответа: 12
Автор ответа:
Константин
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #12
Добавлено: 06.02.07 12:49
Списибо, vito!
Про этот метод я знал, но он мне не подходит. Т.к. нерациональная трата ресурсов.
2. Привязывай текстурные координаты вручную (тогда моно добиться какого хочешь раскопирования).
А можно поподробнее как реализовать в этом случае?
3. Накладывай много одинаковых текстур (раскопируй) на свой полигон в самом махе.
Накладывал. В 3Д-Максе всё нормально, а в VB нефига. Натягиваются как по умолчанию.
Номер ответа: 13
Автор ответа:
Dushes
ICQ: 249195431
Вопросов: 8
Ответов: 110
Профиль | | #13
Добавлено: 06.02.07 17:49
Накладывал. В 3Д-Максе всё нормально, а в VB нефига. Натягиваются как по умолчанию.
Значит не экспортирует он твои текстурные коордианты... Я когда например .3DS модель экспортирую, он меня спрашивает, экспортировать ли текст. кординаты, я грю да - и все ок. Правда приходится еще потом использовать просмотрщик 3D форматов, чтобы перегнать в .x, но это уже мелочь, к тому же я например использую DeepExploration, а там многа чего еще полезного есть - например размеры подогнать, че нить подкоректировать, вопщем дофига всего...
Номер ответа: 14
Автор ответа:
Константин
Вопросов: 1
Ответов: 8
Web-сайт:
Профиль | | #14
Добавлено: 06.02.07 18:57
Спасибо! Понял!
Номер ответа: 15
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #15
Добавлено: 06.02.07 19:22
Константин
Извини за менторский тон.
1. Напасно - текстуры готовятся специально. И неизвестно
где мы больше потратим ресуросов.
2. Собствено для копирования текстур нужно лишь
увеличить их координаты. Размер текстуры - 1. Если мы
зададим ее размер равный 3, то (0.0,0.0), (0.0,3.0), (3.0,3.0),
(3.0,0.0) - то получим три одинаковые текстуры. Т.е.
координаты текстуры нужно умножить на желаемое
количество повторений.
{
FLOAT x, y, z; // The transformed position for the vertex
 WORD color; // The vertex color
FLOAT xt, yt;// texture coordinate
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
CUSTOMVERTEX Verticestemp1[] =
{
{1.0f, 1.0f, 0.0f, 0xffffffff,0.0f, 0.0f, },
{-1.0f, 1.0f, 0.0f, 0xffffffff,0.0f, 3.0f, },
{ 1.0f,-1.0f, 0.0f, 0xffffffff,3.0f, 0.0f, },
{-1.0f,-1.0f, 0.0f, 0xffffffff, 3.0f, 3.0f}
};
Последние два параметра - координаты текстуры.
Мы получим на полигоне 6 одинаковых текстур.
Что касается маха.
В плагине PandaDXExport, это все есть.
Возможно при экспорте стоит указать опцию - copy texture map?
В общем у меня подобных проблем не возникало.
Ну и наконец программно.
Для начала.
Вставь вот такую строчку и посмотри, что получится.
А вообще я сейчас задумал серию уроков по DX9. Вот только на С. Если кто хочет присоединиться и конвертировать код в VB, C#- буду рад.
Уроки дублшируют уроки от NeHe.