翁云兵老师的《3D游戏程序设计入门》
1、顶点格式
顶点不仅可以表示坐标,还可以给它赋予法线、纹理坐标。在GAMES101中提到,这些是可以在将来进行重心插值的。比如Ground shading就是对顶点进行着色,然后再进行重心插值。这里对顶点着色势必要考虑到顶点法线与光照的夹角。
DX9的顶点格式一般使用自由标记FVF。
2、顶点和索引之间的关系组成了图元
目前只使用三角形图元。DX9将所有的顶点放置在一个很大的数组中,然后使用索引告诉编译器怎么去组装图元。如果不告诉那就顺序3个3个一组
3、裁剪
熟悉完MVP矩阵和视口变换后,三维物体就可以显现在二维的平面上了。但是如果放大图形,由于我们的屏幕只有这么大,因此需要进行裁剪。裁剪算法可以去B站上看孔令德老师的cohen sutherland裁剪算法
4、渲染管线 (稍后补充,有点忘了)
记一种渲染管线的描述即可:
顶点数据 -> 顶点着色阶段(模型变换,视图变换,顶点着色)->几何着色阶段 -> 光珊瑚
5、DX9的绘制
【注】这里所有的设置肯定是对device而言的。结合上之前说的,先创建IDirect3D指针对象,通过指针对象获取到IDirect3DDevice9指针对象。这个对象承接了接下来我们所有的操作。
- 创建顶点缓冲区和索引缓冲区
- 分别加锁写入数据后,再解锁
- 设置模型变换矩阵、视图变换矩阵和投影变换矩阵(这里如果设置了旋转效果,那么就要将模型变换矩阵放置在消息循环中进行显示)
- 设置渲染状态:点渲染、面渲染、线框渲染
- 设置资源流绑定顶点缓冲区和设置顶点
- 所有的绘制要在device->beginScene()和device->EndScene()中进行绘制
- 使用索引信息绘制图元,则需要在beginScene之前加上
device->SetIndices(IB); //设置索引缓冲区
device->beginScene()
device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12)
device->EndScene() - 不使用索引,则可以不用加这句
device->beginScene()
device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);
device->EndScene()
6、顶点缓冲区 - 首先创建缓冲区
IDirect3DvertexBuffer9* vb;
device->CreateVertexBuffer(
8 * sizeof(Veretx),
0,
D3DFVF_XYZ,
D3DPOOL_MANAGED,
&vb,
0); - 使用Lock方法加锁,写入数据后,再解锁
Vertex* vertices;
vb->Lock(0, 0, (void**)&vertices, 0);
vertices[0] = Vertex(-1.0f, 0.0f, 2.0f);
vertices[1] = Vertex(0.0f, 1.0f, 2.0f);
vertices[2] = Vertex(1.0f, 0.0f, 2.0f);
vb->Unlock();
7、索引缓冲区 - 首先创建缓冲区
IDirect3DIndexBuffer9* ib;
device->CreateVertexBuffer(
36 * sizeof(WORD),
D3DFMT_INDEX16
D3DPOOL_MANAGED,
&ib,
0); - 使用Lock方法加锁,写入数据后,再解锁
WORD* indices;
ib->Lock(0, 0, (void**)&vertices, 0);
indices[0] = 0; indices[1] = 1; indices[2] = 2;
indices[3] = 0; indices[4] = 2; indices[5] = 3;
ib->Unlock();