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


Автор: Nikitozz 12.6.2008, 10:56
Такая проблема. Установил DirectX 9 учусь рисовать. рисовал просто треугольник все работает

потключал <d3d9.h> нормально работает
решил нарисовать трехмерную мадель с использованием матриц
подключаю <d3dx9.h> - пишет нет такого файла, хотя все там есть смотрел
библеотеки подключил d3d9.lib и d3dx9.lib

не могу понять в чем проблема, может поможете?

Автор: Graf_h 12.6.2008, 11:19
Можно посмотреть ошибки?

Автор: Nikitozz 12.6.2008, 11:22
Вот весь код:

Код

#include <windows.h>
#include <winuser.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <mmsystem.h>

LPDIRECT3D9 pDirect3D = NULL;                    //Главный объект
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;        //Устройство
LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL;    //Буфер вершин

struct CUSTOMVERTEX
{
    FLOAT x, y, z;            //Координаты
    DWORD color;            //Цвет вершин
};

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ| D3DFVF_DIFFUSE )

//---------
//Функция инициализации Direct3D
//---------
HRESULT InitialDirect3D(HWND hwnd)
{
    if(NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;
    D3DDISPLAYMODE Display;
    if(FAILED(pDirect3D ->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;
    D3DPRESENT_PARAMETERS Direct3DParametr;
    ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));
    Direct3DParametr.Windowed = TRUE;
    Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;
    Direct3DParametr.BackBufferFormat = Display.Format;

    if(FAILED(pDirect3D ->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice)))
        return E_FAIL;
    return S_OK;

    //отключить отсечение Direct3D
    pDirect3DDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    //отключить освещение
    pDirect3DDevice -> SetRenderState(D3DRS_LIGHTING, FALSE);
}
//---------

//---------
//Инициализация вершин
//---------
HRESULT InitialBufferVershin()
{
    CUSTOMVERTEX Vershin[] =
    {
        {1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(197, 113, 215), },    //A
        {-1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(23, 171, 12), },        //B
        {-1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255, 55, 55), },        //C

        {-1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255, 55, 55), },        //C
        {1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(28, 22, 245), },        //D
        {1.0f, -1.0f, 0.0f, D3DCOLOR_XRGB(197, 113, 215), },    //A
    };

    if(FAILED(pDirect3DDevice -> CreateVertexBuffer(6*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pBufferVershin, NULL)))
        return E_FAIL;
    VOID* pBV;
    if(FAILED(pBufferVershin -> Lock(0, sizeof(Vershin), (void**)&pBV, 0)))
        return E_FAIL;
    memcpy(pBV, Vershin, sizeof(Vershin));    //Копирование
    pBufferVershin ->Unlock();                //Разблокирование
    return S_OK;
}
//---------

