Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Mesh из x файла


Автор: romanbiller 26.5.2013, 06:47
Всем привет! Люди подскажите как загрузить mesh из x файла.
Если можно пример кода. Зарание благодарен.

Автор: Bitter 26.5.2013, 10:51
http://www.toymaker.info/Games/html/load_x_simply.html
http://www.toymaker.info/Games/html/load_x_hierarchy.html

Автор: romanbiller 27.5.2013, 12:13
вообщем загрузить получилось
но mesh какойто прозрачный

screen
http://s1.ipicture.ru/

вот код
Код

#include <Windows.h>
#include <tchar.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9mesh.h>
#include <d3dx9shape.h>
#include <MMSystem.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "winmm.lib")

TCHAR szWindowClass[] = _T("GPWDirectX");
TCHAR szWindowTitle[] = _T("Graphics programming with DirectX");

IDirect3D9 *g_pDirect = NULL;
IDirect3DDevice9 *g_pDevice = NULL;
ID3DXMesh *g_pMesh = NULL;
ID3DXBuffer *g_pBuffer = NULL;
D3DMATERIAL9 *g_pMaterial = NULL;
LPDIRECT3DTEXTURE9 *g_pTexture = NULL;
D3DXMATRIX g_mWorld, g_mView, g_mProjection;

struct CUSTOMVERTEX
{
    FLOAT x, y, z;
    FLOAT nx, ny, nz;
    FLOAT tu, tv;
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = szWindowClass;
    wc.lpszMenuName = NULL;
    wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_OWNDC;
    if (!RegisterClass(&wc))
    {
        return 0;
    }

    HWND hWnd = CreateWindow(szWindowClass, szWindowTitle, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL);
    if (!hWnd)
    {
        return 0;
    }

    g_pDirect = Direct3DCreate9(D3D_SDK_VERSION);
    if (g_pDirect == NULL)
    {
    }
    
    D3DDISPLAYMODE dm;
    HRESULT hr = g_pDirect->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dm);
    if (FAILED(hr))
    {
    }

    D3DPRESENT_PARAMETERS pp;
    ZeroMemory(&pp, sizeof(D3DPRESENT_PARAMETERS));
    pp.BackBufferFormat = dm.Format;
    pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    pp.Windowed = TRUE;
    hr = g_pDirect->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
        D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &g_pDevice);
    if (FAILED(hr))
    {
    }

    g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
    g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    
    DWORD dwNumber;
    hr = D3DXLoadMeshFromX(_T("C:\\Users\\Роман\\Documents\\Visual Studio 2010\\Projects\\Graphics programming with DirectX\\Debug\\LandShark.x"),
        D3DXMESH_SYSTEMMEM, g_pDevice, NULL, &g_pBuffer, NULL, &dwNumber, &g_pMesh);
    if (FAILED(hr))
    {
    }

    D3DXMATERIAL *pMaterials = (D3DXMATERIAL *)g_pBuffer->GetBufferPointer();

    g_pMaterial = new D3DMATERIAL9[dwNumber];
    g_pTexture = new LPDIRECT3DTEXTURE9[dwNumber];

    for (DWORD i = 0; i < dwNumber; i++)
    {
        g_pMaterial[i] = pMaterials[i].MatD3D;
        g_pMaterial[i].Ambient = g_pMaterial[i].Diffuse;
        g_pTexture[i] = NULL;
        MessageBox(NULL, GetCommandLine(), NULL, NULL);
        hr = D3DXCreateTextureFromFileA(g_pDevice, "C:\\Users\\Роман\\Documents\\Visual Studio 2010\\Projects\\Graphics programming with DirectX\\Debug\\Speeder_diff.jpg", &g_pTexture[i]);
        if (FAILED(hr))
        {
        }
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    ZeroMemory(&msg, sizeof(MSG));
    while (msg.message != WM_QUIT)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
            g_pDevice->BeginScene();

            UINT uTime = timeGetTime() % 50000;
            FLOAT fAngle = uTime * (0.5f * D3DX_PI) / 5000.0f;
            D3DXMatrixRotationY(&g_mWorld, fAngle);
            g_pDevice->SetTransform(D3DTS_WORLD, &g_mWorld);

            D3DXMatrixLookAtLH(&g_mView, &D3DXVECTOR3(0.0f, 0.0f, -1000.0f), 
                &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
            g_pDevice->SetTransform(D3DTS_VIEW, &g_mView);

            D3DXMatrixPerspectiveFovLH(&g_mProjection, D3DX_PI / 4, 1.0f, 1.0f, 2000.0f);
            g_pDevice->SetTransform(D3DTS_PROJECTION, &g_mProjection);
            
            for (DWORD i = 0; i < dwNumber; i++)
            {
                g_pDevice->SetMaterial(&g_pMaterial[i]);
                g_pDevice->SetTexture(0, g_pTexture[i]);
                
                g_pMesh->DrawSubset(i);
            }

            g_pDevice->EndScene();
            g_pDevice->Present(NULL, NULL, NULL, NULL);
        }
    }
    return 0;
}

