使用DX9实例化(Instancing)模拟Tessellation.doc.docVIP

使用DX9实例化(Instancing)模拟Tessellation.doc.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用DX9实例化(Instancing)模拟Tessellation.doc

使用DX9几何实例化(Instancing)模拟Tessellation Heatonlan 本文不是介绍DX11Tessellation的使用,也不是直接用DX9去模拟DX11的3个Tessellation Stage,而是在DX9下通过一种比较简单的方法让一个模型做Tessellation,进而思考更多的可能性。 通常情况,几何实例化(Instancing)一个5000三角面的模型,16个实例,将产生一次16个5000面的渲染,结果是不同位置朝向和颜色等的16个实例;设象一下另外一种情况,将这个模型每个三角面都Tessellation成16个小三角形(标记为Tri0-Tri15),假设第一个实例是所有的Tri0构成的部分,第二个是所有Tri1构成的,以此类推,共16个实例;综合以上两点,设想首先让16个5000面的实例先重叠在一起,然后分别计算出各个实例对应的Tri0到Tri15,这样就完成了提交16个实例5000面模型到16 x 5000面一个模型的转变,具体如下: 均匀的Tessellation(每个三角形Tessellation成一样数量) 1.处理原模型:让每个顶点包含整个三角面的信息,并且记录当前顶点在这个三角形的顺序0或1或2. 示例顶点结构 struct PatchTessellation { D3DXVECTOR3 pos0; D3DXVECTOR3 pos1; D3DXVECTOR3 pos2; D3DXVECTOR2 uv0; D3DXVECTOR2 uv1; D3DXVECTOR2 uv2; DWORD v012;//顶点顺序 }; 生成Tessellation Palette:以5000面16实例为例子,这里会生成16组参数,每组9个值,对应某个小三角形(Tri0到Tri15)的三个顶点在大三角形的权重. 示例代码 //tessellation palette void CalcWeightNew( int j0, int i0, int j1, int i1, int j2, int i2, int ijMax,//3 index pair D3DXVECTOR3 w0, D3DXVECTOR3 w1, D3DXVECTOR3 w2) { // ^ // | // p0 (i = 0) // | \ // | \ // | \ // p1--------p2--j // (0,0) // | \ // | \ //(1,0)---(1,1) // | \ | \ // | \ | \ //(2,0)---(2,1)--(2,2) // w0.x = 1.f - (float)i0 / (float)ijMax; w0.y = (float)(i0 - j0) / (float)ijMax; w0.z = (float)j0 / (float)ijMax; w1.x = 1.f - (float)i1 / (float)ijMax; w1.y = (float)(i1 - j1) / (float)ijMax; w1.z = (float)j1 / (float)ijMax; w2.x = 1.f - (float)i2 / (float)ijMax; w2.y = (float)(i2 - j2) / (float)ijMax; w2.z = (float)j2 / (float)ijMax; } //process for level n // level = 3 // 0 \---1---2---3 // | \ \ | \ | \ | // 4---5 \---6---7 // | \ | \ \ | \ | // 8---9--10 \--11 // | \ | \ | \ \ | // 12--13--14--15 for (int i = 0; i level; ++i) { for (int j = 0; j = i; ++j) { D3DXVECTOR3 weight[3]; // 0 // |\ // |_\ // 1 2 CalcWeightNew( j, i, j, i+1, j+1, i+1, level, weight[0], weight[1], weight[2]); // copy weight[3] to instancing buffer, and instancing buffer++ // 0__2

文档评论(0)

book1986 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档