//---------
//Функция Matrix
//---------
VOID Matrix()
{
    D3DMATRIX MatrixWorld;            //Мировая матрица
    D3DMATRIX MatrixView;            //Матрица вида
    D3DMATRIX MatrixProjection ;    //Матрица проекции

    //MatrixWorld
    UINT Time = timeGetTime() % 5000;
    FLOAT Angle = Time * (2.0f * D3DX_PI) / 5000.0f;
    D3DMatrixRotationY(&MatrixWorld, Angle);
    pDirect3DDevice -> SetTransform(D3DTS_WORLD, &MatrixWorld);

    //MatrixView
    D3DXMatrixLookAtLH(&MatrixView, &D3DXVECTOR3(0.0f, 0.0f, -8.0f),
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
    pDirect3DDevice ->SetTransform(D3DTS_VIEW, &MatrixView);

    //MatrixProjection
    D3DXMatrixPerspectiveFovLH(&MatrixProjection, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
    pDirect3DDevice ->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
//---------

VOID RenderingDirect3D()
{
    if(pDirect3DDevice == NULL)            //Проверяем ошибки
        return;
    pDirect3DDevice -> Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 0), 1.0f, 0);
    pDirect3DDevice -> BeginScene();    //Начало сцены
    //Здесь происходит прорисовка сцены
    pDirect3DDevice -> SetStreamSource(0, pBufferVershin, 0, sizeof(CUSTOMVERTEX));
    pDirect3DDevice -> SetFVF(D3DFVF_CUSTOMVERTEX);
    pDirect3DDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
    pDirect3DDevice -> EndScene();        //Конец сцены
    pDirect3DDevice -> Present(NULL, NULL, NULL, NULL);
}

VOID DeleteDirect3D()
{
    if(pBufferVershin != NULL)
        pBufferVershin -> Release();
    if(pDirect3DDevice != NULL)
        pDirect3DDevice -> Release();
    if(pDirect3D != NULL)
        pDirect3D -> Release();
}

LRESULT CALLBACK MainWinProc(HWND hwnd,
                             UINT msg,
                             WPARAM wparam,
                             LPARAM lparam)
{
    switch(msg)
    {
    case WM_DESTROY:
        {
            DeleteDirect3D();
            PostQuitMessage(0);
            return(0);
        }
    }

    return (DefWindowProc(hwnd, msg, wparam, lparam));
}

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEX windowsclass;
    HWND hwnd;
    MSG msg;

    windowsclass.cbSize = sizeof(windowsclass);
    windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    windowsclass.lpfnWndProc = MainWinProc;
    windowsclass.cbClsExtra = 0;
    windowsclass.cbWndExtra = 0;
    windowsclass.hInstance = hinstance;
    windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    windowsclass.lpszMenuName = NULL;
    windowsclass.lpszClassName = "WINDOWSCLASS";
    windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&windowsclass))
        return(0);

    if(!(hwnd = CreateWindowEx(NULL,
        "WINDOWSCLASS",
        "Рисуем треугольник",
        WS_OVERLAPPEDWINDOW|WS_VISIBLE,
        300,150,
        500,400,
        NULL,
        NULL,
        hinstance,
        NULL)))
        return(0);

    if(SUCCEEDED(InitialDirect3D(hwnd)))
    {
        if(SUCCEEDED(InitialBufferVershin()))
        {
            ShowWindow(hwnd, SW_SHOWDEFAULT);
            UpdateWindow(hwnd);
            ZeroMemory(&msg, sizeof(msg));
            while(msg.message != WM_QUIT)
            {
                if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
                else
                    RenderingDirect3D();
            }
        }
    }
    return 0;
}


Compiling...
MatrixKvadrat.cpp
c:\visual studio 2008\projects\urok6\urok6\matrixkvadrat.cpp(3) : fatal error C1083: Cannot open include file: 'd3dx9.h': No such file or directory
Build log was saved at "file://c:\Visual Studio 2008\Projects\Urok6\Urok6\Debug\BuildLog.htm"
Urok6 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Автор: konekt 12.6.2008, 12:48
А ты в настройках VC++2008 указывал директории подключаемых файлов? 
Путь к d3dx9.h.

Автор: Nikitozz 12.6.2008, 13:54
Цитата(konekt @  12.6.2008,  12:48 Найти цитируемый пост)
 ты в настройках VC++2008 указывал директории подключаемых файлов? 
Путь к d3dx9.h



Этого я не делал, а где можно указать путь?

Автор: konekt 12.6.2008, 15:16
Tools|Options|Projects and Solution|VC++ Directories далее В окне Show Directories for выбираешь Include files затем на кнопку New Line и указываешь путь к директории DirectX-Include (где у тебя должен быть зарыт D3DX9.H)
Затем в Show Directories for выбираешь Lib files затем New Line  и указываешь путь к DirectX-Lib файлам.
Вообщем, указываешь VC++ Куда ты поставил DirectX SDK.
Кстати, я запустил твой фаил, правда, пришлось исправить пару ошибок (забыл поставить } и не правильно указал имя функции Direct API. Но кроме пустого черного окна ничего не увидел. Если разберешься в чем тут дело - напиши.