Автор: Bitter 27.5.2013, 12:34
а ZBuffer включил?

Автор: romanbiller 27.5.2013, 13:31
Да включил не помогло  smile 

Автор: Bitter 27.5.2013, 14:22
А очищаешь его перед рендером?

Автор: EgoBrain 28.5.2013, 01:28
Как сказал Bitter нужно включить буфер глубины а так же его очищать каждый раз.
Цитата

D3DPRESENT_PARAMETERS pp;
    ZeroMemory(&pp, sizeof(D3DPRESENT_PARAMETERS));
    pp.BackBufferFormat = dm.Format;
    pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    pp.Windowed = TRUE;

Код

D3DPRESENT_PARAMETERS pp;
ZeroMemory(&pp, sizeof(D3DPRESENT_PARAMETERS));
pp.BackBufferFormat = dm.Format;
pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
pp.EnableAutoDepthStencil = true;
pp.AutoDepthStencilFormat = D3DFMT_D24S8; //--С форматом необходимо определиться--
pp.Windowed = TRUE;


Цитата

g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

Код

g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);


Рекомендую изучать DirectX, а не сразу начинать ковырять готовые примеры...

Автор: romanbiller 29.5.2013, 07:36
всем спасибо всё получилось.
совет тоже хороший изучаю но по книгам и большинство примеров там не работают а документация на английском у меня с ним туго вот и лезу хрен знает куда

Автор: EgoBrain 29.5.2013, 07:54
Тему пометить решенной.

Всё просто, если примеры из книг не работают значит не всё понял, возвращаешься назад и еще раз перечитываешь до полного понимания.
Хорошая https://www.google.ru/#newwindow=1&sclient=psy-ab&q=%D1%84%D1%80%D1%8D%D0%BD%D0%BA+%D0%B4.+%D0%BB%D1%83%D0%BD%D0%B0+%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D1%82%D1%80%D0%B5%D1%85%D0%BC%D0%B5%D1%80%D0%BD%D1%8B%D1%85+%D0%B8%D0%B3%D1%80+%D1%81+directx+9.0&oq=%D1%84%D1%80%D1%8D%D0%BD%D0%BA+%D0%B4.+%D0%BB%D1%83%D0%BD%D0%B0+%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B2+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0&gs_l=hp.1.0.0.66825.71298.1.72621.22.16.2.4.4.1.446.4007.0j4j9j2j1.16.0...0.0...1c.1.14.psy-ab.LGK11flbxQQ&pbx=1&bav=on.2,or.r_cp.r_qf.&bvm=bv.47008514,d.bGE&fp=885d8aea7f6c5cb2&biw=1920&bih=912 (уже рекомендовалась на форуме), там недомолвок нет.

