#include <Windows.h>
#include <d3d9.h>
LPDIRECT3D9 g_pD3D = NULL; // Direct3D对象指针
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Direct3D设备指针
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 顶点缓冲区指针
typedef struct CustomVertex
{
FLOAT x,y,z,rhw;
DWORD color;
}CustomVertex;
HRESULT OnInitVectorList()
{
void* pVertices = NULL;
CustomVertex vertextList[] = {
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, //红色
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, //蓝色
{ 50.0f , 250.0f, 0.5f, 1.0f, 0xff00ffff, }, //绿色
};
// 创建顶点缓冲区
if (FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CustomVertex)
, 0
, D3DFVF_XYZRHW|D3DFVF_DIFFUSE
, D3DPOOL_DEFAULT
, &g_pVB
, NULL)))
{
return E_FAIL;
}
// 锁定缓冲区,写入数据
if (FAILED(g_pVB->Lock(0, sizeof(vertextList), &pVertices, 0)))
{
return E_FAIL;
}
memcpy(pVertices, vertextList, sizeof(vertextList));
g_pVB->Unlock();
return S_OK;
}
HRESULT InitD3D( HWND hWnd)
{
g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
if ( NULL == g_pD3D)
{
return E_FAIL;
}
// 查询显示模式
D3DDISPLAYMODE d3ddm;
if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
{
return E_FAIL;
}
//设置传递给LPDIRECT3D9::CreateDevice的参数
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
}
return OnInitVectorList();
return S_OK;
}
void CleanD3D()
{
if (NULL != g_pd3dDevice)
{
g_pd3dDevice->Release();
}
if (NULL != g_pD3D)
{
g_pD3D->Release();
}
}
//-----------------------------------------------------------------------------
// Name: OnRendering()
// Desc: progrma main loop, Draws the scene
//-----------------------------------------------------------------------------
VOID OnRenderingSingleTriangle()
{
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CustomVertex));
g_pd3dDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
}
//-----------------------------------------------------------------------------
// Name: Render()
// Desc: progrma main loop, Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
if( NULL == g_pd3dDevice )
return;
// 将后缓冲区置为蓝色
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
g_pd3dDevice->BeginScene();
// 这里加入图形绘制程序
OnRenderingSingleTriangle();
g_pd3dDevice->EndScene();
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
WNDCLASS wndclass = {0, MsgProc, 0, 0, hInstance, NULL, NULL, NULL, NULL, "Dx9Test"};
RegisterClass(&wndclass);
HWND hWnd = CreateWindow(wndclass.lpszClassName
,"Dx9Test:MainTitle"
,WS_OVERLAPPEDWINDOW
,CW_USEDEFAULT
,CW_USEDEFAULT
,800
,640
,GetDesktopWindow()
,NULL
,wndclass.hInstance,
NULL
);
if (SUCCEEDED( InitD3D(hWnd)))
{
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
while( GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CleanD3D();
UnregisterClass(wndclass.lpszClassName, wndclass.hInstance);
return 0;
}
#include <d3d9.h>
LPDIRECT3D9 g_pD3D = NULL; // Direct3D对象指针
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Direct3D设备指针
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 顶点缓冲区指针
typedef struct CustomVertex
{
FLOAT x,y,z,rhw;
DWORD color;
}CustomVertex;
HRESULT OnInitVectorList()
{
void* pVertices = NULL;
CustomVertex vertextList[] = {
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, //红色
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, //蓝色
{ 50.0f , 250.0f, 0.5f, 1.0f, 0xff00ffff, }, //绿色
};
// 创建顶点缓冲区
if (FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CustomVertex)
, 0
, D3DFVF_XYZRHW|D3DFVF_DIFFUSE
, D3DPOOL_DEFAULT
, &g_pVB
, NULL)))
{
return E_FAIL;
}
// 锁定缓冲区,写入数据
if (FAILED(g_pVB->Lock(0, sizeof(vertextList), &pVertices, 0)))
{
return E_FAIL;
}
memcpy(pVertices, vertextList, sizeof(vertextList));
g_pVB->Unlock();
return S_OK;
}
HRESULT InitD3D( HWND hWnd)
{
g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
if ( NULL == g_pD3D)
{
return E_FAIL;
}
// 查询显示模式
D3DDISPLAYMODE d3ddm;
if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
{
return E_FAIL;
}
//设置传递给LPDIRECT3D9::CreateDevice的参数
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
}
return OnInitVectorList();
return S_OK;
}
void CleanD3D()
{
if (NULL != g_pd3dDevice)
{
g_pd3dDevice->Release();
}
if (NULL != g_pD3D)
{
g_pD3D->Release();
}
}
//-----------------------------------------------------------------------------
// Name: OnRendering()
// Desc: progrma main loop, Draws the scene
//-----------------------------------------------------------------------------
VOID OnRenderingSingleTriangle()
{
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CustomVertex));
g_pd3dDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
}
//-----------------------------------------------------------------------------
// Name: Render()
// Desc: progrma main loop, Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
if( NULL == g_pd3dDevice )
return;
// 将后缓冲区置为蓝色
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
g_pd3dDevice->BeginScene();
// 这里加入图形绘制程序
OnRenderingSingleTriangle();
g_pd3dDevice->EndScene();
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
WNDCLASS wndclass = {0, MsgProc, 0, 0, hInstance, NULL, NULL, NULL, NULL, "Dx9Test"};
RegisterClass(&wndclass);
HWND hWnd = CreateWindow(wndclass.lpszClassName
,"Dx9Test:MainTitle"
,WS_OVERLAPPEDWINDOW
,CW_USEDEFAULT
,CW_USEDEFAULT
,800
,640
,GetDesktopWindow()
,NULL
,wndclass.hInstance,
NULL
);
if (SUCCEEDED( InitD3D(hWnd)))
{
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
while( GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CleanD3D();
UnregisterClass(wndclass.lpszClassName, wndclass.hInstance);
return 0;
}