zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Understand 学习
    2021年1月
    查看所有请求
    DB2日期和时间函数汇总
    .getClass和.class
    继承和实现接口的区别
    java8 stream
    Lambda表达式详解
    SQL语句小知识---XML文件中的 CDATA语法
    Java--mapper.xml中常用SQL标签
  • 原文地址:https://www.cnblogs.com/gameprogram/p/2311673.html
Copyright © 2011-2022 走看看