// @time  2012.3.5
// @author jadeshu
//包含头文件
#include <Windows.h>
#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")
//自定义
#define ReleaseD3D(x) if (x!=NULL){x->Release();x=NULL;} //定义设备接口
IDirect3DDevice9 * g_pDevic=NULL;
//定义顶点缓冲
IDirect3DVertexBuffer9 * g_pVertexBuff=NULL;
//定义索引缓冲
IDirect3DIndexBuffer9 * g_pIndexBuff=NULL;
//定义着色模式选择
BOOL g_bFlat=FALSE;
//定义填充模式选择
int g_iFillMode=3;
//定义结构体
struct CUSTOMVERTEX
{
FLOAT _x,_y,_z,_rhw;
DWORD _color;
CUSTOMVERTEX(FLOAT x,FLOAT y,FLOAT z,FLOAT rhw,DWORD color)
:_x(x),_y(y),_z(z),_rhw(rhw),_color(color){}
};
//定义顶点灵活格式
#define CUSTOMVERTEX_FVF (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
//回调函数声明
LRESULT CALLBACK WinProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
//初始化Direct3D函数声明
HRESULT InitD3D(HWND hwnd);
//渲染声明
VOID Render();
//清除对象声明
VOID Release3D(); //主函数,入口函数
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//定义窗口类结构
TCHAR szAppName[]=TEXT("ClassN");
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
ZeroMemory(&msg,sizeof(MSG));
wc.cbClsExtra=0;
wc.cbSize=sizeof(WNDCLASSEX);
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor=LoadCursor(hInstance,IDC_ARROW);
wc.hIcon=LoadIcon(hInstance,IDI_APPLICATION);
wc.hIconSm=NULL;
wc.hInstance=hInstance;
wc.lpfnWndProc=WinProc;
wc.lpszClassName=szAppName;
wc.lpszMenuName=NULL;
wc.style=CS_HREDRAW|CS_VREDRAW;
//注册窗口
RegisterClassEx(&wc);
//创建窗口
hwnd=CreateWindow(szAppName,TEXT("第一个DirectX程序"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,0);
//加载3D初始化
//if (SUCCEEDED(InitD3D(hwnd)))
//{
//显示和更新窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
//消息循环
while(msg.message!=WM_QUIT)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//转换消息
TranslateMessage(&msg);
//投递消息
DispatchMessage(&msg);
}
else
{
//渲染
Render();
}
}
/*}*/
////清除对象
//Release3D();
//删除注册窗口
UnregisterClass(szAppName,hInstance);
return msg.wParam; }
//回调函数
LRESULT CALLBACK WinProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
if (FAILED(InitD3D(hwnd)))
{
return D3D_OK;
}
return 0;
case WM_LBUTTONDOWN:
g_bFlat=!g_bFlat; //着色模式取反(平面模式和高洛德模式)
return 0;
case WM_RBUTTONDOWN:
if (1==g_iFillMode)
{
g_iFillMode=2;
}
else if (2==g_iFillMode)
{
g_iFillMode=3;
}
else if (3==g_iFillMode)
{
g_iFillMode=1;
}
return 0;
case WM_DESTROY:
//清除对象
Release3D();
//退出消息循环
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
} HRESULT InitD3D(HWND hwnd)
{
//定义接口
IDirect3D9 * g_pD3D=NULL;
//创建对象接口
if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
{
return E_FAIL;
} //获取硬件设备信息
D3DCAPS9 caps;
g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
DWORD vp=0;
if (caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING; //硬件顶点运算处理(3D处理方式)
}
else
{
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING; //软件顶点运算处理(3D处理方式)
}
//创建Direct3D设备接口
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS));
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed=TRUE;
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,vp,&d3dpp,&g_pDevic)))
{
return E_FAIL;
} //创建顶点缓冲区
if (FAILED(g_pDevic->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,CUSTOMVERTEX_FVF,D3DPOOL_DEFAULT,&g_pVertexBuff,0)))
{
return E_FAIL;
}
//填充顶点缓冲区
CUSTOMVERTEX * pvertexs=NULL;
g_pVertexBuff->Lock(0,0,(void **)&pvertexs,0);
pvertexs[0]=CUSTOMVERTEX(220.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0)); //V0
pvertexs[1]=CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0)); //V1
pvertexs[2]=CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0)); //V2 //pvertexs[3]=CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0)); //V1
pvertexs[3]=CUSTOMVERTEX(420.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255)); //V3
//pvertexs[5]=CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));//V2
g_pVertexBuff->Unlock(); //创建索引缓冲区
if (FAILED(g_pDevic->CreateIndexBuffer(6*sizeof(WORD),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&g_pIndexBuff,0)))
{
return E_FAIL;
}
//填充索引缓冲区
WORD Indices[]={0,1,2,1,3,2};
void *pIndices=NULL;
g_pIndexBuff->Lock(0,sizeof(Indices),(void **)&pIndices,0);
memcpy(pIndices,Indices,sizeof(Indices));
/*g_pIndexBuff->Lock(0,0,(void **)&pIndices,0);
pIndices[0]=0,pIndices[1]=1,pIndices[2]=2;
pIndices[3]=1,pIndices[4]=3,pIndices[5]=2;*/
g_pIndexBuff->Unlock();
//释放对象g_pD3D
ReleaseD3D(g_pD3D);
return S_OK;
}
//渲染图形
VOID Render()
{
//设置着色模式
if (g_bFlat)
{
g_pDevic->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_FLAT);
}
else
{
g_pDevic->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);
}
//设置填充模式
if (1==g_iFillMode)
{
//点填充
g_pDevic->SetRenderState(D3DRS_FILLMODE,D3DFILL_POINT);
}
else if (2==g_iFillMode)
{
//线框填充
g_pDevic->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
}
else if (3==g_iFillMode)
{
//面填充
g_pDevic->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
}
//清除后台缓冲区
g_pDevic->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(150,150,250),0,0);
//开始绘制
g_pDevic->BeginScene(); g_pDevic->SetStreamSource(0,g_pVertexBuff,0,sizeof(CUSTOMVERTEX));
g_pDevic->SetFVF(CUSTOMVERTEX_FVF);
/*g_pDevic->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);*/ g_pDevic->SetIndices(g_pIndexBuff);
g_pDevic->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2);
//结束绘制
g_pDevic->EndScene();
//从后台缓冲区复制到前台----翻转/提交
g_pDevic->Present(NULL,NULL,NULL,NULL);
} //清除对象
VOID Release3D()
{
ReleaseD3D(g_pIndexBuff);
ReleaseD3D(g_pVertexBuff);
ReleaseD3D(g_pDevic);
//ReleaseD3D(g_pD3D);
}

