• D3D中的多流


    看Ogre的基本图元DX渲染时,看到它在创建VertexBuffer时,并没有用到我想像中的FVF(Flexible Vertex Format),询问了一下才知道人家用的是MultiStream。看来基础知识还是不扎实。

     

    搜了一些资料,在这共享一下。

     

    首先:

    在D3D中,要渲染的顶点数据是放在Vertex Buffer中的,一般的做法是把顶点坐标、颜色等按照自定义的顶点格式放在同一个Vertex Buffer中,代表一个流,然后通过FVF来告诉D3D要渲染的顶点的格式。但是在某些情况下,放在一起并不是最佳选择。比如在动画中,每一帧的顶点坐标都在变化,但是纹理坐标却都不变(md3格式就是如此)。如果只用一个流,每画一帧就得把所有数据都拷贝到一个临时Vertex Buffer中再渲染,开销巨大。如果能把不同的数据放在不同的流中,就可以只更新顶点坐标的流,而纹理坐标的流就可以保持不变了。而且,只用一个Vertex Buffer时要管理FVF和数据结构体之间的关系,万一弄错了,是很难发现的。

     

    几乎所有的DX入门书都在介绍灵活顶点格式(FVF),对MultiStream却鲜有提及。事实上,MultiStream是一个图形库必不可少的部分,它不但提供了更高的灵活度,同时也提供了一定的性能优化。简单的说,MultiStream是用多个VertexBuffer代替单个针对只使用0号Stream的一个改进。GPU精粹2中将顶点数据分为几何(坐标,法线,漫反射颜色,镜面反射颜色)、纹理(N个纹理坐标+附加信息)、动画(骨骼权重)、用户自定义常量,这四类顶点数据各自使用一个流。在声明顶点格式的时候,用D3DVERTEXELEMENT9代替原来的FVF宏,创建一个IDirect3DVertexDeclaration9,渲染时用SetVertexDeclaration代替原来的SetFVF。

     

     

    链接:

    D3D中多流的用法

    http://dev.gameres.com/Program/Visual/3D/multistream.htm

    SetStreamSource函数与数据流的使用

    http://www.zxbc.cn/html/20071116/29530.html

  • 相关阅读:
    lnmp+memcache+tomcat
    redis的主从搭建
    curl只取状态码
    Tomcat的优化
    pip9 安装 centos6.8
    文件的下载
    保存图片到图库更新图库
    上传图片总结
    Android 大图片预览ViewPager
    Android 软件盘 Editext 问题
  • 原文地址:https://www.cnblogs.com/gameprogram/p/2311673.html
Copyright © 2020-2023  润新知