// @time: 2012.3.22
// @author: jadeshu
// des: 索引缓存
//包含头文件
#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);
//加载D初始化
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_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; //硬件顶点运算处理(D处理方式)
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //软件顶点运算处理(D处理方式)
}
//创建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 DirectX 索引缓存(IndexBuffer) 代码的更多相关文章

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

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

  2. Direct3D 索引缓存

    小学的时候我们知道3个顶点组成一个三角形,那么四个顶点我们会说有4个三角形.这就是一个顶点同时参与了四次绘制三角形的结果. 在程序中也一样,比如我们绘制的两个三角形是挨着一起的,总有几个顶点是重合的. ...

  3. [WebGL入门]十八,利用索引缓存来画图

    注:文章译自http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明.我会加上[lufy:].另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...

  4. ajax请求或者页面需要缓存,代码如下

    缓存页面代码 1 private void setClientCache(HttpServletResponse response, int maxAgeSec) 2 { 3 long maxAgeM ...

  5. DX9 DirectX鼠标控制程序 代码

    代码实例1: // @time: 2012.3.26 // @author: jadeshu // des: DirectX鼠标控制程序 #include <Windows.h> #inc ...

  6. DX9 DirectX键盘控制程序 代码

    // @time: 2012.3.26 // @author: jadeshu // des: DirectX键盘控制程序 #include <Windows.h> #include &l ...

  7. mysql数据库性能优化(包括SQL,表结构,索引,缓存)

    优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...

  8. 【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)

    原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_ ...

  9. VC图形绘制双缓存的代码复用性讨论

    在前文中已经讨论了如何实现界面绘制双缓存的问题,前文网址如下: http://www.2cto.com/kf/201111/112429.html 双缓存的主要思路是:先把图形绘制到内存DC中,然后再 ...

随机推荐

  1. Direct3D 11 Tutorial 6:Lighting_Direct3D 11 教程6:灯光

    概述 在之前的教程中,世界看起来很无聊,因为所有对象都以相同的方式点亮. 本教程将介绍简单照明的概念及其应用方法. 使用的技术将是朗伯照明. 本教程的结果将修改前面的示例以包含光源. 该光源将附在轨道 ...

  2. android控件RecyclerView中,如何显示自定义分割线以及最后一项去除分割线

    在控件RecyclerView中,分割线DividerItemDecoration类的使用经常见,如果是使用自带的分割线,只需要这样写即可 RecyclerView mRecyclerView; mR ...

  3. umi中使用scss

    在umi中可以直接使用css,但是并不支持scss,我们需要加两个loader, 直接npm安装 node-sass和sass-loader 即可,剩余的事情umi已经帮我们做好了. npm i -- ...

  4. 使用ReentrantLock和Condition来代替内置锁和wait(),notify(),notifyAll()

    使用ReentrantLock可以替代内置锁,当使用内置锁的时候,我们可以使用wait() nitify()和notifyAll()来控制线程之间的协作,那么,当我们使用ReentrantLock的时 ...

  5. CentOS7.X中设置nginx和php-fpm的开机自启动

    一.设置nginx的开机自启动方法 1.在/etc/init.d/目录下创建nginx文件 vi /etc/init.d/nginx 编写内容如下: #!/bin/sh # # nginx - thi ...

  6. JBPM工作流(七)——详解流程图

    概念: 流程图的组成: a. 活动 Activity / 节点 Node b. 流转 Transition / 连线(单向箭头) c. 事件 1.流转(Transition) a) 一般情况一个活动中 ...

  7. Java 中的 List —— 有序序列

    List 在 java 中是个有序序列: 一.容量 ArrayList 中有一个容量概念,表示基础数组的大小(无参时默认为 10).在需要的时候(比如 add操作)会自动增加其容量.LinkedLis ...

  8. html5与css 1. web标准及组成

    学习目标 1.本专业介绍.HTML相关概念,HTML发展历史 2.WEB标准,W3C/WHATWG/ECMA相关概念 3.相关软件的应用以及站点的创建 4.HTML基本结构和HTML语法 5.HTML ...

  9. 对象copy的两种方式--序列化--clone

    对象实现copy有多中方式,最土的方法就是直接new,然后塞值,不过这种方法是真的low,下面着重说说Object类中的clone() 和 序列化反序列化copy Object 中 clone的方法 ...

  10. Java中的日期格式转化

    package lianxi; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util ...