Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: [B]Direct3D[/B] - Проблема с текстурированием! Добавлено: 03.02.07 19:33  

Автор вопроса:  Константин | Web-сайт: orsk-zone.ru
Помогите пожалуйста!!!

Я загужаю с помошью 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-сайт: orsk-zone.ru
 Профиль | | #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-сайт: orsk-zone.ru
 Профиль | | #4
Добавлено: 04.02.07 13:40
Ну если тебе нужно только текстурные координаты правильно расставить - открой модель в редакторе и сделай UV Mapping так, как тебе угодно.

В 3D MAX Все текстуры натянул как надо и экспортировал *.X файл с помощью плагина PandaDXExport. Но текстуры не то что не раскопировались, но даже и не повернулись как надо. ЧТО ДЕЛАТЬ?

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

А как? Исходник можно? Но только учитывайте у меня всё в *.x фале лежит.

По тому что я не понял как работать с D3DXMeshVertexBuffer8GetData. Там столько параметров. Где мне их взять? Что дальше с ними делать?

Пожулуста помогите. Я уже замучался ни где нет ответа.

Ответить

Номер ответа: 5
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #5 Добавлено: 04.02.07 15:38
ЧТО ДЕЛАТЬ?

ЗАБЕЙ НА DIRECTX!

Ответить

Номер ответа: 6
Автор ответа:
 Константин



Вопросов: 1
Ответов: 8
 Web-сайт: orsk-zone.ru
 Профиль | | #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-сайт: orsk-zone.ru
 Профиль | | #8
Добавлено: 04.02.07 22:19
Извини. Просто думал что кто то хочет постебаться над тем что у меня ничего не выходит.

Ну ты понял какая у меня проблема. Помоги её пожалуйста решить.

Ответить

Номер ответа: 9
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #9 Добавлено: 05.02.07 19:41
Ну юзай P3D например. Максу пофик куда экспортировать, зато в этих файйлах есть инфа текстуры.

Ответить

Номер ответа: 10
Автор ответа:
 Константин



Вопросов: 1
Ответов: 8
 Web-сайт: orsk-zone.ru
 Профиль | | #10
Добавлено: 05.02.07 21:08
Ну юзай P3D например. Максу пофик куда экспортировать, зато в этих файйлах есть инфа текстуры.


Непонял. И что мне потом делать? Что за P3D? Какое он отношение несёт к *.x

Я же не телепат. Можно по подробней весь путь реализации. Пожалуйста. Т.к. об этом ни где не написано (имею виду форумы и статьи)

Ответить

Номер ответа: 11
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #11
Добавлено: 06.02.07 05:39
Fever

В *.x файлах содержится только mesh без привязок текстур.


Ты файл .х хоть раз открывал?:)

Константин
Насколько я понял ты добиться копирования одной текстуры на полигоне?
У тебя три выхода.

1. Возьми другу текстуру (где не один кубик. а много- как шахматная доска).
2. Привязывай текстурные координаты вручную (тогда моно добиться какого хочешь раскопирования).
3. Накладывай много одинаковых текстур (раскопируй) на свой полигон в самом махе.

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

Почитай как связыватся координтаы вершин с текстурными координатами.

Ответить

Номер ответа: 12
Автор ответа:
 Константин



Вопросов: 1
Ответов: 8
 Web-сайт: orsk-zone.ru
 Профиль | | #12
Добавлено: 06.02.07 12:49
Списибо, vito!
1. Возьми другу текстуру (где не один кубик. а много- как шахматная доска).

Про этот метод я знал, но он мне не подходит. Т.к. нерациональная трата ресурсов.

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-сайт: orsk-zone.ru
 Профиль | | #14
Добавлено: 06.02.07 18:57
Спасибо! Понял!

Ответить

Номер ответа: 15
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #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) - то получим три одинаковые текстуры. Т.е.

координаты текстуры нужно умножить на желаемое

количество повторений.

struct CUSTOMVERTEX
{
    FLOAT x, y, z; // The transformed position for the vertex
    ;DWORD 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 одинаковых текстур.

Я когда например .3DS модель экспортирую, он меня спрашивает, экспортировать ли текст. кординаты, я грю да - и все ок.


Что касается маха.
В плагине PandaDXExport, это все есть.
 Возможно при экспорте стоит указать опцию - copy texture map?
В общем у меня подобных проблем не возникало.
Ну и наконец программно.

Для начала.
Вставь вот такую строчку и посмотри, что получится.

g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION );
Это на С. Но я думаю и на VB это возможно.

А вообще я сейчас задумал серию уроков по DX9. Вот только на С. Если кто хочет присоединиться и конвертировать код в VB, C#- буду рад.

Уроки дублшируют уроки от NeHe.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам