#include "Utility.h"
HWND g_hWnd = 0;
//------改造3D窗口需要用到的内容-------
LPDIRECT3D9 g_pD3D = NULL; //D3D的接口指针
LPDIRECT3DDEVICE9 g_pDevice = NULL; //D3D的设备指针
/*
在3D窗口中绘制一个三角形的步骤为:
(1)、定义灵活顶点格式
(2)、根据顶点格式构建一个描述顶点的结构体
(3)、声明一个顶点缓冲区指针
(4)、定义一个结构体数组用来给每一个顶点赋值
(5)、为顶点缓冲区分配空间并将数组中的顶点数据拷贝到顶点缓冲区中
(6)、设置数据源、设置灵活顶点格式、绘制图元
*/
//----步骤(1)、定义灵活顶点格式----
//每一个顶点的格式(经过变换的屏幕坐标|顶点的颜色)
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
//----步骤(2)、根据顶点格式构建一个描述顶点的结构体----
//描述一个顶点的结构体
struct stVertex
{
D3DXVECTOR4 vPos;
DWORD dwColor;
};
//----步骤(3)、声明一个顶点缓冲区指针----
//D3D中的顶点缓冲区
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
//初始化顶点缓冲区
void initVB()
{
//----步骤(4)、定义一个结构体数组用来给每一个顶点赋值----
//数组用来存储当前程序中的顶点数据
stVertex cVertices[] =
{
{D3DXVECTOR4(100,100,0,1),D3DCOLOR_XRGB(255,0,0)},
{D3DXVECTOR4(400,100,0,1),D3DCOLOR_XRGB(0,255,0)},
{D3DXVECTOR4(100,400,0,1),D3DCOLOR_XRGB(0,0,255)}
};
//----步骤(5)、为顶点缓冲区分配空间并将数组中的顶点数据拷贝到顶点缓冲区中----
//通过设备指针来创建顶点缓冲区,用来存储顶点数据
g_pDevice->CreateVertexBuffer(
sizeof(cVertices),//顶点缓冲区的大小
D3DUSAGE_WRITEONLY, //顶点缓冲区的作用
D3DFVF_CUSTOMVERTEX, //通过我们已经定义好的灵活顶点格式告知系统当前每一个顶点的格式
D3DPOOL_MANAGED,//顶点缓冲区的存储空间位于哪里,D3DPOOL_MANAGED代表当前存储空间受系统管理,自动分配
&g_pVB,//返回的顶点缓冲区指针
NULL //系统保留参数,为NULL即可
);
void * pVertices = NULL;
//锁定顶点缓冲区,以便向其中拷贝数据
g_pVB->Lock(
0,//锁定的偏移量
sizeof(cVertices),//锁定的大小
&pVertices, //锁定之后的存储空间由该指针指向
0 //锁定的标识,为0即可
);
memcpy(pVertices,cVertices,sizeof(cVertices));
g_pVB->Unlock();
}
//初始化D3D运行环境
void onCreateD3D()
{
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(!g_pD3D)
return;
////-----检测硬件设备能力的方法-----
//D3DCAPS9 caps;
//ZeroMemory(&caps,sizeof(caps));
//g_pD3D->GetDeviceCaps(
// D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
D3DDISPLAYMODE d3ddm;
ZeroMemory(&d3ddm,sizeof(d3ddm));
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,
&d3ddm);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = true; //窗口模式
////-------全屏模式的写法:---------
//d3dpp.Windowed = false;
//d3dpp.BackBufferWidth = d3ddm.Width;
//d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
//是否开启自动深度模板缓冲
d3dpp.EnableAutoDepthStencil = true;
//当前自动深度模板缓冲的格式
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
g_hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pDevice);
if(!g_pDevice)
return;
//设置渲染状态:设置启用深度值
g_pDevice->SetRenderState(D3DRS_ZENABLE,true);
}
//初始化游戏内容
void onInit()
{
onCreateD3D();
/*D3DXMATRIX matView , matProj;
D3DXMatrixIdentity(&matView);
D3DXMatrixIdentity(&matProj);
D3DXVECTOR3 vEyePos(0,3,-5);
D3DXVECTOR3 vLookAt(0,0,0);
D3DXVECTOR3 vUp(0,1,0);
D3DXMatrixLookAtLH(&matView,&vEyePos,&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);*/
initVB();
}
void onLogic(float fElapsedTime)
{
}
void onRender(float fElapsedTime)
{
g_pDevice->Clear(0,NULL,
D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(234,123,123),1.0f,0);
g_pDevice->BeginScene();
//----步骤(6)、设置数据源、设置灵活顶点格式、绘制图元----
//设置数据流的来源
g_pDevice->SetStreamSource(
0,//数据流管道号(0-15)
g_pVB, //数据的来源
0,//数据流的偏移量
sizeof(stVertex)//每个数据的字节数大小
);
//告知系统数据格式,以便解析数据
g_pDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
//绘制图元 Primitive:图元,Type:类型,Triangle:三角形
g_pDevice->DrawPrimitive(
D3DPT_TRIANGLELIST, //三角形列
0, //起始点编号(等同于在数组中顶点的编号)
1 //图元的数量
);
g_pDevice->EndScene();
g_pDevice->Present(NULL,NULL,NULL,NULL);
}
//销毁游戏
void onDestroy()
{
}
LRESULT CALLBACK WndProc(HWND _hWnd,UINT _uMsg,
WPARAM _wparam,LPARAM _lparam);
INT WINAPI WinMain( __in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in_opt 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(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(NULL,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("First_3DApp"),WS_OVERLAPPEDWINDOW,100,20,
800,600,NULL,NULL,hInstance,NULL);
if(!g_hWnd)
return 0;
ShowWindow(g_hWnd,SW_SHOWNORMAL);
UpdateWindow(g_hWnd);
onInit();
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;
}
}
onDestroy();
return 0;
}
LRESULT CALLBACK WndProc(HWND _hWnd,UINT _uMsg,
WPARAM _wparam,LPARAM _lparam)
{
switch(_uMsg)
{
case WM_KEYDOWN:
if(_wparam == VK_ESCAPE)
DestroyWindow(_hWnd);
break;
case WM_CLOSE:
DestroyWindow(_hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(_hWnd,_uMsg,_wparam,_lparam);
}
DirectX 3D空间坐标与灵活顶点格式
需积分: 10 90 浏览量
2015-09-15
13:36:38
上传
评论 1
收藏 14KB ZIP 举报
Linimass
- 粉丝: 99
- 资源: 11
最新资源
- OpenCv 使用fffffffff
- 正点原子开拓者FPGA多人表决器代码项目
- EOP-Last5Years.txt
- windows 32位、64位系统常见缺少的库
- 毕业设计基于springboot+vue实现的求职招聘类型网站源码+数据库(高分项目).zip
- 535springboot + vue 体质测试数据分析及可视化设计.zip(可运行源码+数据库文件+文档)
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统源码.zip
- 基于springboot+vue实现的求职招聘类型网站源代码+数据库(优质毕设项目).zip
- iOS APP提审checklist
- 第十四届中北大学ACM程序设计竞赛.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