Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Visual C++ Win32 и DirectX

24K
30 января 2008 года
Mixalov_Aleksandr
40 / / 13.01.2008
Неработает код:
Код:
#include "stdafx.h"
#include "Начало.h"
#include <windows.h>
#include <d3d9.h>
#define MAX_LOADSTRING 100
HINSTANCE hInst;                                // current instance
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
HRESULT             IntialDirect3D(HWND hwnd);
VOID                RenderingDirect3D();
VOID                DeleteDirect3D();
HRESULT             InitalBufferVershin();
LPDIRECT3D9 pDirect3D=NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 pBufferVershin=NULL;
struct CUSTOMVERTEX
{
    FLOAT X,Y,Z,rhw;
    DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_DIFFUSE|D3DFVF_XYZ)
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
    MSG msg;
    HACCEL hAccelTable;
    MyRegisterClass(hInstance);
    if(!InitInstance(hInstance,nCmdShow))
    {return FALSE;}
    return (int) 0;
}
VOID DeleteDirect3D()
{
    if(pBufferVershin!=NULL)
    pBufferVershin->Release();
    if(pDirect3DDevice!=NULL)
    pDirect3DDevice->Release();
    if(pDirect3D!=NULL)
    pDirect3D->Release();
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = "WINDOWCLASS";
    wcex.hIconSm        = LoadIcon(wcex.hInstance,IDI_APPLICATION );
    return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   hInst = hInstance;
   MSG msg;
   hWnd=CreateWindow("WINDOWCLASS","",WS_OVERLAPPEDWINDOW|WS_VISIBLE,
      CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
   if(!hWnd){return FALSE;}
   if(FAILED(IntialDirect3D(hWnd))){return FALSE;}
   if(SUCCEEDED(InitalBufferVershin()))
   {
   ShowWindow(hWnd, nCmdShow);
   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 TRUE;
   }
}
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(3*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 IntialDirect3D(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_HARDWARE_VERTEXPROCESSING,
        &Direct3DParametr,&pDirect3DDevice)))
    return E_FAIL;
    return S_OK;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message)
    {
    case WM_DESTROY:
        DeleteDirect3D();
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
VOID RenderingDirect3D()
{
    if(pDirect3DDevice==NULL)
    return;
    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);
}

По идеи должен вывести синий треугольник на зелёном фоне
А выводит только зелёный фон...
Помогите найти ошибку:confused:
Зарание спасибо!!!
370
30 января 2008 года
koval
443 / / 29.08.2005
Опрос в стиле что лучше руки или ноги? DirectX - это не только работа с графикой.
35K
31 января 2008 года
bumper
6 / / 29.01.2008
вроде здесь:
0x00000fff - Цвет вершины синий (с маленькой примесью зелёного), но полностью прозрачный... надо бы 0xFF000FFF
255
31 января 2008 года
Dart Bobr
1.4K / / 09.04.2004
А почему нет варианта Glide?? Я в ярости!!
505
31 января 2008 года
vAC
343 / / 28.02.2006
По-моеуму в графике топику будет лучшее место.
А если по-теме, то рассматривая чисто как графический API, то я предпочитаю OpenGL. Несовместимость версий DirectX просто убивает, к тому же OGL - кросс-платформа.
Мое мнение на этот счет таково - чем меньше версий продукта, тем более удачно выбрана архитектура.
Так же, DirectX подсаживат на иглу COM.
Конечно согласен и с тем, что в DX много всего, что облегчает разработчику жизнь.
24K
31 января 2008 года
Mixalov_Aleksandr
40 / / 13.01.2008
Цитата: bumper
вроде здесь:
0x00000fff - Цвет вершины синий (с маленькой примесью зелёного), но полностью прозрачный... надо бы 0xFF000FFF


Поменял 0x00000fff на 0xFF000FFF результат такой же: зелёный фон, а треугольника нет.

35K
31 января 2008 года
bumper
6 / / 29.01.2008
Цитата: Mixalov_Aleksandr
Поменял 0x00000fff на 0xFF000FFF результат такой же: зелёный фон, а треугольника нет.




А ещё... скорее всего надо так: .... ->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, ...

1.9K
03 февраля 2008 года
0xf001
96 / / 24.05.2005
"в DX много всего" - это не аргумент. Для ОГЛ тоже есть много всего, SDL например.
35K
04 февраля 2008 года
ProgrammerIzverg
6 / / 16.01.2008
Сравнивай OpenGL с Direct3D, а не с DirectX :)
505
04 февраля 2008 года
vAC
343 / / 28.02.2006
Цитата: 0xf001
"в DX много всего" - это не аргумент. Для ОГЛ тоже есть много всего, SDL например.



Я же сказал в, а не для. Причем тут сторонние библиотеки? В топике идет сравнение DirectX(3D) и OpenGL, а не дополнений к ним. Конкретно про графическую часть DirectX-Direct3D и OpenGL я высказал свое мнение. А после этого просто отметил плюс для DirectX вцелом, какие возражения?

24K
05 февраля 2008 года
Mixalov_Aleksandr
40 / / 13.01.2008
Цитата: bumper
А ещё... скорее всего надо так: .... ->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, ...


Так тоже неполучается
Выводит какой-то "мусор" на экран

35K
05 февраля 2008 года
bumper
6 / / 29.01.2008
Цитата: Mixalov_Aleksandr
Так тоже неполучается
Выводит какой-то "мусор" на экран



Сорри, бегло смотрел, не обратил внимание, что режим оконный...
предыдущие поправки недействительны (т.к не используется Z-буффер и альфаблендинг по-умолчанию отключен)

Ошибка здесь:
#define D3DFVF_CUSTOMVERTEX (D3DFVF_DIFFUSE|D3DFVF_XYZ)
Надо:
#define D3DFVF_CUSTOMVERTEX (D3DFVF_DIFFUSE|D3DFVF_XYZRHW)
Т.е. экранные координаты твоего треугольника уже трасформированы (их не надо вычислять).

Теперь точно нарисует :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог