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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с Z буфером 
:(
    Опции темы
Deutscher
Дата 6.10.2012, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток!
Начал немного программировать графику на DirectX по книге "Горнакова Уроки программирования на DirectX" так вот нарисовал куб, заставил его вращяться как в книге но когда начал использовать Z буфер
куб отрисовывается паршиво некоторые грани не видно если убрать Z буфер то всё нормально.
В чем может быть проблемма? Помогите разобраться пожалуйста?
вот код программы

Код

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

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

#include "resource.h"

#define SAFE_RELEASE(p) {\
    if (p != NULL)\
    {\
    p->Release();\
    p = NULL;\
    }\
    }

TCHAR szWindowClass[] = _T("Direct3DApplicationClass");
TCHAR szWindowTitle[] = _T("Direct 3D Application");

IDirect3D9 *g_pDirect = NULL;
IDirect3DDevice9 *g_pDevice = NULL;
IDirect3DVertexBuffer9 *g_pVertex = NULL;
IDirect3DIndexBuffer9 *g_pIndex = NULL;

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

#define FVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

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

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow)
{
    WNDCLASS wc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = szWindowClass;
    wc.lpszMenuName = NULL;
    wc.style = CS_DBLCLKS | CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
    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;
    }

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

    g_pDirect = Direct3DCreate9(D3D_SDK_VERSION);
    if (g_pDirect == NULL)
    {
        return 0;
    }

    D3DDISPLAYMODE dMode;
    HRESULT hr = g_pDirect->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dMode);
    if (FAILED(hr))
    {
        return 0;
    }

    D3DPRESENT_PARAMETERS pParameters;
    ZeroMemory(&pParameters, sizeof(pParameters));
    pParameters.AutoDepthStencilFormat = D3DFMT_D16;
    pParameters.BackBufferFormat = dMode.Format;
    pParameters.EnableAutoDepthStencil = TRUE;
    pParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
    pParameters.Windowed = TRUE;
    hr = g_pDirect->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pParameters, &g_pDevice);
    if (FAILED(hr))
    {
        return 0;
    }

    g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
    g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

    CUSTOMVERTEX Vertex[] =
    {
        {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, 0x00000fff},

        {-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, 0x00000fff},

        {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, 0x00000fff},

        {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, 0x00000fff},

        {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, 0x00000fff},

        {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, 0x00000fff}
    };

    hr = g_pDevice->CreateVertexBuffer(sizeof(Vertex), 0, FVF_CUSTOMVERTEX,
        D3DPOOL_DEFAULT, &g_pVertex, NULL);
    if (FAILED(hr))
    {
        return 0;
    }

    void *pVB;
    hr = g_pVertex->Lock(0, 0, (void**)&pVB, 0);
    if (FAILED(hr))
    {
        return 0;
    }

    CopyMemory(pVB, Vertex, sizeof(Vertex));
    
    hr = g_pVertex->Unlock();
    if (FAILED(hr))
    {
        return 0;
    }

    unsigned short Index[] = 
    {
        0, 1, 2, 2, 3, 0,
        4, 5, 6, 6, 7, 4,
        8, 9, 10, 10, 11, 8,
        12, 13, 14, 14, 15, 12,
        16, 17, 18, 18, 19, 16,
        20, 21, 22, 22, 23, 20
    };

    hr = g_pDevice->CreateIndexBuffer(sizeof(Index), 0, D3DFMT_INDEX16,
        D3DPOOL_DEFAULT, &g_pIndex, NULL);
    if (FAILED(hr))
    {
        return 0;
    }

    void *pIB;
    hr = g_pIndex->Lock(0, 0, (void**)&pIB, 0);
    if (FAILED(hr))
    {
        return 0;
    }

    CopyMemory(pIB, Index, sizeof(Index));

    hr = g_pIndex->Unlock();
    if (FAILED(hr))
    {
        return 0;
    }

    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 | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
            g_pDevice->BeginScene();

            D3DXMATRIX mWorld, mWorldX, mWorldY, mWorldZ;
            UINT uTime = timeGetTime() % 5000;
            FLOAT fAngle = uTime * (2.0f * D3DX_PI) / 5000.0f;
            D3DXMatrixRotationX(&mWorldX, fAngle);
            D3DXMatrixRotationY(&mWorldY, fAngle);
            D3DXMatrixMultiply(&mWorld, &mWorldX, &mWorldY);
            g_pDevice->SetTransform(D3DTS_WORLD, &mWorld);

            D3DXMATRIX mView;
            D3DXMatrixLookAtLH(&mView, &D3DXVECTOR3(0.0f, 0.0f, -8.0f),
                &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
            g_pDevice->SetTransform(D3DTS_VIEW, &mView);

            D3DXMATRIX mProjection;
            D3DXMatrixPerspectiveFovLH(&mProjection, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
            g_pDevice->SetTransform(D3DTS_PROJECTION, &mProjection);

            g_pDevice->SetStreamSource(0, g_pVertex, 0, sizeof(CUSTOMVERTEX));
            g_pDevice->SetFVF(FVF_CUSTOMVERTEX);
            g_pDevice->SetIndices(g_pIndex);
            g_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, ARRAYSIZE(Index), 0, 12);
            
            g_pDevice->EndScene();
            g_pDevice->Present(NULL, NULL, NULL, NULL);
        }
    }

    SAFE_RELEASE(g_pIndex);
    SAFE_RELEASE(g_pVertex);
    SAFE_RELEASE(g_pDevice);
    SAFE_RELEASE(g_pDirect);
    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}

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


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Цитата(Deutscher @  6.10.2012,  09:13 Найти цитируемый пост)
В чем может быть проблемма?

В не совсем правильной расстановке поверхностей. Некоторые поверхности у тебя вывернуты изнанкой, по умолчанию DX рендерит только те, у которых вертексы расположены в порядке часовой стрелки. Следовательно, либо меняй положение вертексов, либо отключай оптимизацию посредством установки D3DCULL_NONE для D3DRS_CULLMODE


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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