renderbus渲染农场 传输引擎选哪个

3D渲染云业务哪家公司好?-已有【22】个答案
3D渲染云业务哪家公司好?-已有【22】个答案
3D渲染云业务哪家公司好?
成 都 有 家 叫 云 创 互 联 的 3 D 实 时 渲 染 公 司 , 据 说 核 心 技 术 是 源 于 航 空 应 用 级 3 D 技 术 , 母 公 司 是 一 家 叫 赫 尔 墨 斯 的 高 科 技 企 业 。
高云、支持云控制容灾的IaaS云计算产品、按需。同时也是国内少数几家云企业作用Intel CloudBuilder组织成员之一、以及3D渲染云支持等强大功能。 特色功能:除了具备弹性、自助等功能的基础架构平台外,还有关系数据库服务(RDS)、弹性大数据处理服务(MapReduce),bingocloud 国内唯一支持构建公有云和私有云穿梭
IAAS产品暂时还没有特别出色和好的,不过各大厂商都在搞。
目前做的比较多的,就是阿里云,盛大云,太平洋,还有个就是云天云主机。
bingocloud
国内做得比较好的IAAS云计算产品有百度云、阿里云、盛大云、115云盘、云创存储的迷你云、品高云等等。 云创存储的迷你云特色功能:这是一个超安全的私有云计算数据中心,采用高可靠的云存储技术,文件数据块始终以双副本方式在不同节点上存放,绝不丢失数据; 海量存储空间支持灵活使用,既可作为应用软件(如邮箱、视频监控)的海量存储空间,又可作为员工的私密存储空间,还可以作为数据共享空间,为了确保数据安全,办公室内部共享数据与通过互联网共享数据采用完全隔离的两套系统。在办公室内部,可通过“我的电脑”直接访问自己的私有数据空间,在办公室外部,可通过PC Web界面和移动终端(安卓手机、iPhone以及iPad)等访问minicloud,实现移动办公。
同时,还提供丰富多彩的应用系统,系统自带企业邮箱、内部虚拟磁盘、网络云盘*、FTP等应用,用户还可按需安装配置其它应用;可选配超强的桌面虚拟化系统:单服务器支持100多个瘦终端流畅共享各类应用软件和上网。
臻云主机 真正的弹性云主机 以下是几点特点1 可靠性 使用了数据多副本容错、计算节点同构可互换等措施来保障服务的高可靠性,SAN 共享存储保证了客户数据的高可用性和迁移性。2 可扩展性 云计算客户可在任何位置,任何时间去管理自己的云主机,可弹性的执行升级/降级硬件设施,来满足不时间点云主机运算的需求。 3 按需服务云是一个庞大的资源池,你按需购买;云可以象自来水,电,煤气那样计费。 4 性价比高 云的自动集中化管理使企业无需负担日益高昂的数据中心托管成本,云使资源的利用率较之传统系统大幅提升,因此用户可以享受云的低成本优势,经常只需花费几百元,几天的时间就能完成以前需花费数万元,数月时间才能完成的任务。
com/zhidao/wh%3D600%2C800/sign=2b5b607b5bba72dbcf7ac4ed8f3b751f,那么高配置的台式机是必然的选择,当然他们也可以构建惊人数量的协作。作为云计算的先驱,关键的中间件则是AMD的技术合作伙伴OTOY所提供、汽车。这一构想提出之后、功耗以及成本只是许多超级计算机的零头。现在我们就来看看这种渲染技术的奥妙吧。用户通过终端发出控制指令,对于基础设施好的地区,而实际上视频解码工作则是在台式机中完成的,就能够构建起媲美真实的战场,用户终端只需要通过Web就能访问到所需的应用——这便是“云计算”的概念,但如果要进行多部门的协作就不是那么容易—因为跨国公司的设计部门往往分布在许多国家和地区。而普遍认为。必须提到的是,用户在笔记本电脑中对游戏进行控制://f,即把繁重的3D渲染也搬至互联网上.hiphotos,也就是说你只能老老实实坐在电脑桌前享受3D大作的快感,能够在同一个局域网内玩这些游戏都已快成为奢望、Radeon HD 4870 X2的顶级台式机中渲染Electronic Arts的“雇佣兵2,虽然AMD未透露云渲染需要多大的带宽,所以“云渲染”概念由AMD提出,这相当于将所有设计者紧密地联结在一起,若稍有延迟,这套云渲染系统并非由AMD单独构建、韩国和一些欧美地区://f,渲染出的画面同时传回给用户终端—那么这里又产生了新的问题、轮船等设备的设计中、PC应用以及其他图形密集应用传输给任何有高速网络接入的访问终端、全效果的渲染,今天的3D游戏对于GPU性能要求苛刻://f。而指令延迟则取决于用户终端与服务器的网络接入性能—很显然.baidu,3D游戏对于用户指令的响应高度敏感。我们知道。”OTOY首席执行官Jules Urbach也认为将应用程序从本机搬到网络。此时笔记本电脑就相当于一部客户机端,这足以预示着云渲染的光明前景,在生产力创建领域:一个设计中的产品在云服务器中渲染生成,这将会带来内容创建和消费领域的复兴,但是无论3D渲染画面还是蓝光视频都表现得非常理想,租用更多的计算资源,比如帮助制片厂提高电影的交互性。由于AMD同时拥有高性能处理器和高端图形技术,这对于后端的服务器系统而言将是巨大的压力—与常规的云计算应用相比(比如Gmail,打破技术障碍,AMD与OTOY、多媒体播放等,因此客观上这些地区的网络环境、Google Docs等商用程序到科学计算),未来带有Web浏览器和互联网连接的任何设备都可以运行高复杂度的3D游戏:战火纷飞”游戏,但它为3D游戏工业指明了一个崭新的方向,内容提供商可以在互联网上提供云渲染服务,然后通过新的传播方法提供给更广泛的用户,这样只需支付较少的费用,云渲染同样将发挥巨大的威力,AMD的合作伙伴均表达了对云渲染的乐观看法.baidu,指令通过网络再传送至台式机,问题就随之出现。而改用云渲染可以很好地解决这些问题。AMD与OTOY计划将这部超级计算机作为云渲染服务器,那么没有顶级图形系统将很难保证游戏的流畅运行,为消费者带来一流的内容体验:3D渲染一般要在30fps以上用户才会感觉画面流畅、只做显示和键鼠输入控制功能。在展示会上。而云渲染系统要面对的可能是成千上万用户的渲染请求,通过智能手机也能获得过去高性能游戏PC才能提供的卓越效果:●云渲染让玩家可以在任何轻量级的终端上获得高质量的3D渲染,将视频游戏,应该可以满足云渲染所需要的快速响应,但AMD在今年的CES上提出了新的构想:用户在笔记本电脑上使用浏览器远程播放了一段1080p蓝光电影.baidu,自身即已具备构建云渲染平台的实力,而且也意味着能够获得高质量的设计作品、大规模并行的图形处理器融为一体,换言之现实的战争可以完全被虚拟化—在目前的单机模式时代,设计师可以在屏幕上随时变更设计方案和快速验证、EA等合作伙伴一道演示了“AMD Fusion Render Cloud”云渲染技术,譬如在CS之类的激烈对战游戏中,AMD表示该方案将支持无线互联网传输,这样的数据要求可以轻易满足,假如你想获得1080p的高清渲染;●云渲染服务商可以根据资费多寡提供不同质量的云渲染服务。 在CES展会上、而非IBM或SUN提出并不奇怪:“云渲染”,我们便会发现电子游戏的模式将产生深刻变革,比如愿意多花费的用户可以获得高清。同时这套超级计算机还将面向电影工业和游戏工业,立刻引起外界的瞩目.hiphotos,云渲染模式对于许多用户都有致命的诱惑力,但在日本,而未来的游戏普遍要达到分辨率。尽管用于演示的笔记本电脑性能只比普通Atom上网本强一点,而现在流行的网络游戏大多只有升级打怪之类的无聊玩意,基本上别指望能拿它经常到处走。 云渲染所要面对的困难远比常规的云计算应用要更复杂,台式机则将渲染结果传回,IBM和SUN都无力单独发展云渲染平台,个人创意均可得到发挥;但假如需要多部门的全方位密切合作。在该演示中,用户指令必须得到及时响应,只要服务器集群能够提供足够强大的3D渲染能力,其次才轮到CPU。云渲染不仅仅只是给3D游戏带来变革,比如说你可以在智能手机之类的掌上设备中玩《极品飞车13》或者更新的3D大作,其中网速最快的日本都采用光纤到户。AMD的这套云渲染演示系统目前还是基于有线网络,但是所需要的空间,因为云渲染的任务中枢在于GPU,这主要来自于3D渲染对于硬件性能以及指令响应的苛刻要求、接入速度高达100Mbps。●云渲染能够让用户摆脱对于地域和设备的依赖—假如你现在想玩大型3D游戏.jpg" esrc="http,AMD还演示了云模式下的高清解码,云渲染在满足同样数量的用户需要时。云渲染令这种羁绊消弭于无形,用户可以在任何一种终端设备中干同样的事情,宽带接入普遍在50Mbps以上,EA公司首席内容官RichardHilleman认为云渲染将对视频游戏未来发展的深远影响、即时通讯。” 假如AMD云渲染平台走入实用化,适合云计算的应用主要为Office办公软件。云渲染系统要求服务器具备惊人的图形性能.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http,彼此直接交流看法并作出结论,借助这套系统,上述情形更多只是幻想,最终整个团队能够以最高效率完成设计工作,延迟时间一般都不会成为问题,使用方式十分灵活,否则无法满足大量用户同时渲染的请求云渲染的第二个难题在于、显示在笔记本电脑的Web界面上,你所控制的游戏对象就有被一枪爆头的风险;而那些使用掌上终端或费用有限的用户则可以选择质量较低的渲染,而在过去这些游戏只能在具有顶级配置的台式机中进行,并配备1000多个顶级图形处理器来处理100万个的计算线程,今天国内的网络无法承受这一点:“AMD云渲染技术将业内领先的CPU技术与计算密集。目前在建筑,然后渲染画面通过有线网络发送到一部基于Yu kon平台的HP Pavilion dv2超薄笔记本电脑上。而AMD云渲染技术与OTOY软件平台相结合,AMD首先采用一台配置Phenom Ⅱ X4处理器,最好的办法就是将设计人员派驻到某地,可以与世界上最强大的工业计算设备相媲美,但我们在前文中已经通过分析得到结论.com/zhidao/pic/item/4b90f7ac4ed8f3b751f,而能达到如此之高的网速:“AMD云渲染技术将可用于创建互动性电影和游戏视觉效果.hiphotos,一般传输码率要高于10Mbps,服务器收到指令后即时完成渲染任务、飞机,预计它也将成为史上图形效能最出色的超级计算机,这当然是背后那台高性能PC的功劳。尽管AMD没有对云渲染提出更多的具体实现方案,相对于传统的本机渲染。
其实专业的效果图制作团队,质量有部分缺点。这就是为什么任何软件都要更新的原因3Dmax做三维较好一般用过cad的都能上手.2008。3D效果图的缺点是渲染速度慢.06,增加效果图质量,更敏捷.,建筑设计的常用 ,在方案的初期阶段使用,只有最聪明。3Dmax一直在完美 但是没有最强的软件。我从3D5.2007,都是分工合作的因为一般人很难在3D建模技术和渲染。 3d是专业人士使用.2009,很难入门,这就是人与人的配合效果图软件必定有优点。3D效果图的优点是比其他三维绘图软件更真实.,更具有团队和大型三维制作的高级软件目前,所以需要和photoshop做后期处理,可以做精美的效果图.07,效果图公司常用.Photoshop做的图都还可以,Vray配高级渲染器加快渲染速度,我用的3Dmax8.配VR7,亦有缺点,后期PS处理上完全掌握的.08
给什么代金卷 都是假的现在云渲染 没有便宜的。恩 去看一下 云台网 里面有云渲染的。基本都收费。你用几十分钟 就没啦
注册还送渲染费你可以试试炫云,比其他的云渲染都便宜,不定期还做活动,用着很合适
是做效果图还是动画。动画没有免费的,云渲染现在一般都是收费的,
现在很多的云渲染都是会给你免费的试用券的,一般20~50不等,有的说渲染送你20元免费渲染其实是在单价很高的情况下渲染的,不建议使用,推荐你一个比较好的:希望采纳,谢谢!
炫云云渲染平台渲染效果图就是免费。网址是:直接在3d就可以提交,操作也很方便的。
炫云渲染家装效果图基本都是免费的了。
这种大计算量的,还是本地更靠谱吧?
炫我云渲染现在渲染家装的效果图基本都是免费的了,您可以用一下了,很不错。他们的官方网址为
V-ray等CG软件和渲染引擎。 Renderbus目前支持3dsMax,用户能够完全掌控自己的渲染任务,并支持自动下载渲染结果,并且针对国内CG行业的使用特点,Renderbus渲染平台基于云计算技术,是Chaosgroup V-Ray官方推荐的商业渲染农场。渲染完成之后,是国内唯一真正稳定运营的大规模云计算应用,能够随时对任务进行暂停,就吸收了国外最先进的渲染农场的所有优点,能立即看到缩略图、Maya、在线支付等功能。在渲染过程中、恢复,使用起来更加人性化。平台在设计之初,每一帧的渲染时间与费用,推出了一系列符合本土特色的功能。Renderbus在平台中集成了自动计费,实现了全自助式操作平台,用户能实时收到短信提醒,均由系统自动计算、放弃等操作瑞云的renderbus比较不错
渲染这种技术在国外发展的比较成熟、渲云,它是基于云计算技术原理,但是现在国内也有自主研发的云渲染平台renderbus,设置渲染参数,上传场景,下载渲染结果的过程,能方便、快速的完成渲染任务,功能也基本上达到了国外的水平。云渲染是指通过网页的形式在线提交渲染任务,然后进行渲染
我们可以花钱买效率,放到云端去渲染,目前圈内还刚兴起。其实就是解放你电脑。这个新事物,也可以理解为有大型渲染需求的小公司提供的云端渲染解决方案,人家有更好的硬件和服务器,把需要费时在自己电脑上渲染的作品(一般指3D MAX 或 MAYA等三维作品)云渲染可以简单理解为在云端渲染自己的3d作品,个人看好
本站发帖,请
产品和服务我在&#8220;c++博客&#8221;上的
对比一下,发现&#8220;博客园&#8221;的blog程序好太多了!
1.支持Google Chrome,而前者好多功能都不支持。
2.有社区支持,不只是blog。
再者&#8220;人&#8221;的因素
3.CG牛人云集于此,物以类聚,人以群分。
言归正传,先提出问题
&#8220;Batch, Batch, Batch:&#8221;
What Does It
Really Mean?
&#8226; Every DrawIndexedPrimitive() is a batch
&#8211; Submits n number of triangles to GPU
&#8211; Same render state applies to all tris in batch
&#8211; SetState calls prior to Draw are part of batch
You get X batches per frame,
X mainly depends on CPU spec.
How Many Triangles Per Batch?
&#8226; Up to you!
&#8211; Anything between 1 to 10,000+ tris possible
&#8226; If small number, either
&#8211; Triangles are large or extremely expensive
&#8211; Only GPU vertex engines are idle
&#8226; Or
&#8211; Game is CPU bound, but don&#8217;t care because
you budgeted your CPU ahead of time, right?
&#8211; GPU idle (available for upping visual quality)
下面是参考资料:
这个看代码里面batch相关的。
在是否从 D3DRender 提供顶点缓存区操作给流水线时做了一些权衡,最后决定暂时使用
IDirect3DDevice9::DrawPrimitiveUP 来渲染,因为它更容易书写,而且开销是一次顶点拷贝,流水线也不用操心对缓存的使用。
D3DPipeline
并不是完整的,其涉及到从场景管理器中传递的静态场景元素列表,这些元素需要事先被整理到各个子容器以便尽可能少地调整渲染状态和写顶点缓存。这些子容器由场景管理器维护,并在适当的时候调用
Render::DrawPrimitive 进行渲染。
大多数的 los-lib 结构与 D3DX 在内存上兼容的,在保持界面独立的同时不影响性能。例如 los::blaze::Material 与
D3DMATERIAL 即是兼容的。灯光定义则存在差异,主要原因在于 los-lib 使用了各个独立的灯光类型,而 D3DLIGHT9
则放置在统一的结构当中,当然,灯光对象通常并不在多个渲染状态间改变,所以执行两种灯光类型数据的转换并不影响效率。一桢通常仅进行一次这样的转换。
另一个容易犯的错误在于几何体法线列表的索引,法线为每个顶点索引设置独立的值,而不再通过顶点列表的索引形式,尝试使用顶点索引来查找法线将得到非预期的结果。
D3DRender:
&&virtual&int&DrawPrimitive(const&std::vector&VertexXYZ_N&&&listVertex
&&&&&&&&,&const&Matrix&&matWorld,&const&Matrix&&matView,&const&Matrix&&matProj
&&&&&&&&,&const&Material&&material)
&&&&&&&&ptrDevice-&SetTransform(D3DTS_WORLD,&(CONST&D3DMATRIX*)&matWorld);
&&&&&&&&ptrDevice-&SetTransform(D3DTS_VIEW,&(CONST&D3DMATRIX*)&matView);
&&&&&&&&ptrDevice-&SetTransform(D3DTS_PROJECTION,&(CONST&D3DMATRIX*)&matProj);
&&&&&&&&ptrDevice-&SetFVF(D3DFVF_XYZ&|&D3DFVF_NORMAL);
&&&&&&&&ptrDevice-&SetRenderState(D3DRS_FILLMODE,&D3DFILL_SOLID);
&&&&&&&&ptrDevice-&SetMaterial((CONST&D3DMATERIAL9*)&material);
&&&&&&&&uint&nPrim&=&(uint)listVertex.size()&/&3;
&&&&&&&&uint&nBatch&=&nPrim&/&_D3DCaps.MaxPrimitiveC
&&&&&&&&uint&nByteBatch&=_D3DCaps.MaxPrimitiveCount&*&(uint)sizeof(VertexXYZ_N)&*&3;
&&&&&&&&for&(uint&idx&=&0;&idx&&&nBatch&;&++idx)
&&&&&&&&&&&&ptrDevice-&DrawPrimitiveUP(D3DPT_TRIANGLELIST
&&&&&&&&&&&&,&_D3DCaps.MaxPrimitiveCount
&&&&&&&&&&&&,&&listVertex.front()
&&&&&&&&&&&&+&idx&*&nByteBatch
&&&&&&&&&&&&,&(uint)sizeof(VertexXYZ_N));
&&&&&&&&ptrDevice-&DrawPrimitiveUP(D3DPT_TRIANGLELIST,&nPrim&%&_D3DCaps.MaxPrimitiveCount
&&&&&&&&&&&&,&&listVertex.front()
&&&&&&&&&&&&+&nBatch&*&nByteBatch
&&&&&&&&&&&&,&(uint)sizeof(VertexXYZ_N));
&&&&&&&&return&0;
&&&&virtual&int&SetLights(const&Lights&&lights)
&&&&&&&&ptrDevice-&SetRenderState(D3DRS_AMBIENT
&&&&&&&&&&&&,&(lights.globalLight.GetColor()
&&&&&&&&&&&&*&lights.globalLight.GetIntensity()).ToColor());
&&&&&&&&uint&idxLight&=&0;
&&&&&&&&for&(size_t&idx&=&0;&idx&&&lights.listPointLight.size();&++idx)
&&&&&&&&&&&&const&PointLight&&refLight&=&lights.listPointLight[idx];
&&&&&&&&&&&&D3DLIGHT9&
&&&&&&&&&&&&::memset(&lght,&0,&sizeof(D3DLIGHT9));
&&&&&&&&&&&&lght.Type&=&D3DLIGHT_POINT;
&&&&&&&&&&&&lght.Range&=&refLight.GetDistance();
&&&&&&&&&&&&lght.Attenuation1&=&1.0f;
&&&&&&&&&&&&Vector3&vPos&=&refLight.GetPosition();
&&&&&&&&&&&&lght.Position.x&=&vPos.x;
&&&&&&&&&&&&lght.Position.y&=&vPos.y;
&&&&&&&&&&&&lght.Position.z&=&vPos.z;
&&&&&&&&&&&&lght.Diffuse&=&lght.Specular
&&&&&&&&&&&&&&&&=&*(D3DCOLORVALUE*)&(refLight.GetColor()&*&refLight.GetIntensity());
&&&&&&&&&&&&ptrDevice-&SetLight(idxLight,&&lght);
&&&&&&&&&&&&ptrDevice-&LightEnable(idxLight++,&true);
&&&&&&&&for&(size_t&idx&=&0;&idx&&&lights.listParallelLight.size();&++idx)
&&&&&&&&&&&&const&ParallelLight&&refLight&=&lights.listParallelLight[idx];
&&&&&&&&&&&&D3DLIGHT9&
&&&&&&&&&&&&::memset(&lght,&0,&sizeof(D3DLIGHT9));
&&&&&&&&&&&&lght.Type&=&D3DLIGHT_DIRECTIONAL;
&&&&&&&&&&&&Vector3&vDir&=&refLight.GetDirection();
&&&&&&&&&&&&lght.Direction.x&=&vDir.x;
&&&&&&&&&&&&lght.Direction.y&=&vDir.y;
&&&&&&&&&&&&lght.Direction.z&=&vDir.z;
&&&&&&&&&&&&lght.Diffuse&=&lght.Specular
&&&&&&&&&&&&&&&&=&*(D3DCOLORVALUE*)&(refLight.GetColor()&*&refLight.GetIntensity());
&&&&&&&&&&&&ptrDevice-&SetLight(idxLight,&&lght);
&&&&&&&&&&&&ptrDevice-&LightEnable(idxLight++,&true);
&&&&&&&&for&(size_t&idx&=&0;&idx&&&lights.listSpotLight.size();&++idx)
&&&&&&&&&&&&const&SpotLight&&refLight&=&lights.listSpotLight[idx];
&&&&&&&&&&&&D3DLIGHT9&
&&&&&&&&&&&&::memset(&lght,&0,&sizeof(D3DLIGHT9));
&&&&&&&&&&&&lght.Type&=&D3DLIGHT_SPOT;
&&&&&&&&&&&&lght.Range&=&refLight.GetDistance();
&&&&&&&&&&&&lght.Attenuation1&=&1.0f;
&&&&&&&&&&&&lght.Falloff&=&1.0f;
&&&&&&&&&&&&lght.Theta&=&refLight.GetHotspot().ToRadian();
&&&&&&&&&&&&lght.Phi&=&refLight.GetFalloff().ToRadian();
&&&&&&&&&&&&Vector3&vDir&=&refLight.GetDirection();
&&&&&&&&&&&&lght.Direction.x&=&vDir.x;
&&&&&&&&&&&&lght.Direction.y&=&vDir.y;
&&&&&&&&&&&&lght.Direction.z&=&vDir.z;
&&&&&&&&&&&&Vector3&vPos&=&refLight.GetPosition();
&&&&&&&&&&&&lght.Position.x&=&vPos.x;
&&&&&&&&&&&&lght.Position.y&=&vPos.y;
&&&&&&&&&&&&lght.Position.z&=&vPos.z;
&&&&&&&&&&&&lght.Diffuse&=&lght.Specular
&&&&&&&&&&&&&&&&=&*(D3DCOLORVALUE*)&(refLight.GetColor()&*&refLight.GetIntensity());
&&&&&&&&&&&&ptrDevice-&SetLight(idxLight,&&lght);
&&&&&&&&&&&&ptrDevice-&LightEnable(idxLight++,&true);
&&&&&&&&return&0;
D3DPipeline:
virtual&int&ProcessingObject(const&Object3D&&object)
&&&&&&&&++_DebugInfo.dynamic_object_
&&&&&&&&const&Model&&refModel&=&object.GetModel();
&&&&&&&&const&Vector3&&pos&=&object.GetPosition();
&&&&&&&&Matrix&mat&=&object.GetTransform()
&&&&&&&&&&&&*&object.GetOrientation().ObjectToInertial()&*&object.GetAxis()
&&&&&&&&&&&&*&Matrix().BuildTranslation(pos.x,&pos.y,&pos.z);
&&&&&&&&for&(size_t&gidx&=&0;&gidx&&&refModel.listGeometry.size();&++gidx)
&&&&&&&&&&&&const&Geometry&&refGeom&=&refModel.listGeometry[gidx];
&&&&&&&&&&&&const&Material&&refMat&=&refModel.listMaterial[refGeom.indexMaterial];
&&&&&&&&&&&&//Triangle&
&&&&&&&&&&&&//triangle.bitmap&=&(DeviceBitmap*)&refModel.listDeviceBitmap[refGeom.indexDeviceBitmap];
&&&&&&&&&&&&std::vector&VertexXYZ_N&&listV
&&&&&&&&&&&&listVertex.reserve(refGeom.listIndex.size());
&&&&&&&&&&&&for&(size_t&iidx&=&0;&iidx&&&refGeom.listIndex.size();&iidx&+=&3)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&const&Vector3&&vertex0&=&refGeom.listVertex[refGeom.listIndex[iidx]];
&&&&&&&&&&&&&&&&const&Vector3&&vertex1&=&refGeom.listVertex[refGeom.listIndex[iidx&+&1]];
&&&&&&&&&&&&&&&&const&Vector3&&vertex2&=&refGeom.listVertex[refGeom.listIndex[iidx&+&2]];
&&&&&&&&&&&&&&&&Vector3&normal0&=&refGeom.listNormal[iidx];
&&&&&&&&&&&&&&&&Vector3&normal1&=&refGeom.listNormal[iidx&+&1];
&&&&&&&&&&&&&&&&Vector3&normal2&=&refGeom.listNormal[iidx&+&2];
&&&&&&&&&&&&&&&&listVertex.push_back(VertexXYZ_N());
&&&&&&&&&&&&&&&&VertexXYZ_N&&refV0&=&listVertex.back();
&&&&&&&&&&&&&&&&refV0.x&=&vertex0.x;
&&&&&&&&&&&&&&&&refV0.y&=&vertex0.y;
&&&&&&&&&&&&&&&&refV0.z&=&vertex0.z;
&&&&&&&&&&&&&&&&refV0.normal_x&=&normal0.x;
&&&&&&&&&&&&&&&&refV0.normal_y&=&normal0.y;
&&&&&&&&&&&&&&&&refV0.normal_z&=&normal0.z;
&&&&&&&&&&&&&&&&listVertex.push_back(VertexXYZ_N());
&&&&&&&&&&&&&&&&VertexXYZ_N&&refV1&=&listVertex.back();
&&&&&&&&&&&&&&&&refV1.x&=&vertex1.x;
&&&&&&&&&&&&&&&&refV1.y&=&vertex1.y;
&&&&&&&&&&&&&&&&refV1.z&=&vertex1.z;
&&&&&&&&&&&&&&&&refV1.normal_x&=&normal1.x;
&&&&&&&&&&&&&&&&refV1.normal_y&=&normal1.y;
&&&&&&&&&&&&&&&&refV1.normal_z&=&normal1.z;
&&&&&&&&&&&&&&&&listVertex.push_back(VertexXYZ_N());
&&&&&&&&&&&&&&&&VertexXYZ_N&&refV2&=&listVertex.back();
&&&&&&&&&&&&&&&&refV2.x&=&vertex2.x;
&&&&&&&&&&&&&&&&refV2.y&=&vertex2.y;
&&&&&&&&&&&&&&&&refV2.z&=&vertex2.z;
&&&&&&&&&&&&&&&&refV2.normal_x&=&normal2.x;
&&&&&&&&&&&&&&&&refV2.normal_y&=&normal2.y;
&&&&&&&&&&&&&&&&refV2.normal_z&=&normal2.z;
&&&&&&&&&&&&&&&&++_DebugInfo.polygon_
&&&&&&&&&&&&}
&&&&&&&&&&&&_PtrRender-&DrawPrimitive(listVertex,&mat,&_ViewMatrix,&_PerspectiveMatrix,&refMat);
&&&&&&&&return&0;
这篇看batching段。
GPU性能调试:
通常来说,使用CPU时间事件来调试GPU是低效并且是不准确的。D3D
API在多数命令下会阻塞,甚至是Draw函数。它会在一些时间片上做一些真正的工作,而这往往是不可预知的。因此,GPU的性能调试只能用PIX或者是其他专用产品,例如NVIDIA&#8217;s
NVPerfHUD来进行。
显卡所用的内存:
显卡所用的内存可以分为两大类:本地的和非本地的(相对于显卡来说)。在显卡处理的某些数据类型的时候,需要本地内存,例如
帧缓冲。 非本地内存,有时也成为AGP卡槽内存(AGP
aperture),可以被显卡访问的某些数据类型所在的系统内存,例如顶点缓冲。本地内存要比非本地内存快。
本地内存通常是在显卡内的,但是有些显卡可以共享系统内存,这通常是平衡速度和价格之间的选择。在这种情况下,帧缓存可以存在于系统内存中,而不是在本地内存中。这种技术下,显卡处理某些数据的速度比不使用共享内存的要慢,因为数据必须从I/O
Bus(例如PCI-Express)上传输过来。但是这可以使显卡成本大大降低。在NVIDIA,这种技术被称为TurboCache,而ATI称之为HyperMemory。
着色器和着色模型:
Shader是运行在GPU上的,处理一些D3D流水管线上一些任务的程序。有三种类型的shader,他们分别对应三种可编程的stage:
shader (顶点着色器VS) stage, geometry shader (几何着色器GS) stage, 还有pixel shader(像素着色器PS)
stage。其中几何着色器只能在DX10平台上使用。
着色模型(shader
model)是在GPU上运行的虚拟机。每个虚拟机定义被称为一种shader profile。并且包含了特定的汇编语言。
着色器的职责:
着色器通常是流水管线中描述物体表面的部分。例如,一种看起来像木头的材质被称为木头着色器(wood
shader)。而在D3D中,这些着色语言指令集可以做的事情远不止描述物体表面。他们可以用来计算光照,矩阵转换,顶点动画,进行裁切,动态生成新的几何物体,等等。在Mental
ray中,shader按照职责可以划分为surface shader, light shader, shader shader, output
shader等等。
在D3D中,这三种着色器的职责划分并不是很明确。例如,光照计算过可以在顶点着色器,或者是像素着色器中完成,这取决于应用程序的需求。因此,包含各种着色器的着色器集合应运而生。他们链接起来定义了一个工作流水线。
关于Direct3D 9 资源和内存类型:
D3D支持下列类型的资源:纹理(包括常规的和渲染目标render
target),顶点缓冲,索引缓冲,字体,交换链(swap chain),状态组,深度模板缓冲,特效等等。
有四种内存类型(池),资源可以在这里分配:
&#183;&&&&&&&&
默认Default:在显卡内存中,包括AGP卡槽内存和本地显存。在设备丢失之后,必须被释放,重构。
&#183;&&&&&&&&
托管Managed:存在于系统内存中,按需拷贝到显存。
&#183;&&&&&&&&
系统SystemMem:永远存在于系统内存中,并且不能直接用于渲染。可以当作源或者目标拷贝。例如UpdateSurface和UpdateTexture。
&#183;&&&&&&&&
Scrach: 永远存在于系统内存中,并且不会被设备大小或格式限制,例如纹理的2的幂限制。不能把它放到显存中。
查找资源泄露:
在关闭一个基于D3D的应用程序时,D3D调试运行库会报告内存泄露。按照以下步骤定位泄漏点。
在DirectX Control Panel中(通常在DXSDK安装目录中可以找到),启用&#8220;Use Debug Version of Direct3D
9&#8221;并且将Debug Output Level设置为&#8221;More&#8221;。确保Break on Memory Leaks被禁用。点击Apply。
在VS中调试运行应用程序。在关闭应用程序之后,查看VS的输出窗口Direct 3D9: (WARN) : Memory Address:& 00xxxxxx,&
IAllocID= xx dwSize =(pid = xxxxx)
每条记录对应了一个资源泄漏,查看并记住ID,然后在DirectX Control Panel中输入ID并且点击Apply。
再次运行程序,重复以上步骤。程序会在分配点中断,你可以检查哪里遗忘释放。
当你调试完成之后,别忘了将Break On AllocID设置为0。
处理设备丢失(Device Lost)
一个D3D设备可以在很多情况下丢失,例如从全屏向窗口转换,一个电源管理事件,按CTRL+DEL+ALT返回Windows
Security Dialog。
必须采取措施去检查一个设备是否丢失,丢失了之后如何恢复。
方法:在某些地方调用IDirect3DDevice9::TestCooperativeLevel,例如在每帧开始渲染之前调用。当发现设备丢失之后,采取下列措施:
释放所有在Default内存中的资源
释放其他没有和Default, Managed, SystemMem绑定的资源
调用IDirect3DDevice9::TestCooperativeLevel去确认设备是否可以被重置如果能,那么调用IDirect3DDevice9::Reset
如果不能,继续等待,然后再尝试
重新创建需要的资源
渲染目标和交换链(Render Targets and Swap Chains)
一个渲染目标是一个用于保存在图形流水线输出像素的表面。也就是说,它是一个颜色数组。一个设备可以有一个或者多个活动的渲染目标,可以通过SetRenderTarget来启用。一个用于渲染目标的表面只能放在Default池中,有三种渲染目标:
&#183;&&&&&&&&
渲染目标表面Render target surfaces(通过CreateRenderTarget创建)
&#183;&&&&&&&&
渲染目标纹理Render target textures(tongguo D3DUSAGE_RENDERTARGET标识来创建)
&#183;&&&&&&&&
交换链Swap chains
交换链就是后备缓冲的集合,它们能够相继渲染到前缓冲,也就是屏幕上。一个在交换链中的后备缓冲可以当作一个渲染目标赋给一个设备。但是,不像其他的渲染目标,交换链可以渲染到屏幕上,因为交换链是和窗口/全屏大小绑定的。可以创建多个交换链,注意更改默认交换链大小会造成设备丢失,所以窗口程序会忽略默认的交换链,而使用一个附加的交换链来避免这个问题。渲染目标可以被锁定(用来读取),但是当这个渲染目标是活动的话,会影响系统性能。我们可以根据需要用IDirect3DDevice9::GetRenderTargetData来将一个在Default池中的渲染目标拷贝出来。可以使用IDirect3DDevice9::StrechRectangle在两个在显卡内存中的渲染目标中进行高效拷贝。
批处理(Batching)【重剑注:这个是重点】
D3D的效率在很大程度上受制于传给API的几何模型数据的批次上。一个批处理就是调用一次DrawPrimitive或者DrawIndexPrimitive。在GPU可以处理数据前,CPU花相当长时间来处理每批数据。现在常见的CPU和GPU,可以参考以下数据:
&#183;&&&&&&&&
使用DX9,CPU每秒可以处理50,000批次;使用DX10,这个数据是200,000。
&#183;&&&&&&&&
在DX9中,处理2,000个三角形在CPU和GPU所花的时间大致相等。在DX10中,这个数据是500。简单的着色程序使这个数字增加,复杂的着色程序使这个数字减少。在CPU和GPU在同一个批次上花相同时间的情况下,实例化(Instancing)可以提高三角形的输出能力。因为以上原因,每个批次中处理数据的数量越大越好,这样能够将三角形的吞吐量最大化。
在实践中,具体有两种方式:
&#183;&&&&&&&&
Consolidation合并:将相同性质的几何元素合并起来,通常是将一些属性进行排序的结果
&#183;&&&&&&&&
Instancing实例化:将相同的几何物体,经过一些细微的,不同的变换后画出多个实例来。例如世界坐标系的转换和颜色转换。【重剑思考:Q:游戏里角色的护腕部位要同样的模型,不能是一个护腕,一个手套,这个就是为了Instancing?A:非也!两个护腕其实是一个模型,美术画的时候就是画了一对(左右各一个),中间就是断开的】
顶点,索引缓冲Vertex / Index Buffer
顶点和索引缓冲有两种类型:静态和动态的。
一旦创建之后,静态的缓冲使用起来比动态的快一倍。但是,动态缓冲的加锁和解锁要比静态的快,它们是为更改的每一帧设计的,通常被存储在AGP卡槽内存中。经常对静态缓冲加解锁是不明智的,因为只有等驱动完成了所有挂起的命令之后才能返回该缓冲的指针。如果经常这样做,这会导致CPU和GPU很多不必要的同步,这样性能将会变得很差。
为了得到最好的性能,必须采用动态缓存。这样驱动可以继续进行并行渲染。使用DISCARD或者是NOOVERWRITING标志可以实现这一点,这样驱动可以在更新数据的同时继续处理老的数据。
DISCARD:这个标志说明应用程序不关心当前缓冲的内容。所以在缓冲被渲染的同时,驱动可以给应用程序一个全新的缓冲。这个处理称之为&#8220;buffer
renaming&#8221;。注意,在实践中,驱动倾向于不去释放&#8220;缓冲重命名&#8221;中所用的内存,因此这个标志必须尽量少用。
NOOVERWRITE:这表示,对于之前添加的,不带这个标志的数据,应用程序不会更改它。例如应用程序只会在现有缓冲之后添加数据。所以驱动可以继续使用现有数据进行渲染。
CPU和GPU的并行处理
runtime会将一堆命令做成命令串传给GPU,这就允许GPU和CPU进行并行处理。这样也是硬件加速渲染这么高效的原因之一。但是,在很多情况下,CPU和GPU必须进行同步之后才能做进一步的处理。通常来说,应该尽量避免这种情况,因为这会导致整个流水管线的刷新,大幅降低性能。例如,对静态缓冲加锁,这要求GPU先处理完所有的命令之后,才能返回被锁缓冲的指针。如果用动态缓冲,就可以避免,就像前面讲过的一样。
有一些同步是不可避免的,例如,CPU可能会需要一些GPU还来不及处理的命令结果。在这种情况下,用户会感到画面延迟Lag。要避免这种情况,可以在GPU落后两三帧的情况下调用Present来强迫CPU等待GPU。因此,调用Present可能比较慢,但是正式它处理了必要的同步。
状态的更换State Changes
不管冗余还是不冗余,状态的转换在到达驱动层的时候,开销总是很大。所以在某些层面,状态转换必须被过滤。一个对状态进行更换的函数调用并不一定会开销很大,因为D3D
Runtime很有可能缓冲这些转换请求,在真正调用DrawPrimitive函数之前不会去执行它。多次的状态转换也不会加大开销,因为只使用最后一个状态值。尽管如此,状态转换还是应该尽量避免。某些状态转换会比其他的转换的开销更大。例如,对于更改处于活动状态的顶点缓冲和像素缓冲会导致整个流水管线的刷新。因为在某些显卡上,同一时间每个类型只有一个着色器可以处于活动状态。一个图形流水线可以很长,花一段时间才能完成一个像素的渲染。因此,整个流水线的刷新需要尽量避免。在不同的显卡上,某个状态的更新的花费差别可能会很大。另外,D3D的函数调用个数也必须尽量的少,虽然它的开销不如达到驱动层的状态更改那么大。可以使用状态块来减少D3D
API的调用,状态块可以将状态的更改集中在一起,并且可以重用。
&Batching with the Geometry Instancing
3.1&为何使用Geometry Instancing&(Why Geometry Instancing)
3.2&定义(Definitions)
A geometry packet is a description of a packet of geometry to be instanced, a collection of vertices and indices
struct GeometryPacker
&&&&&&&&&Primitive mPrimT
&&&&&&&&&void* mV
&&&&&&&&&unsigned int mVertexS
&&&&&&&&&unsigned short* mI
&&&&&&&&&unsigned int mVertexC
&&&&&&&&&unsigned int mIndexC
&&&&&&&&&D3DXVECTOR3 mSphereC
&&&&&&&&&float mSphereR
3.2.2&实体属性(Instance Attribute)
struct InstanceAttributes
&&&&&&&&&D3DXMATRIX mModelM
&&&&&&&&&D3DCOLOR mInstanceC
&&&&&&&&&AnimationPlayer* mAnimationP
&&&&&&&&&unsigned int mLOD;
3.2.3&几何实体(Geometry Instance)
struct GeometryInstance
&&&&&&&&&GeometryPacket* mGeometryP
&&&&&&&&&InstanceAttributes mInstanceA
3.2.4&渲染及纹理环境(Render and Texture Context)
class RenderContext
&&&&&&&&&public:
&&&&&&&&&//begin the render context and make its render state active
&&&&&&&&&void Begin(void);
&&&&&&&&&//End the render context and restore previous render states if necessary
&&&&&&&&&void End(void);
&&&&&&&&&//Any description of the current render state and pixel and vertex shaders.
&&&&&&&&&//D3DX Effect framework is particularly useful
ID3Deffect* mE
&&&&&&&&&//Application-specific render states
&&&&&&&&&//&#8230;.
class TextureContext
&&&&&&&&&public:
&&&&&&&&&//set current textures to the appropriate texture stages
void Apply(void)
&&&&&&&&&private :
&&&&&&&&&Texture mDiffuseM
&&&&&&&&&Texture mLightM
&&&&&&&&&//&#8230;&#8230;..
3.2.5&几何批次(Geometry Batch)
class GeometryBatch
&&&&&&&&&public:
&&&&&&&&&//remove all instances form the geometry batch
&&&&&&&&&virtual void ClearInstances(void);
&&&&&&&&&//add an instance to the collection and return its ID. Return -1 if it can&#8217;t accept more instance.
&&&&&&&&&virtual int AddInstance(GeometryInstance* instance);
&&&&&&&&&//Commit all instances, to be called once before the render loop begins and after every change to the instances collection
&&&&&&&&&virtual unsigned int Commit(void) = 0;
&&&&&&&&&//Update the geometry batch, eventually prepare GPU-specific data ready to be submitted to the driver, fill vertex and
&&&&&&&&&//index buffers as necessary , to be called once per frame
&&&&&&&&&virtual void Update(void) = 0;
&&&&&&&&&//submit the batch to the driver, typically impemented eith a call to DrawIndexedPrimitive
&&&&&&&&&virtual void Render(void) const = 0;
&&&&&&&&&private:
&&&&&&&&&GeometryInstancesCollection mI
3.3&实现(Implementation)
//Update phase
Foreach GeometryBatch in ActiveBatchesList
&&&&&&&&&GeometryBatch.Update();
//Render phase
Foreach RenderJContext
&&&&&&&&&RenderContext.BeginRendering();
&&&&&&&&&</mitStates();
&&&&&&&&&Foreach TextureContext
&&&&&&&&&Begin
&&&&&&&&&&&&&&&&&&&TextureContext.Apply();
&&&&&&&&&&&&&&&&&&&Foreach GeometryBatch in the texture context
&&&&&&&&&&&&&&&&&&&&&&&&&&&&GeometryBatch.Render();
&&&&&&&&&End
静态批次(static batching)
动态批次(Dynamic batching)
Vertex constants instancing
Batching with Geometry Instancing API
3.3.1&静态批次(Static Batching)
res = lpDevice -& CreateVertexBuffer( MAX_STATIC_BUFFER_SIZE, D3DUSAGE_WRITE, 0, D3DPOOL_MANAGED, &mStaticVertexStream, 0 );
ENGINE_ASSERT(SUCCEEDED(res));
Foreach GeometryInstance in Instances
&&&&&&&&&transform geometry in mGeometryPack to world space with instance mModelMatrix
&&&&&&&&&Apply other instnce attributes(like instace color)
&&&&&&&&&Copy transformed geometry to the Vertex Buffer
&&&&&&&&&Copy indices ( with the right offset) to the Index Buffer
&&&&&&&&&Advance current pointer to the Vertex Buffer
&&&&&&&&&Advance currect pointer to the Index Buffer
大内存占用(Large memory footprint)
不支持多种LOD(No support for different level of detal)
lNo support for skinning
不直接支持实体移动(No direct support for moving instances)
3.3.2&动态批次(DynamicBatching)
Foreach GeometryInstance in Instances
&&&&&&&&&Transform geometry in mGeometryPacket to world space with instance mModelMatrix
&&&&&&&&&if instance nedds skinning, request a set of bones from mAnimationPlayer and skin geometry
&&&&&&&&&Apply other instance attributes(like instance color)
&&&&&&&&&Copy transformd geometry to the Vertex Buffer
&&&&&&&&&Copy indices (with the right offset) to the Index Buffer
&&&&&&&&&Advance current pointer to the Vertex Buffer
&&&&&&&&&Advance current pointer to the Index Buffer
Inside Geometry Instancing(下)
此教程版权归我所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。商业应用请同我联系。
由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。也欢迎大家和我多多交流。
其中部分图片来自网络,尽量保证了和原书中插图一致。
特别感谢mtt重现了文章中的流程图^_^
翻译:clayman
Blog:http://blog.csdn.net/soilwork
3.3.3&Vertex Constants Instancing
Stuct InstanceVertex
&&&&&&&&&D3DVECTOR3&&mP
&&&&&&&&&//other properties&#8230;&#8230;
&&&&&&&&&WORD&&&&&mInstanceIndex[4];&&//Direct3D requires SHORT4
D3DVECTOR4&&instancesData[MAX_NUMBER_OF_CONSTANTS];
unsigned int count = 0;
for(unsigned int i=0; i&GetInstancesCount(); ++i)
&&&&&&&&&//write model matrix
instancesData[count++] = *(D3DXVECTOR4*) & mInstances[i].mModeMatrix.m11;
instancesData[count++] = *(D3DXVECTOR4*) & mInstances[i].mModelMatrix.m21;
instancesData[count++] = *(D3DXVECTOR4*) & mInstances[i].mModelMatrix.m31;
instancesData[count++] = *(D3DXVECTOR4*) & mInstances[i].mModelMatrix.m41;
//write instance color
instaceData[count++] = ConverColorToVec4(mInstances[i].mColor);
&&&&&&&&&}
&&&&&&&&&lpDevice-&SetVertexConstants(INSTANCES_DATA_FIRST_CONSTANT, instancesData, count);
//vertex input declaration
&&&&&&&&&struct vsInput
&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&float4 postion : POSITON;
&&&&&&&&&&&&&&&&&&&float3 normal : NORMAL;
&&&&&&&&&&&&&&&&&&&//other vertex data
&&&&&&&&&&&&&&&&&&&int4 instance_index : BLENDINDICES;
&&&&&&&&&};
&&&&&&&&&vsOutput VertexConstantsInstancingVS( in vsInput input)
&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&//ge the index is premultiplied by 5 to take account of the number of constants used by each instance
&&&&&&&&&&&&&&&&&&&int instanceIndex = ((int[4])(input.instance_index))[0];
&&&&&&&&&&&&&&&&&&&//access each row of the instance model matrix
&&&&&&&&&&&&&&&&&&&float4 m0 = InstanceData[instanceIndex + 0];
&&&&&&&&&&&&&&&&&&&float4 m1 = InstanceData[instanceIndex + 1];
&&&&&&&&&&&&&&&&&&&float4 m2&= InstanceData[instanceIndex + 2];
&&&&&&&&&&&&&&&&&&&float4 m3&= InstanceData[instanceIndex + 3];
&&&&&&&&&&&&&&&&&&&//construct the model matrix
&&&&&&&&&&&&&&&&&&&float4x4 modelMatrix = {m0, m1, m2, m3}
&&&&&&&&&&&&&&&&&&&//get the instance color
&&&&&&&&&&&&&&&&&&&float instanceColor = InstanceData[instanceIndex + 4];
&&&&&&&&&&&&&&&&&&&//transform input position and normal to world space with the instance model matrix
&&&&&&&&&&&&&&&&&&&float4 worldPostion = mul(input.position, modelMatrix);
&&&&&&&&&&&&&&&&&&&float3 worldNormal = mul(input.normal, modelM
&&&&&&&&&&&&&&&&&&&//output posion, normal and color
&&&&&&&&&&&&&&&&&&&output.position = mul(worldPostion, ViewProjectionMatrix);
&&&&&&&&&&&&&&&&&&&output.normal = mul(worldPostion,ViewProjectionMatrix);
&&&&&&&&&&&&&&&&&&&output.color = instanceC
&&&&&&&&&&&&&&&&&&&//output other vertex data
&&&&&&&&&}
3.3.4&Batching with the Geometry Instancing API
HRESULT SetStreamSourceFreq( UINT StreamNumber, UINT FrequencyParameter);
StreamNumber
unsigned int instancesCount = GetInstancesCount();
&&&&&&&&&//set u stream source frequency for the first stream to render instancesCount instances
&&&&&&&&&//D3DSTREAMSOURCE_INDEXEDDATA tell Direct3D we&#8217;ll use indexed geometry for instancing
&&&&&&&&&lpDevice-&SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA | instancesCount);
&&&&&&&&&//set up first stream source with the vertex buffer containing geometry for the geometry packet
&&&&&&&&&lpDevice-&setStreamSource(0, mGeometryInstancingVB[0], 0, mGeometryPacketDeck);
&&&&&&&&&//set up stream source frequency f each set of instance attributes describes one instance to be rendered
&&&&&&&&&lpDevice-&SetstreamSouceFreq(1, D3DSTREAMSOURCE_INDEXEDDATA | 1);
&&&&&&&&&// set up second stream source with the vertex buffer containing all instances&#8217; attributes
&&&&&&&&&pd3dDevice-&SetStreamSource(1, mGeometryInstancingVB[0], 0, mInstancesDataVertexDecl);
&&&&&&&&&// vertex input declaration
&&&&&&&&&struct vsInput
&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&//stream 0
&&&&&&&&&&&&&&&&&&&float4 position : POSITION;
&&&&&&&&&&&&&&&&&&&float3 normal&&: NORMAL;
&&&&&&&&&&&&&&&&&&&//stream 1
&&&&&&&&&&&&&&&&&&&float4 model_matrix0&&&:&&TEXCOORD0;
&&&&&&&&&&&&&&&&&&&float4 model_matrix1&&&:&&TEXCOORD1;
float4 model_matrix2&&&:&&TEXCOORD2;
float4 model_matrix3&&&:&&TEXCOORD3;
float4 instance_color&&&&:&&D3DCOLOR;
&&&&&&&&&};
&&&&&&&&&vsOutput geometryInstancingVS(in vsInput input)
&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&//construct the model matrix
&&&&&&&&&&&&&&&&&&&float4x4 modelMatrix =
&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&input.model_matrix0,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&input.model_matrix1,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&input.model_matrix2,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&input.model_matrix3,
&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&//transform inut position and normal to world space with the instance model matrix
&&&&&&&&&&&&&&&&&&&float4 worldPosition = mul(input.position, modelMatrix);
&&&&&&&&&&&&&&&&&&&float3 worldNormal = mul(input.normal,modelMatrix);
&&&&&&&&&&&&&&&&&&&//output positon, normal ,and color
&&&&&&&&&&&&&&&&&&&output.positon = mul(worldPostion,ViewProjectionMatrix);
&&&&&&&&&&&&&&&&&&&output.normal = mul(worldNormal,ViewProjectionMatrix);
&&&&&&&&&&&&&&&&&&&output.color = int.instance_
&&&&&&&&&&&&&&&&&&&//output other vertex data&#8230;..
&&&&&&&&&}
GPU Gems 2&
References
看完这些,理解得差不多了。再结合现在的引擎代码具体理解下。理解了才好办事!
阅读(...) 评论()

我要回帖

更多关于 renderbus怎么用 的文章

 

随机推荐