DirectX9 实现一个渐变三角形

来源:互联网 发布:淘宝卖家开不了花呗 编辑:程序博客网 时间:2024/05/22 14:59
#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;
}
原创粉丝点击