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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не рисует 
:(
    Опции темы
Vermaxt
Дата 11.11.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброе время суток. Ниже приведенный код должен выводить треугольник (как написано в книге). Но видимо я где то не то ляпнул.
Код

#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
struct CUSTOMVERTEX{
    float X,Y,Z,rhw;
    DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
LPDIRECT3D9 pDirect3D = NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 pBufferVershin =NULL;
HRESULT InitalBufferVershin(){
    CUSTOMVERTEX Vershin[]=
    {
        {300.0f,300.0f,0.5f,1.0f,0x00000fff},
        {150.0f,300.0f,0.5f,1.0f,0x00000fff},
        {150.0f,150.0f,0.5f,1.0f,0x00000fff},
    };
      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;
}
HRESULT InitalDirect3D(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;
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
VOID RenderingDirect3D()
{
      pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
              D3DCOLOR_XRGB(0,255, 0), 1.0f, 0);
      pDirect3DDevice -> BeginScene();
      pDirect3DDevice -> SetStreamSource(0, pBufferVershin,0,sizeof(CUSTOMVERTEX));
      pDirect3DDevice -> SetFVF(D3DFVF_CUSTOMVERTEX);
      pDirect3DDevice -> DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
      pDirect3DDevice -> EndScene();
      pDirect3DDevice -> Present(NULL,NULL,NULL,NULL);
}
VOID DeleteDirect3D(){
    if(pDirect3DDevice!=NULL){
        pDirect3DDevice -> Release();
    }
    if(pDirect3D != NULL){
        pDirect3D -> Release();
    }
    if(pBufferVershin != NULL){
        pBufferVershin-> Release();
    }
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =(HBRUSH) GetStockObject(GRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindow(
szAppName, // window class name
"The Hello Program", // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL
); // creation parameters

if(SUCCEEDED(InitalDirect3D(hwnd)))
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(msg.message != WM_QUIT){
if(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{
    RenderingDirect3D();
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    switch(iMsg){
    case WM_PAINT:
        RenderingDirect3D();
        ValidateRect(hwnd,NULL);
        return 0;
    case WM_CLOSE:
        DeleteDirect3D();
        PostQuitMessage(0);
        return 0;
    }
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

Компилирует все без ошибок!
Где я сделал что то не так? Заранее спасибо.

Это сообщение отредактировал(а) Vermaxt - 11.11.2009, 17:38
PM MAIL   Вверх
kurlyak
Дата 19.11.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот тебе рабочий код. В твоем я пытался разобраться, но так и не нашел причину. 

Код

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE )

struct CUSTOMVERTEX { float x, y, z; DWORD color; };


bool AppInit ()
{
    p_d3d = Direct3DCreate9 (D3D_SDK_VERSION);
    
    D3DDISPLAYMODE d3ddm;
    p_d3d->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &d3ddm);
    
    D3DPRESENT_PARAMETERS    d3dpp;
     
    ZeroMemory (&d3dpp, sizeof(d3dpp));

    d3dpp.BackBufferWidth = 1024;
    d3dpp.BackBufferHeight = 768;
    d3dpp.BackBufferCount = 3;
    d3dpp.FullScreen_RefreshRateInHz = d3ddm.RefreshRate;
    d3dpp.Windowed = false;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;
    d3dpp.EnableAutoDepthStencil = true;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8;

    p_d3d->CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &p_d3d_Device);

    p_VertexBuffer = NULL;

    CUSTOMVERTEX g_Vertices[] =
    {
        {  -100.0f,  -100.0f,  0.0f, D3DCOLOR_XRGB (128,0,0),},
        { -100.0f,100.0f,  0.0f, D3DCOLOR_XRGB (128,9,0),},
        { 100.0f,  100.0f,  0.0f, D3DCOLOR_XRGB (128,0,0),},

        {  -100.0f,  -100.0f,  0.0f, D3DCOLOR_XRGB (0,0,128),},
        { 100.0f,-100.0f,  0.0f, D3DCOLOR_XRGB (0,0,128),},
        { 100.0f,  100.0f,  0.0f, D3DCOLOR_XRGB (0,0,128),},
    
    };

    p_d3d_Device->CreateVertexBuffer (sizeof(g_Vertices),
                                       D3DUSAGE_WRITEONLY, D3DFVF_XYZ | D3DFVF_NORMAL,
                                       D3DPOOL_MANAGED, &p_VertexBuffer, NULL );

    VOID* pVertices;
    p_VertexBuffer->Lock (0, sizeof(g_Vertices), (void**)&pVertices, 0);
        memcpy (pVertices, g_Vertices, sizeof(g_Vertices));
    p_VertexBuffer->Unlock();

    return true;
};

void RenderScene (void)
{
    D3DXMATRIX                matWorld;                    // мировая матрица
     D3DXMATRIX                matView;                    // матрица вида
    D3DXMATRIX                matProj;                    // матрица проецирования


    D3DXMatrixIdentity(&matWorld);
    p_d3d_Device->SetTransform (D3DTS_WORLD, &matWorld);
    

    D3DXMatrixLookAtLH (&matView, &D3DXVECTOR3 (0.0f, 0.0f, -500.0f),
        &D3DXVECTOR3 (0.0f, 0.0f, 0.0f),
        &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));
    p_d3d_Device->SetTransform (D3DTS_VIEW, &matView);
    
    D3DXMatrixPerspectiveFovLH (&matProj, D3DX_PI/4, 1.0f, 1.0f, 10000.0f);
    p_d3d_Device->SetTransform (D3DTS_PROJECTION, &matProj);

    p_d3d_Device->SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);
    p_d3d_Device->SetRenderState( D3DRS_LIGHTING, FALSE );
    p_d3d_Device->SetRenderState (D3DRS_ZENABLE, D3DZB_TRUE);

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

    p_d3d_Device->BeginScene ();
    p_d3d_Device->SetFVF (D3DFVF_CUSTOMVERTEX);
    p_d3d_Device->SetStreamSource (0, p_VertexBuffer,0, sizeof(CUSTOMVERTEX));
    p_d3d_Device->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 3);
    p_d3d_Device->EndScene ();
    p_d3d_Device->Present (NULL, NULL, NULL, NULL);
};



И зачем тебе:
Код

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    switch(iMsg){
    case WM_PAINT:
        RenderingDirect3D();//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

если ты рендеришь сцену здесь:
Код

if(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{
    RenderingDirect3D();//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
}



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

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

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


 




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


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

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