顶点(索引)缓存:缓存和平时用的数组基本上一样。我们用缓存来存取数据,是因为缓存可以放到显卡中去,这样一来,存取速度就比系统内存会很多倍。本文中通过两个demo,来说明顶点缓存和索引缓存。
投影:投影是指n维图形变成n-1维的过程。
相机:
用的是框架,不变的部分就不在此贴出。
//放在头文件里比较好
//定义顶点数据结构
struct Vertex
{
float x, y, z;
Vertex(float a ,float b,float c) {
x = a;
y = b;
z = c;
}
};
#define FVF_Vertex (D3DFVF_XYZ)
bool Setup()
{
//步骤一
Device->CreateVertexBuffer(
//设置顶点缓存可存3个顶点
4 * sizeof(Vertex),
//顶点缓存无附加属性
0,
//顶点格式
D3DFVF_XYZ,
D3DPOOL_MANAGED,
//顶点缓存指针
&vb,
//索引缓存指针
0
);
//访问顶点缓存中的数据
Vertex *vertexs;
//先加锁
vb->Lock(0, 0, (void**)&vertexs, 0);
//像缓存区中存顶点数据
vertexs[0] = Vertex(-1.0f, 0.0f, 2.0f);
vertexs[1] = Vertex(0.0f, 1.0f, 2.0f);
vertexs[2] = Vertex(1.0f, 0.0f, 2.0f);
vertexs[3] = Vertex(0.0f, -1.0f, 2.0f);
vb->Unlock();
//步骤二
D3DXMATRIX proj;
//设置投影 n维变n-1维
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI*0.5f,
(float)1000 / (float)800,
1.0f,
1000.0f
);
Device->SetTransform(D3DTS_PROJECTION, &proj);
//使用线框模式绘制物体
//Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
Device->SetFVF(D3DFVF_XYZ );
//以上顶点缓存创建并设置完成。
//将顶点缓存和数据流进行对接
Device->SetStreamSource(0, vb, 0, sizeof(Vertex));
Device->SetIndices(ib);
//世界坐标系
D3DXMATRIX worldmatrix;
D3DXMatrixTranslation(&worldmatrix, 0.0f, 0.5f, 0.0f);
Device->SetTransform(D3DTS_WORLD, &worldmatrix);
/*
//设置相机
D3DXVECTOR3 postiton(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 0.5f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &postiton, &target, &up);
//设置观察相机
Device->SetTransform(D3DTS_VIEW, &V);
//视口装换
D3DVIEWPORT9 vps = { 0,0,640,480,0,1 };
Device->SetViewport(&vps);
*/
return true;
}
//步骤三
bool Display(float timeDelta)
{
if (Device) // Only use Device methods if we have a valid device.
{
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
Device->BeginScene();
//有三种图元(点,线,三角形 ) 供选择。这里选择三角形
Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
//Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
Device->EndScene();
// Swap the back and front buffers.
Device->Present(0, 0, 0, 0);
}
return true;
}
用的是框架,不变的部分就不在此贴出。
//放在头文件里比较好
//定义顶点数据结构
struct Vertex
{
float x, y, z;
Vertex(float a ,float b,float c) {
x = a;
y = b;
z = c;
}
};
#define FVF_Vertex (D3DFVF_XYZ)
bool Setup()
{
//步骤一:
Device->CreateVertexBuffer(
//设置顶点缓存可存4个顶点
4 * sizeof(Vertex),
//顶点缓存无附加属性
0,
//顶点格式
D3DFVF_XYZ,
D3DPOOL_MANAGED,
//顶点缓存指针
&vb,
//索引缓存指针
0
);
//步骤二
Device->CreateIndexBuffer(
36 * sizeof(WORD),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&ib,
0
);
//访问顶点缓存中的数据
Vertex *vertexs;
//先加锁
vb->Lock(0, 0, (void**)&vertexs, 0);
//像缓存区中存顶点数据
vertexs[0] = Vertex(-1.0f, 0.0f, 2.0f);
vertexs[1] = Vertex(0.0f, 1.0f, 2.0f);
vertexs[2] = Vertex(1.0f, 0.0f, 2.0f);
vertexs[3] = Vertex(0.0f, -1.0f, 2.0f);
vb->Unlock();
//三角形列表
WORD * index = 0;
ib->Lock(0, 0, (void**)&index, 0);
index[0] = 0 ;
index[1] = 1 ;
index[2] = 2 ;
index[3] = 0 ;
index[4] = 2 ;
index[5] = 3 ;
ib->Unlock();
//步骤三
D3DXMATRIX proj;
//设置投影 n维变n-1维
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI*0.5f,
(float)1000 / (float)800,
1.0f,
1000.0f
);
Device->SetTransform(D3DTS_PROJECTION, &proj);
//使用线框模式绘制物体
//Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
Device->SetFVF(D3DFVF_XYZ );
//以上顶点缓存创建并设置完成。
//将顶点缓存和数据流进行对接
Device->SetStreamSource(0, vb, 0, sizeof(Vertex));
Device->SetIndices(ib);
//世界坐标系
D3DXMATRIX worldmatrix;
D3DXMatrixTranslation(&worldmatrix, 0.0f, 0.5f, 0.0f);
Device->SetTransform(D3DTS_WORLD, &worldmatrix);
/*
//设置相机
D3DXVECTOR3 postiton(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 0.5f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &postiton, &target, &up);
//设置观察相机
Device->SetTransform(D3DTS_VIEW, &V);
//视口装换
D3DVIEWPORT9 vps = { 0,0,640,480,0,1 };
Device->SetViewport(&vps);
*/
return true;
}
void Cleanup()
{
// Nothing to cleanup in this sample.
}
//步骤四
bool Display(float timeDelta)
{
if (Device) // Only use Device methods if we have a valid device.
{
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
Device->BeginScene();
//有三种图元(点,线,三角形 ) 供选择。这里选择三角形
Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
Device->EndScene();
// Swap the back and front buffers.
Device->Present(0, 0, 0, 0);
}
return true;
}
单使用顶点缓存画图是不行的,如果你想画些复杂图形,比如正方体,你就得重复很多个顶点。所以最好将顶点缓存和索引缓存结合起来使用
参考书籍
《DirectX 9.0 3D游戏开发基础》