Direct基础学习系列3 绘制+实例
3.1.1顶点缓存 索引缓存
放置在显存中能够加快绘制速度
创建顶点缓存
HRESULT CreateVertexBuffer(
UINT Length, //为缓存分配的字节数
DWORD Usage, //缓存附加属性,可为0
DWORD FVF, //顶点格式
D3DPOOL Pool, //缓存的内存池
IDirect3DVertexBuffer9** ppVertexBuffer, //返回的结构
HANDLE* pSharedHandle //不用 设置为0
);
创建索引缓存
HRESULT CreateIndexBuffer(
UINT Length,
DWORD Usage,
D3DFORMAT Format,
D3DPOOL Pool,
IDirect3DIndexBuffer9** ppIndexBuffer,
HANDLE* pSharedHandle
);
Usage != D3DUSAGE_DYNAMIC 放置在静态缓存中,适合处理运行中不需要修改的数据
Usage = D3DUSAGE_DYNAMIC 放置在动态缓存,适合频繁更新内容,如粒子系统,动态缓存放置在内存AGP区域,可以很快的被更新
3.1.2访问数据
HRESULT Lock(
UINT OffsetToLock, //缓存中的起始点
UINT SizeToLock, //需要锁定的数目
VOID ** ppbData, //返回的被锁定的缓存区起始位置
DWORD Flags //锁定方式:
);
BOOL Unlock();
3.1.3获得顶点缓存信息
typedef struct D3DVERTEXBUFFER_DESC {
D3DFORMAT Format;
D3DRESOURCETYPE Type;
DWORD Usage;
D3DPOOL Pool;
UINT Size;
DWORD FVF;
} D3DVERTEXBUFFER_DESC, *LPD3DVERTEXBUFFER_DESC;
typedef struct D3DINDEXBUFFER_DESC {
D3DFORMAT Format;
D3DRESOURCETYPE Type;
DWORD Usage;
D3DPOOL Pool;
UINT Size;
} D3DINDEXBUFFER_DESC, *LPD3DINDEXBUFFER_DESC;
IDirect3DIndexBuffer9::GetDesc();
3.2 绘制状态
HRESULT SetRenderState(
[in] D3DRENDERSTATETYPE State,
[in] DWORD Value
);
3.3绘制准备工作
(1)制定数据流输入源
HRESULT SetStreamSource(
UINT StreamNumber, //数据流 可以是多个
IDirect3DVertexBuffer9 * pStreamData,//建立数据流的缓存
UINT OffsetInBytes, //被传送到绘制流水线顶点数据的起始位置
UINT Stride //顶点缓存的大小
);
(2)设置顶点格式
HRESULT SetFVF( DWORD FVF); 顶点格式如下:
(3)设置使用的索引,任意时刻只能有一个索引缓存,如果不同索引绘制物体时,必须进行切换
HRESULT SetIndices(
IDirect3DIndexBuffer9 * pIndexData
);
3.4 绘制方法
使用顶点绘制
HRESULT DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType, //绘制的图元类型,TRIANGLELIST
UINT StartVertex, //绘制起点索引
UINT PrimitiveCount //绘制的图元数量
);
采用索引绘制
HRESULT DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type,
INT BaseVertexIndex, //物体顶点在全局缓存中的起始位置偏移
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);
绘制在下列函数之间进行
IDirect3DDevice9::BeginScene()
IDirect3DDevice9::EndScene()
实例:看完代码之后 多的一层了解:
(1)世界变换矩阵,取景变换矩阵,投影变换矩阵设置后 在绘图中起作用
(2)缓存中其实就在准备数据
1:
2: #include "d3dUtility.h"
3:
4: IDirect3DDevice9* Device = 0;
5:
6: const int Width = 640;
7: const int Height = 480;
8:
9: IDirect3DVertexBuffer9* VB = 0;
10: IDirect3DIndexBuffer9* IB = 0;
11:
12: //顶点格式定义
13: struct Vertex
14: {
15: Vertex(){}
16: Vertex(float x, float y, float z)
17: {
18: _x = x; _y = y; _z = z;
19: }
20: float _x, _y, _z;
21: static const DWORD FVF;
22: };
23: //全局定点格式
24: const DWORD Vertex::FVF = D3DFVF_XYZ;
25:
26: //
27: // Framework Functions
28: //
29: bool Setup()
30: {
31: // Create vertex and index buffers.
32: Device->CreateVertexBuffer(
33: 8 * sizeof(Vertex),
34: D3DUSAGE_WRITEONLY,
35: Vertex::FVF,
36: D3DPOOL_MANAGED,
37: &VB,
38: 0);
39: Device->CreateIndexBuffer(
40: 36 * sizeof(WORD),
41: D3DUSAGE_WRITEONLY,
42: D3DFMT_INDEX16,
43: D3DPOOL_MANAGED,
44: &IB,
45: 0);
46:
47:
48: // 填充数据
49: Vertex* vertices;
50: VB->Lock(0, 0, (void**)&vertices, 0);
51:
52: // vertices of a unit cube
53: vertices[0] = Vertex(-1.0f, -1.0f, -1.0f);
54: vertices[1] = Vertex(-1.0f, 1.0f, -1.0f);
55: vertices[2] = Vertex( 1.0f, 1.0f, -1.0f);
56: vertices[3] = Vertex( 1.0f, -1.0f, -1.0f);
57: vertices[4] = Vertex(-1.0f, -1.0f, 1.0f);
58: vertices[5] = Vertex(-1.0f, 1.0f, 1.0f);
59: vertices[6] = Vertex( 1.0f, 1.0f, 1.0f);
60: vertices[7] = Vertex( 1.0f, -1.0f, 1.0f);
61:
62: VB->Unlock();
63:
64: // define the triangles of the cube:
65: WORD* indices = 0;
66: IB->Lock(0, 0, (void**)&indices, 0);
67:
68: // front side
69: indices[0] = 0; indices[1] = 1; indices[2] = 2;
70: indices[3] = 0; indices[4] = 2; indices[5] = 3;
71:
72: // back side
73: indices[6] = 4; indices[7] = 6; indices[8] = 5;
74: indices[9] = 4; indices[10] = 7; indices[11] = 6;
75:
76: // left side
77: indices[12] = 4; indices[13] = 5; indices[14] = 1;
78: indices[15] = 4; indices[16] = 1; indices[17] = 0;
79:
80: // right side
81: indices[18] = 3; indices[19] = 2; indices[20] = 6;
82: indices[21] = 3; indices[22] = 6; indices[23] = 7;
83:
84: // top
85: indices[24] = 1; indices[25] = 5; indices[26] = 6;
86: indices[27] = 1; indices[28] = 6; indices[29] = 2;
87:
88: // bottom
89: indices[30] = 4; indices[31] = 0; indices[32] = 3;
90: indices[33] = 4; indices[34] = 3; indices[35] = 7;
91:
92: IB->Unlock();
93:
94: D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);
95: D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
96: D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
97: D3DXMATRIX V;
98:
99: D3DXMatrixLookAtLH(&V, &position, &target, &up);
100: //设置取景变换矩阵
101: Device->SetTransform(D3DTS_VIEW, &V);
102:
103: // Set the projection matrix.
104: D3DXMATRIX proj;
105: D3DXMatrixPerspectiveFovLH(
106: &proj,
107: D3DX_PI * 0.5f, // 90 - degree
108: (float)Width / (float)Height,
109: 1.0f,
110: 1000.0f);
111:
112: //设置投影变换矩阵
113: Device->SetTransform(D3DTS_PROJECTION, &proj);
114:
115: //设置绘图模式
116: Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
117:
118: return true;
119: }
120:
121: void Cleanup()
122: {
123: d3d::Release<IDirect3DVertexBuffer9*>(VB);
124: d3d::Release<IDirect3DIndexBuffer9*>(IB);
125: }
126:
127: bool Display(float timeDelta)
128: {
129: if( Device )
130: {
131: // spin the cube:
132: D3DXMATRIX Rx, Ry;
133:
134: // rotate 45 degrees on x-axis
135: D3DXMatrixRotationX(&Rx, 3.14f / 4.0f);
136:
137: // incremement y-rotation angle each frame
138: static float y = 0.0f;
139: D3DXMatrixRotationY(&Ry, y);
140: y += timeDelta; // 每帧增加旋转量
141:
142: // reset angle to zero when angle reaches 2*PI
143: if( y >= 6.28f )
144: y = 0.0f;
145:
146: // combine x- and y-axis rotation transformations.
147: D3DXMATRIX p = Rx * Ry;
148:
149: //设置世界变换矩阵
150: Device->SetTransform(D3DTS_WORLD, &p);
151:
152: //
153: // draw the scene:
154:
155: //清除背景
156: Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
157: Device->BeginScene();
158:
159: //设置数据源
160: Device->SetStreamSource(0, VB, 0, sizeof(Vertex));
161:
162: //设置使用的索引
163: Device->SetIndices(IB);
164:
165: //
166: Device->SetFVF(Vertex::FVF);
167:
168: // Draw cube.
169: Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);
170:
171: Device->EndScene();
172: Device->Present(0, 0, 0, 0);
173: }
174: return true;
175: }
176:
177:
178: //
179: // WndProc
180: //
181: LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
182: {
183: switch( msg )
184: {
185: case WM_DESTROY:
186: ::PostQuitMessage(0);
187: break;
188:
189: case WM_KEYDOWN:
190: if( wParam == VK_ESCAPE )
191: ::DestroyWindow(hwnd);
192: break;
193: }
194: return ::DefWindowProc(hwnd, msg, wParam, lParam);
195: }
196:
197: //
198: // WinMain
199: //
200: int WINAPI WinMain(HINSTANCE hinstance,
201: HINSTANCE prevInstance,
202: PSTR cmdLine,
203: int showCmd)
204: {
205: if(!d3d::InitD3D(hinstance,
206: Width, Height, true, D3DDEVTYPE_HAL, &Device))
207: {
208: ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
209: return 0;
210: }
211:
212: if(!Setup())
213: {
214: ::MessageBox(0, "Setup() - FAILED", 0, 0);
215: return 0;
216: }
217:
218: d3d::EnterMsgLoop( Display );
219:
220: Cleanup();
221:
222: Device->Release();
223:
224: return 0;
225: }
Direct基础学习系列3 绘制+实例的更多相关文章
- Linux基础学习系列目录导航
Linux基础学习-通过VM安装RHEL7.4 Linux基础学习-命令行与图形界面切换 Linux基础学习-基本命令 Linux基础学习-RHEL7.4之YUM更换CentOS源 Linux基础学习 ...
- Bootstrap基础学习 ---- 系列文章
[Bootstrap基础学习]05 Bootstrap学习总结 [Bootstrap基础学习]04 Bootstrap的HTML和CSS编码规范 [Bootstrap基础学习]03 Bootstrap ...
- DirectX 基础学习系列6 字体
DIRECTX9自带ID3DXFONT类 内部调用GDI的接口,效率一般,但能够处理一些复杂的字体 HRESULT D3DXCreateFontIndirect( LPDIRECT3DDEVICE9 ...
- 【MongoDB安装和基础学习系列】
转:http://www.cnblogs.com/lipan/archive/2011/03/08/1977691.html 系列目录 MongoDB学习笔记(一) MongoDB介绍及安装 ...
- Python零基础学习系列之二--Python介绍及环境搭建
1-1.Python简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像P ...
- Python零基础学习系列之三--Python编辑器选择
上一篇文章记录了怎么安装Python环境,同时也成功的在电脑上安装好了Python环境,可以正式开始自己的编程之旅了.但是现在又有头疼的事情,该用什么来写Python程序呢,该用什么来执行Python ...
- javascript基础学习系列-DOM盒子模型常用属性
最近在学习DOM盒子模型,各种属性看着眼花缭乱,下面根据三个系列来分别介绍一下: client系列 clientWidth :width+(padding-left)+(padding-right)— ...
- Python零基础学习系列之四--Python程序设计思想
前面我们把Python环境安装成功,同时也选择了自己合适的IDE工具来开启自己的编程之旅. 那么今天来说说怎么编程,程序设计需要什么步骤,我们应该怎么做才能编写自己的程序. 1-1.程序设计方法: I ...
- JavaScript零基础学习系列四
案例分享 对象 具体的东西,在以js的眼光看所有的标签都是标签对象,对象是属性的无序集合. 创建对象有两种方式: 直接量: 构造器:所谓的构造器,其实就是函数,只不过这个函数有些特殊,因为它是用于创建 ...
随机推荐
- loj 1025(记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25902 #include<iostream> #inc ...
- enter键实现自动登录
将登录窗口的属性acceptbutton更改为登录按钮!
- Effective C++ 学习笔记[2]
2. 第一节 习惯C++ 2.1 C++是一个语言联邦,包括以下四个部分: C:包括区块.语句.预处理器.内置数据类型.数组.指针等,但是C语言本身存在局限:没有模板template.没有异常exce ...
- sql2005 将一列的多行内容拼接成一行
select ID, Name = ( stuff ( ( select ',' + Name from Table_1 where ID = a.ID for xml path('') ),1,1, ...
- HDU2196 Computer(树形DP)
和LightOJ1257一样,之前我用了树分治写了.其实原来这题是道经典的树形DP,感觉这个DP不简单.. dp[0][u]表示以u为根的子树中的结点与u的最远距离 dp[1][u]表示以u为根的子树 ...
- PO3281 Dining(最大流)
如果只有食物或者饮料那就是个二分图最大匹配. 三个真想不出来..然后看题解..从源点到食物到牛到饮料到汇点,这样建图. 所以思维不能太局限了,不懂得把食物和饮料放到牛两边,以为牛吃食物饮料.食物饮料被 ...
- Unity3D Built-in Shader详解一
Unity3D内置了很多Shader,文档很详细,自己翻一下.便于加深印象. 首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微 ...
- C#线程间同步无法关闭
用C#做了个线程间同步的小程序,但每次关闭窗口后进程仍然在,是什么原因? 解决方法: 要加一句 线程.IsBackground = true; 否则退出的只是窗体 上面的方法没看懂... MSDN上说 ...
- Robotium查找指定控件
一.通过ID查找控件 Activity act=solo.getCurrentActivity(): int id=act.getResources().getIdentifier("id名 ...
- Mono for Android 篇二 使用Spinner 实现下拉列表读取Browser.BookmarksUri
http://www.cnblogs.com/ivanyb/archive/2013/03/05/2944818.html 1.首先在VS2010里面创建一个Android Application 简 ...