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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectX ZBuffer Help! никак не выходит 
V
    Опции темы
MrCherry
Дата 16.2.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

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

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

LPDIRECT3D9 pDirect3D = NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 pVerBuff = NULL;
LPDIRECT3DINDEXBUFFER9 pIndexBuff = NULL;

HWND hWnd;
WNDCLASS WndClass;
MSG Msg;

HRESULT InitD3D(HWND hWnd);
HRESULT InitObj();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void KillD3D();
void Render();
void Matrix();

struct CUSTOMVERTEX {
    float x,y,z;
    DWORD color;
};
int D3DFVF_CUSTOMVERTEX(D3DFVF_XYZ|D3DFVF_DIFFUSE);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {
    char sxClNm[]="Hello, World!";
    WndClass.style = CS_HREDRAW | CS_VREDRAW;
    WndClass.lpfnWndProc = WndProc;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance = hInstance;
    WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName = 0;
    WndClass.lpszClassName = sxClNm;
    RegisterClass(&WndClass);
    hWnd = CreateWindowEx(NULL,sxClNm,"DirectX Test",WS_OVERLAPPEDWINDOW,
                          100,100,640,480,NULL,NULL, hInstance, NULL);
    if(SUCCEEDED(InitD3D(hWnd))){
     InitObj();
        ShowWindow(hWnd,nCmdShow);
        UpdateWindow(hWnd);
        while(Msg.message!=WM_QUIT) {
            if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE)){
                TranslateMessage(&Msg);
                DispatchMessage(&Msg);
            }
            else Render();
        } 
    }
    return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch (Message) {
        case WM_PAINT:
            Render();
            return 0;
        case WM_DESTROY:
            KillD3D();
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,lParam);
}

HRESULT InitD3D(HWND hWnd) {
    if(NULL==(pDirect3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL;
    D3DDISPLAYMODE Display;
    if(FAILED(pDirect3D->GetAdapterDisplayMode(NULL,&Display))) return E_FAIL;
    D3DPRESENT_PARAMETERS pDirect3DParameter;
    ZeroMemory(&pDirect3DParameter,sizeof(pDirect3DParameter));
    pDirect3DParameter.Windowed = TRUE;
    pDirect3DParameter.SwapEffect = D3DSWAPEFFECT_DISCARD;
    pDirect3DParameter.BackBufferFormat = Display.Format;
    pDirect3DParameter.EnableAutoDepthStencil = TRUE;
    pDirect3DParameter.AutoDepthStencilFormat = D3DFMT_D16;
    if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
                               D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                               &pDirect3DParameter,&pDirect3DDevice))) return E_FAIL;
    pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
    pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
    pDirect3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
    pDirect3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);    
    return S_OK;
}

void Render() {
    if(pDirect3DDevice==NULL) return;
    pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),0,0);
    pDirect3DDevice->BeginScene();
    Matrix();
    pDirect3DDevice->SetStreamSource(0,pVerBuff,0,sizeof(CUSTOMVERTEX));
    pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    pDirect3DDevice->SetIndices(pIndexBuff);
    pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,36,0,12);
    pDirect3DDevice->EndScene();
    pDirect3DDevice->Present(NULL,NULL,NULL,NULL);
}

void KillD3D() {
    pDirect3DDevice->Release();
    pDirect3D->Release();
    pVerBuff->Release();
    //pIndexBuff->Release();
}

HRESULT InitObj() {
    CUSTOMVERTEX vertex[] =    {
        {1.0f,-1.0f,1.0f,0x00000fff},
        {-1.0f,-1.0f,1.0f,0xff000fff},
        {-1.0f,1.0f,1.0f,0x00000fff},
        {1.0f,1.0f,1.0f,0x00000fff},

        {1.0f,-1.0f,-1.0f,0x00000fff},
        {-1.0f,-1.0f,-1.0f,0xff000fff},
        {-1.0f,1.0f,-1.0f,0x00000fff},
        {1.0f,1.0f,-1.0f,0x00000fff}
    };
    const unsigned short index[]={
        0,1,2,        2,3,0,
        0,3,7,        7,4,0,
        4,7,6,        6,5,4,
        5,6,2,        2,1,5,
        3,2,6,        6,7,3,
        0,1,5,        5,4,0
    };
    if(FAILED(pDirect3DDevice->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,
        D3DPOOL_DEFAULT,&pVerBuff,NULL))) return E_FAIL;
    VOID* pBV;
    if(FAILED(pVerBuff->Lock(0,sizeof(vertex),(void**)&pBV,0))) return E_FAIL;
    memcpy(pBV,vertex,sizeof(vertex));
    pVerBuff->Unlock();

    if(FAILED(pDirect3DDevice->CreateIndexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFMT_INDEX16,
        D3DPOOL_DEFAULT,&pIndexBuff,NULL))) return E_FAIL;
    VOID* pBI;
    pIndexBuff->Lock(0,sizeof(index),(void**)&pBI,0);
    memcpy(pBI,index,sizeof(index));
    pIndexBuff->Unlock();
    return S_OK;
}

void Matrix() {
    D3DXMATRIX MxWorld;
    D3DXMATRIX MxView;
    D3DXMATRIX MxProj;

    UINT time = timeGetTime()%5000;
    float angle = time*(2.0f*D3DX_PI)/5000.0f;
    D3DXMatrixRotationY(&MxWorld,angle);
    pDirect3DDevice->SetTransform(D3DTS_WORLD,&MxWorld);

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

    D3DXMatrixPerspectiveLH(&MxProj,(1.0f+1.0f/3.0f),1.0f,1.0f,100.0f);
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MxProj);
}


вот, как только врубаю zbuffer - ничего не чертится, отрубаю - всё норм.
изучаю дайрект по книге станислава горнакова, может источник устарел и нужно как то другому делать? 
PM MAIL   Вверх
MrCherry
Дата 16.2.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



страдаю из - за невнимательности..
надо было так чистить:
pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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