Автор: Graf_h 12.6.2008, 16:15
Цитата(Nikitozz @  12.6.2008,  13:54 Найти цитируемый пост)
Этого я не делал, а где можно указать путь

Можеш просто указать в include:
Код

#include "path/d3d9."


Где вместо path пишеш тот путь, где лежать твои хедеры

Автор: konekt 12.6.2008, 16:38
Цитата

Можеш просто указать в include:
Выделить всёкод C++
1:
    
#include "path/d3d9."


Где вместо path пишеш тот путь, где лежать твои хедеры



Так конечно тоже можно. Но всеже, почему кроме пустого черного окна ничего нет. Вроде должен быть цветной примитивчик. 

Автор: Nikitozz 12.6.2008, 16:42
Попробовал через Options подключить, выдает кучу ошибок, указал путь - работает. Исправил другие ошибки... Компилит нормально, теперь при линковке ошибка:

------ Build started: Project: Urok6, Configuration: Debug Win32 ------
Linking...
MatrixKvadrat.obj : error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function "void __cdecl Matrix(void)" (?Matrix@@YAXXZ)
C:\Visual Studio 2008\Projects\Urok6\Debug\Urok6.exe : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://c:\Visual Studio 2008\Projects\Urok6\Urok6\Debug\BuildLog.htm"
Urok6 - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Должен получится квадрат с разноцветными вершинами, вращающийся по оси Y

Автор: konekt 12.6.2008, 21:11
Попробуй подключить winmm.lib У меня все линкуется, только, опять повтоюсь, ничего не выводится на экран. Я даже из тутора по директу запускаю пример - должен быть цветной треугольник, а у меня белый. Бьюсь над этой проблемой уже 4 часа. Ты писал, что запускал прогу с треугольником. У тебя он цветной получился?

Автор: Nikitozz 12.6.2008, 22:43
без матрици когда делал, просто прорисовал все получалось, желтый фон и цветной квадрат был. сейчас у меня просто черное окно появляется. буду искать ошибку

Спасибо за подсказку насчет либа

Добавлено через 13 минут и 49 секунд
Нашел первую ошибку в функции InitialDirect3D()

return S_OK; надо в самый конец поставить, получится вот так

Код

HRESULT InitialDirect3D(HWND hwnd)
{
    if(NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;
    D3DDISPLAYMODE Display;
    if(FAILED(pDirect3D ->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;
    D3DPRESENT_PARAMETERS Direct3DParametr;
    ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));
    Direct3DParametr.Windowed = TRUE;
    Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;
    Direct3DParametr.BackBufferFormat = Display.Format;

    if(FAILED(pDirect3D ->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice)))
        return E_FAIL;
    //отключить отсечение Direct3D
    pDirect3DDevice -> SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    //отключить освещение
    pDirect3DDevice -> SetRenderState(D3DRS_LIGHTING, FALSE);
    return S_OK;
}


Добавлено через 14 минут и 59 секунд
только теперь этот квадрат растянут на все окно... буду искать дальше

Автор: konekt 13.6.2008, 09:24
Спасибо за найденную ошибку. Вижу цветастое окно. Возможно проблема в инициализации матрицы вида либо word. Есть другой пример в котором куб вращается очень хорошо (из тутора по Direct) есть еще один из учебника, но там кубик ооооочень маленький  и если не знаешь что это куб и что он должен вращаться, то не догадаешься. Правда отрисовка происходит в сообщении WM_PAINT. Так вод там, если химичить с камерами, то можно чтото рассмотреть. 
А так в Direct я застрял именно на этом и не могу дальше сдвинуться.

Автор: konekt 13.6.2008, 15:40
Все работает!!! Ошибку  нашел. В функции VOID RenderingDirect3D() не указан вызов функции Matrix().

Автор: Nikitozz 13.6.2008, 16:14
Точно блин!!!  smile  все работает  smile 

теперь буду куб пробовать сделать smile

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