direct高手进!使用顶点索引方式,顶点和纹理顶点如何处理

pjl110 2010-09-03 10:33:13
众所周知,对于同一个三维模型,如果不使用默认贴图方式的话。顶点和纹理顶点的的数量是不一样。
纹理顶点的数量要比顶点的数量要多。

那麽:

struct CUSTOMVERTEX1
{
D3DXVECTOR3 position; //顶点坐标
D3DXVECTOR3 normal; //顶点法线
float tu, tv; //纹理坐标
};
#define D3DFVF_CUSTOMVERTEX1 (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)

这样定义顶点肯定就有问题啦!
因为这里是一个顶点对应一个纹理顶点!

而我现在已知的处理方法无非是:
pDevice->SetFVF( D3DFVF_CUSTOMVERTEX1 );
pDevice->SetStreamSource( 0, pVB1, 0, sizeof(CUSTOMVERTEX1) );
pDevice->SetIndices( pIB1 );
pDevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)4, 0, 0,4,0, 1 );

顶点和纹理顶点都存在pVB1里!

请问是不是direct还有别的处理方法可以把纹理顶点和顶点分别储存,然后再绘制!

还是把顶点的数量增加成纹理顶点的数量,然后进行绘制!

后一种方法当然可行,可是这样理论上文件讲不是大了么?
再说我看3dmax里面mesh的纹理顶点和顶点也是分开储存的啊!

求教高手!

先给20分,给出正确答案必定追加!
...全文
367 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lymastee 2010-09-03
  • 打赏
  • 举报
回复
2种方法,

1.分割顶点,只要1个顶点在UV上被分割成N个,就把这个顶点当成N个写入
2.对顶点和贴图坐标分别寻址,这有不同的实现方法,你可以重写渲染管线,也可以用多重坐标模拟
也就是 D3D_TEX1 | D3D_TEX2 | .....

但是这并不容易做到,必须在多个通道里对齐纹理坐标
对齐的方式可以利用坏三角不参与绘制的原则
也就是说从顶点索引看,1,2,3这样是一个正常三角形,它参与绘制; 1,1,3这就是一个坏三角,不参与绘制.
你就在不同贴图通道上凑三角形就行了

简单思路就是这样的,但是实际做起来很困难,LZ可以试试
CSharp_XinBing 2010-09-03
  • 打赏
  • 举报
回复
是啊,比较方便的方法就是按纹理坐标对顶点坐标进行扩展,虽然这种方法会增加内存。
gamemagic 2010-09-03
  • 打赏
  • 举报
回复
楼上正解。所以很多模型导出插件都是根据纹理的不同来导出面
这样就节省空间且可以共用顶点
xingzhe2001 2010-09-03
  • 打赏
  • 举报
回复
实际上就是这样的--->还是把顶点的数量增加成纹理顶点的数量,然后进行绘制!
你说的第二种。比如你要画一个立方体,要贴图就不能用8个定点了,要24个顶点,因为帖图坐标是24个
pjl110 2010-09-03
  • 打赏
  • 举报
回复
嗯!好的,既然大家都这么说!我就用第二种方法了!

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