DX9 顶点缓存案例的更多相关文章

  1. 顶点缓存对象(VBO)

    创建VBO 绘制VBO 更新VBO 实例 GL_ARB_vertex_buffer_object扩展致力于提供顶点数组与显示列表的优势来提升OpenGL效率,同时避免它们实现上的不足.顶点缓存对象(V ...

  2. NeHe OpenGL教程 第四十五课:顶点缓存

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. OpenGL 顶点缓存对象

    顶点缓存对象(Vertex Buffer Object,简称 VBO),允许开发者根据情况把顶点数据放到显存中. 如果不用 VBO,用 glVertexPointer / glNormalPointe ...

  4. Direct3D 顶点缓存

    今天我们来学习下Direct3D的顶点和顶点缓存,首先我们需要在场景中绘制一些物体,物体都是由多个三角形组成,每一个三角形由三个顶点组成,我们来看下面一个NPC的模型 左图:正常的模型         ...

  5. hibernate 5的二级缓存案例讲解

    hibernate 5的二级缓存案例讲解 本帖最后由 鱼丸儿 于 2018-1-20 11:44 编辑 大家好,今天来记录讲解一下磕磕绊绊的hibernate5 的二级缓存配置,一条路摸到黑 那么在这 ...

  6. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存

    第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...

  7. 顶点缓存对象(VBO)【转】

    http://www.cnblogs.com/hefee/p/3824300.html 顶点缓存对象(VBO) 创建VBO 绘制VBO 更新VBO 实例 GL_ARB_vertex_buffer_ob ...

  8. Java项目中使用Redis缓存案例

    缓存的目的是为了提高系统的性能,缓存中的数据主要有两种: 1.热点数据.我们将经常访问到的数据放在缓存中,降低数据库I/O,同时因为缓存的数据的高速查询,加快整个系统的响应速度,也在一定程度上提高并发 ...

  9. 通过 Autostereograms 案例学习 OpenGL 和 OpenCL 的互操作性

    引言 在过去的十年里, GPU (图形处理单元)已经从特殊硬件(特供)转变成能够在数值计算领域开辟新篇章的高性能计算机设备. 很多算法能够使用拥有巨大的处理能力的GPU来快速运行和处理大数据量.即使在 ...

随机推荐

  1. Mysql 性能优化教程

    Mysql 性能优化教程 目录 目录 1 背景及目标 2 Mysql 执行优化 2 认识数据索引 2 为什么使用数据索引能提高效率 2 如何理解数据索引的结构 2 优化实战范例 3 认识影响结果集 4 ...

  2. LeetCode 496 Next Greater Element I 解题报告

    题目要求 You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset ...

  3. jquery键盘事件

    场景:当我们遇到onclick按钮事件时需要按回车执行时就用到了键盘监听事件 例如:<button id="sign_in_button" class="btn b ...

  4. 转: js实现全角半角检测的方法

    //全角半角校验 function issbccase(strTmp) { for (var i=0; i<strTmp.length; i++) { if (strTmp.charCodeAt ...

  5. VS2013 opencv配置

    有三个地方需要配置,在配置之前首先要将platform配置好,下面的例子是x64 Release的“ 然后需要将include.lib的路径配置好 然后将dll拷贝至编译生成的Release文件夹中即 ...

  6. 程序------>数据结构

    一程序概念: 1.对身边的任何一个事物进行认知和分类,从而得到一些信息: 2.在得到的信息基础之上建立了概念模型: 3.根据概念模型将我们生活中的实际问题转换成计算机能理解的形式: 4.用户通过人机交 ...

  7. Sql server 函数--取值年月

    GetDate()是获取当前时间 1.例如获取年月类似 201706 需要改为语句: Select Datename(year,GetDate())+Datename(month,GetDate())

  8. Hibernate的状态

    最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...

  9. awk命令分析日志的简单笔记

    awk是一个文本分析工具,可以用来进行流量日志分析 之前无意中看到了这个命令,简单记一下笔记 ,在打线下的时候可能会有用 awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gaw ...

  10. ssh 的认证原理

    SSH:Secure Shell,是一种网络安全协议,主要用于登录远程计算机的加密过程. 登录方式主要有两种: 1.基于用户密码的登录方式:   加密原理:   当服务器知道用户请求登录时,服务器会把 ...