D3D顶点缓冲区及图元的绘制

Utility.h

#ifndef WINDOWS_TOOLS_

#define WINDOWS_TOOLS_
#include <Windows.h>
#include <mmsystem.h>
#pragma comment (lib,"Winmm.lib")
#endif


#ifndef D3D_TOOLS_
#define D3D_TOOLS_
#include <d3d9.h>
#pragma comment (lib,"d3d9.lib")
#include <d3dx9.h>
#pragma comment (lib,"d3dx9.lib")
#endif // !D3D_TOOLS_


#ifndef SAFE_DELETE_
#define SAFE_DELETE_
template<typename T>void Safe_Delete(T*&p) { if(p){delete p; p = NULL;} }
template<typename T>void Safe_Release(T*&p) { if (p) { p->Release(); p = NULL; } }
#endif




#include "Utility.h"


HWND g_hWnd;
HINSTANCE g_hInstance;


LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
//-------------定义顶点结构体用来描述一个顶点---------------
struct stCustomVertex
{
D3DXVECTOR4 vPos; //经过坐标转换的屏幕坐标
DWORD dwColor; //顶点颜色
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)


VOID OnInitD3D();
VOID OnInitVertexBuffer();
VOID OnInitCamera();
VOID OnLogic(float fElapsedTime);
VOID OnRender(float fElapsedTime);
VOID Destroy();
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
WNDCLASS wc;
ZeroMemory(&wc, sizeof(wc));
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = TEXT("alibaba");
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
RegisterClass(&wc);
g_hWnd = CreateWindow(wc.lpszClassName, TEXT("D3D"), WS_OVERLAPPEDWINDOW, 0, 0, 600, 800, NULL, NULL, hInstance, NULL);
if (!g_hWnd)
{
MessageBox(NULL, TEXT("CreateD3D Error"), TEXT("Error"), MB_OK);
return 0;
}
OnInitD3D();
OnInitCamera();
OnInitVertexBuffer();
ShowWindow(g_hWnd, SW_SHOWNORMAL);
UpdateWindow(g_hWnd);


MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
static DWORD dwTime = timeGetTime(); //从开机到现在的毫秒数
DWORD dwCurrentTime = timeGetTime();
DWORD dwElapsedTime = dwCurrentTime - dwTime;
float fElapsedTime = dwElapsedTime*0.001f;


OnLogic(fElapsedTime);
OnRender(fElapsedTime);


if (dwElapsedTime < 1000 / 60)
Sleep(1000 / 60 - dwElapsedTime);
dwTime = dwCurrentTime;
}
}
UnregisterClass(wc.lpszClassName, hInstance);
return 0;
}
LRESULT CALLBACK WndProc(HWND _hWnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam)
{
switch (_uMsg)
{
case WM_KEYDOWN:
if (_wParam == VK_ESCAPE)
{
int i=MessageBox(NULL, TEXT("退出游戏?"), TEXT("退出"), MB_OKCANCEL);
if (i == 1)
{
DestroyWindow(_hWnd);
}
}
break;
case WM_CLOSE:
DestroyWindow(_hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(_hWnd, _uMsg, _wParam, _lParam);
}
VOID OnInitD3D() {
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DDISPLAYMODE d3ddm;
ZeroMemory(&d3ddm, sizeof(d3ddm));
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.Windowed = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pDevice);
g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);


}
VOID OnInitVertexBuffer()//创建顶点缓冲区 用来存储顶点数据
{
//定义定点数组
stCustomVertex cVertices[6] =
{
{ D3DXVECTOR4(50,500,0,1),D3DCOLOR_XRGB(255,0,255) },
{ D3DXVECTOR4(150,100,0,1),D3DCOLOR_XRGB(255,255,0) },
{ D3DXVECTOR4(250,500,0,1),D3DCOLOR_XRGB(255,0,255) },
{ D3DXVECTOR4(350,100,0,1),D3DCOLOR_XRGB(255,255,0) },
{ D3DXVECTOR4(450,500,0,1),D3DCOLOR_XRGB(255,0,255) },
{ D3DXVECTOR4(550,100,0,1),D3DCOLOR_XRGB(255,255,0) },


};
//创建顶点缓冲区
g_pDevice->CreateVertexBuffer(
sizeof(cVertices), //顶点缓冲区的大小
D3DUSAGE_WRITEONLY, //默认参数u
D3DFVF_CUSTOMVERTEX, //定义每个顶点的格式
D3DPOOL_MANAGED, //受系统管理的存储空间
&g_pVB, //返回的顶点缓冲区指针
NULL //保留参数
);
//为顶点数组数据Copy到顶点缓冲区中
void *pVertex = NULL;
g_pVB->Lock(
0, //数据偏移量,不偏移
sizeof(cVertices), //锁定多大
&pVertex, //锁定空间后的数据区域
0 //锁定标识,给0即可
);
memcpy(pVertex,cVertices,sizeof(cVertices));
g_pVB->Unlock();
}
VOID OnInitCamera()
{
D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DXVECTOR3 vPos(0, 0, -5);
D3DXVECTOR3 vLookAt(0, 0, 0);
D3DXVECTOR3 vUp(0, 1, 0);
D3DXMatrixLookAtLH(&matView, &vPos, &vLookAt, &vUp);
g_pDevice->SetTransform(D3DTS_VIEW, &matView);
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 3, 4.0f / 3.0f, 1.0f, 5000.0f);
g_pDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}
VOID OnLogic(float fElapsedTime)
{


}
VOID OnRender(float fElapsedTime)
{
g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 234), 1.0f, 0);
g_pDevice->BeginScene();
//设置数据来源
g_pDevice->SetStreamSource(
0, //数据流编号(0-15)
g_pVB, //数据源
0, //数据偏移量
sizeof(stCustomVertex) //一个顶点数据所占的字节数
);
//设置顶点格式
g_pDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
//g_pDevice->DrawPrimitive(D3DPT_POINTLIST, 0, 6);
//g_pDevice->DrawPrimitive(D3DPT_LINELIST, 0, 3);
//g_pDevice->DrawPrimitive(D3DPT_LINESTRIP,0,5);
//g_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
//g_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 4);
g_pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 4);
g_pDevice->EndScene();
g_pDevice->Present(NULL, NULL, NULL, NULL);
}
VOID Destroy()
{
Safe_Release(g_pVB);
Safe_Release(g_pDevice);
Safe_Release(g_pD3D);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值