Visual C++ Win32 и DirectX
#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:
Зарание спасибо!!!
0x00000fff - Цвет вершины синий (с маленькой примесью зелёного), но полностью прозрачный... надо бы 0xFF000FFF
А если по-теме, то рассматривая чисто как графический API, то я предпочитаю OpenGL. Несовместимость версий DirectX просто убивает, к тому же OGL - кросс-платформа.
Мое мнение на этот счет таково - чем меньше версий продукта, тем более удачно выбрана архитектура.
Так же, DirectX подсаживат на иглу COM.
Конечно согласен и с тем, что в DX много всего, что облегчает разработчику жизнь.
0x00000fff - Цвет вершины синий (с маленькой примесью зелёного), но полностью прозрачный... надо бы 0xFF000FFF
Поменял 0x00000fff на 0xFF000FFF результат такой же: зелёный фон, а треугольника нет.
А ещё... скорее всего надо так: .... ->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, ...
Я же сказал в, а не для. Причем тут сторонние библиотеки? В топике идет сравнение DirectX(3D) и OpenGL, а не дополнений к ним. Конкретно про графическую часть DirectX-Direct3D и OpenGL я высказал свое мнение. А после этого просто отметил плюс для DirectX вцелом, какие возражения?
Так тоже неполучается
Выводит какой-то "мусор" на экран
Выводит какой-то "мусор" на экран
Сорри, бегло смотрел, не обратил внимание, что режим оконный...
предыдущие поправки недействительны (т.к не используется Z-буффер и альфаблендинг по-умолчанию отключен)
Ошибка здесь:
#define D3DFVF_CUSTOMVERTEX (D3DFVF_DIFFUSE|D3DFVF_XYZ)
Надо:
#define D3DFVF_CUSTOMVERTEX (D3DFVF_DIFFUSE|D3DFVF_XYZRHW)
Т.е. экранные координаты твоего треугольника уже трасформированы (их не надо вычислять).
Теперь точно нарисует :)