Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу разобраться с наложением текстур, DirectX, текстуры на mesh 
:(
    Опции темы
PirateTigo
Дата 6.11.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



Доброго времени суток!
Начал изучение Direct3D, дошел до материалов и текстур и застопорился. Мало того, что код из книги не работает и не накладывает текстуры на mesh-объект, загруженный из .x - файла, еще и в сети ничего не нахожу. В общем вот код:

Код

DWORD LoadMesh (char *filename, IDirect3DDevice9 *ppiD3DDevice9,
               ID3DXMesh **ppMesh,
               LPDIRECT3DTEXTURE9 **pMeshTextures,
               char *texturefilename, 
               D3DMATERIAL9 **pMeshMaterials
               )
{
    LPD3DXBUFFER pD3DXMtrlBuffer;
    DWORD dwNumMaterials;

    D3DXLoadMeshFromX(filename, D3DXMESH_SYSTEMMEM,
        ppiD3DDevice9, NULL, &pD3DXMtrlBuffer, NULL, &dwNumMaterials, ppMesh);

    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();

    (*pMeshTextures) = new LPDIRECT3DTEXTURE9[dwNumMaterials];
    (*pMeshMaterials) = new D3DMATERIAL9[dwNumMaterials];

    for( DWORD i=0; i<dwNumMaterials; i++ )
    {
        // Копируем материал
        (*pMeshMaterials)[i] = d3dxMaterials[i].MatD3D;
        //(*pMeshMaterials)[i] = d3dm;

        // Создаем текстуру
        if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
            d3dxMaterials[i].pTextureFilename, &(*pMeshTextures)[i])))
            if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
                texturefilename, &(*pMeshTextures)[i])))
                (*pMeshTextures)[i] = NULL;
    }
    return dwNumMaterials;
}



Код

void DrawScene()
{
    ViewAngle+=0.01f;
    float b = ViewAngle;
    
    D3DMATRIX World = {
        cos(b)*cos(b), cos(b)*sin(b), sin(b), 0,
        -sin(b), cos(b), 0, 0,
        -sin(b)*cos(b), -sin(b)*sin(b), cos(b), 0,
        0, 0,  0, 1,
    };

    pD3DDevice->SetTransform(D3DTS_WORLD, &World);
    
    //pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

    pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
    
    for (DWORD i=0; i<dwNumMaterials; i++)
    {            
        pD3DDevice->SetMaterial(&pMeshMaterials[i]);

        if (pMeshTextures[i])
            pD3DDevice->SetTexture(0, pMeshTextures[i]);

        pMesh->DrawSubset(i);
    }        
}


В общем, как я уже сказал, текстура не накладывается. Точнее она накладывается, но отображается однотонный объект коричневого цвета, хотя текстура была в виде рисунка дерева. (Размер текстуры 128x128, jpg, если это важно).
PM MAIL ICQ Skype   Вверх
EgoBrain
Дата 7.11.2009, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Посмотрите Mesh программой из пакета SDK, если там загрузиться без текстуры значит косяк в самом Mesh-е. Попробуйте создать простой Mesh в 3DMax, натянуть на него текстуру и сохранить в .Х, а затем загрузить в программе. Еще как вариант вот этот учаток кода:
Код

// Создаем текстуру
        if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
            d3dxMaterials[i].pTextureFilename, &(*pMeshTextures)[i])))
            if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
                texturefilename, &(*pMeshTextures)[i])))
                (*pMeshTextures)[i] = NULL;

попробуйте заменить на вариант:
Код

// Создаем текстуру
        // if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
         //   d3dxMaterials[i].pTextureFilename, &(*pMeshTextures)[i])))
            if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, 
                texturefilename, &(*pMeshTextures)[i])))
                (*pMeshTextures)[i] = NULL;

PM MAIL ICQ Skype   Вверх
PirateTigo
Дата 8.11.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 4.8.2008

Репутация: нет
Всего: нет



EgoBrain, вы правы. Спасибо за совет. 

Еще вопрос на эту же тему, а в каких случаях .x файл может быть не рабочим? Надеюсь таких случаев ограниченное множество =)
PM MAIL ICQ Skype   Вверх
jennya
Дата 18.11.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 7.11.2009

Репутация: нет
Всего: нет



Всем доброго время суток. На каких языках (Visual Basic, C#, C++)  пишутся программы для проигрования музыки и видео (Media Player Classic, Foobar, WinAmp и т.д.) ?  И где взять готовый програмный код для них? Заранее спасибо? 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1131 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.