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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Mesh из x файла 
V
    Опции темы
romanbiller
Дата 26.5.2013, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет! Люди подскажите как загрузить mesh из x файла.
Если можно пример кода. Зарание благодарен.
PM MAIL   Вверх
Bitter
Дата 26.5.2013, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



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


Новичок



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

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



вообщем загрузить получилось
но mesh какойто прозрачный

screen
user posted image

вот код
Код

#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;
}

PM MAIL   Вверх
Bitter
Дата 27.5.2013, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



а ZBuffer включил?
PM MAIL ICQ Skype   Вверх
romanbiller
Дата 27.5.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да включил не помогло  smile 
PM MAIL   Вверх
Bitter
Дата 27.5.2013, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



А очищаешь его перед рендером?
PM MAIL ICQ Skype   Вверх
EgoBrain
Дата 28.5.2013, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как сказал 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, а не сразу начинать ковырять готовые примеры...

Это сообщение отредактировал(а) EgoBrain - 28.5.2013, 01:29
PM MAIL ICQ Skype   Вверх
romanbiller
Дата 29.5.2013, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



всем спасибо всё получилось.
совет тоже хороший изучаю но по книгам и большинство примеров там не работают а документация на английском у меня с ним туго вот и лезу хрен знает куда
PM MAIL   Вверх
EgoBrain
Дата 29.5.2013, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тему пометить решенной.

Всё просто, если примеры из книг не работают значит не всё понял, возвращаешься назад и еще раз перечитываешь до полного понимания.
Хорошая книга Фрэнка Д. Луна (уже рекомендовалась на форуме), там недомолвок нет.
PM MAIL ICQ Skype   Вверх
romanbiller
Дата 9.8.2013, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Парни возник ещё вопрос вообщем взял x файл из SDK называется car.x вообщем он без текстур так вот он вообще в моей проге белым цветом ресуется не зелёным как в meshviewer.
Что за беда может быть???
PM MAIL   Вверх
EgoBrain
Дата 14.8.2013, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Беда в том, что ты пытаешь юзать DirectX не изучив основ.
http://www.gamedev.ru/code/terms/Material
И вообще приучи себя к вопросам прилогать код
PM MAIL ICQ Skype   Вверх
romanbiller
Дата 15.8.2013, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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 горнаков" кажется то же самое написанно.

писали бы всё нормально и не было бы таких мозгоёбов как я с глупыми вопросами 
PM MAIL   Вверх
EgoBrain
Дата 20.8.2013, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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);


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

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

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


 




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


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

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