"你能不能快点写呀?",一个做游戏策划的朋友在网上问我。没想到我写的这篇教程还是有人关心的嘛,呵呵,嘴里虽然不说什么,但心里还是有一点小小的得意^_^。
本来打算这次讲摄象机的,但发现还有一个很重要的渲染方法没有讲,那就是 索引 顶点的渲染,这个要是不说的话,以后做到MAX插件导出的时候就会一头雾水了,为什么?因为我就是在还没有搞清楚这个的时候就去做插件了。 什么是 索引 顶点呢?上次我们讲的渲染是直接把所有 顶点的数据按顺序放到 顶点缓冲中,然后每次取3个点的数据出来渲染成一个三角形,但是大家有没有考虑过,在一个3D模型中一个点可能要同时处于多个三角形面上,如果直接把 顶点数据放进缓冲区,那么重复的 顶点就会占用多余的内存。 怎么解决这个问题呢? 答案就是我们今天的主题-- 索引 顶点! 我们把 顶点的具体数据和代表三角形的3个 顶点的 索引分开, 顶点数据还是放到 顶点缓冲区中,方法同上回。 今天我们这样用5个 顶点做例子: // 顶点原始数据 这五个点具体到图上是这样的: ![]() 那索引数据放到哪里呢?我们需要用到一个叫做索引缓冲的东西,看程序: LPDIRECT3DINDEXBUFFER8 g_pIB = NULL; // 索引缓冲区 // 创建索引缓冲区 创建的方法和上次讲的顶点缓冲大同小异,创建好了后,我们填入数据: // 填充顶点缓冲区 好,六个点正好是两个三角形,按我们添的数据,这两个三角形应该是这样的: ![]() 现在我们就有了两个缓冲区,一个顶点缓冲区,放了5个原始顶点的数据;一个索引缓冲区,放了6个索引值,代表了两个三角形的面。 // --渲染图形-- // 指定自定义的FVF // 渲染 和上回的渲染部分比较一下,很明显,多了一个SetIndeces()的步骤。还有就是最后的渲染也由DrawPrimitive()变成了 DrawIndexedPrimivive()。 D3DPRIMITIVETYPE Type, // 渲染类型(点、线、面等) 具体程序运行的效果如下(万幸和设想的正好是一样): 无论是2D或是3D绘制,顶点的使用是一个重要的课题,顶点的使用与座标息息相关,这也就是为何之前一直在谈论座标系统的原因。 ![]()
![]()
![]()
int v_ord[][] = {{0, 1, 2, 3}, {0, 7, 6, 1}, {4, 5, 6, 7},
{2, 5, 4, 3}, {0, 3, 4, 7}, {1, 6, 5, 2}};
import java.awt.*;
![]() |
一个正方体的顶点索引 CUSTOMVERTEX_CUBE modelDef[] = { 0.5f, -0.5f, -0.5f, D3DCOLOR_ARGB(255, 127, 127, 127), 1.0, 1.0 }, // 0(顶点索引编号)
|