Автор: romanbiller 9.8.2013, 21:01
Парни возник ещё вопрос вообщем взял x файл из SDK называется car.x вообщем он без текстур так вот он вообще в моей проге белым цветом ресуется не зелёным как в meshviewer.
Что за беда может быть???

Автор: EgoBrain 14.8.2013, 01:58
Цитата(romanbiller @  9.8.2013,  21:01 Найти цитируемый пост)
Что за беда может быть??? 

Беда в том, что ты пытаешь юзать DirectX не изучив основ.
http://www.gamedev.ru/code/terms/Material
И вообще приучи себя к вопросам прилогать код

Автор: romanbiller 15.8.2013, 20:44
EgoBrain спасибо за ответ. беда в том что куда не глянь везде такой код неправильный

    D3DXMATERIAL *pMaterials = (D3DXMATERIAL *)g_pBuffer->GetBufferPointer();
    g_pMaterial = new D3DMATERIAL9[dwNumber];
    g_pTexture = new LPDIRECT3DTEXTURE9[dwNumber];
    for (DWORD i = 0; i < dwNumber; i++)
    {
        g_pMaterial[i] = pMaterials[i].MatD3D;
        g_pMaterial[i].Ambient = g_pMaterial[i].Diffuse;
        g_pTexture[i] = NULL;
        MessageBox(NULL, GetCommandLine(), NULL, NULL);
        hr = D3DXCreateTextureFromFileA(g_pDevice, "C:\\Users\\Роман\\Documents\\Visual Studio 2010\\Projects\\Graphics programming with DirectX\\Debug\\Speeder_diff.jpg", &g_pTexture[i]);
        if (FAILED(hr))
        {
        }
    }

и на форумах и в книгах я же не могу с потолка писать или на у гад нужен пример какого чёрта не сделать пример рабочим и описать все возможные варианты

такой же код в книге "уроки dx горнаков" кажется то же самое написанно.

писали бы всё нормально и не было бы таких мозгоёбов как я с глупыми вопросами 

Автор: EgoBrain 20.8.2013, 01:30
romanbiller, х3, в той литературе с которой я сталкивался четко говорилось что на цвет пикселя влияет заданное освещение и параметры материала [текстуры], и примеры кода сразу давались как свет задать как материалы [текстуры] задать.

Скрытый текст

Нехочу навязывать подходу, но просто что первое попалось под руку.

Свет
Код

D3DLIGHT9 InitDirectionLight(D3DXVECTOR3* direction,
           D3DXCOLOR* color)
    {
  D3DLIGHT9 light;

  ZeroMemory(&light, sizeof(light));

  light.Type = D3DLIGHT_DIRECTIONAL;
  light.Ambient = *color * 0.4f;
  light.Diffuse = *color;
  light.Specular = *color * 0.6f;
  light.Direction = *direction;

  return light;
    }
... /*в модуле где происходит инициализация и рисование*/
D3DLIGHT9 light1;
ZeroMemory(&light1, sizeof(light1));
light1 = InitDirectionLight(&D3DXVECTOR3(sin(angle), .0f, cos(angle)), &D3DXCOLOR(1.f, 1.f, 1.f, 1.f));

iDevice->SetLight(1, &light1);
iDevice->LightEnable(1, true);


Материалы
Какой-то заголовочный файл
Код

const D3DMATERIAL9 RED_MTRL = InitMtrl(RED, RED, RED, BLACK, 8.0f);

Код

/*в модуле где происходит инициализация и рисование*/
ID3DXMesh* Teapot = 0;
D3DMATERIAL9 TeapotMtrl;

...

TeapotMtrl = RED_MTRL;
TeapotMtrl.Diffuse.a = .5f;

D3DXCreateTeapot(iDevice, &Teapot, 0);

...

/*в функции рендеринга*/
iDevice->SetMaterial(&TeapotMtrl);
Teapot->DrawSubset(0);


Что неправильного в приведенном тобой коде? Можешь выложить проект свой?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)