蜗牛的天空

慢慢爬.慢慢游.很快就可以到知识海洋的彼岸
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

技术

Posted on 2010-03-09 18:32  蜗牛的天空  阅读(318)  评论(0)    收藏  举报

在你的材质脚本中,一个"技术"就是一个单独的渲染物体的方法。最简单的材质定义只包含一个技术,然而由于计算机的处理能力千差万别,除非你确定运行你的程序的所有显示卡都能运行你的这个技术,否则最好不要只写一个技术。此外,如果你想使用材质细节层次技术渲染材质,例如距离越远的物体使用越简单越低表现效果的技术,这可能是比较简单的定义方法。

   

当一个材质首次被使用时,它就被"编译"了。这包括扫描其中包含的技术定义,并且标记出其中哪些技术是当前渲染API和显示卡所支持的。如果所有技术都不支持,那么你的这些材质会被当作空白渲染。编译证明了如下几件事:

   

  • 每个渲染通路中的纹理单元入口数

    需要注意的是,如果脚本中的纹理单元入口数超过当前显示卡的纹理单元数,只要没有使用片断程序,技术仍可被支持。在这种情况下,OGRE会将含有过多纹理单元入口的那一个渲染通路分割成多个较小些的渲染通路,使得分割后的渲染通路中的纹理单元入口数不超过当前显示卡的纹理单元数,同时,多重纹理混合也相应地变成多重渲染通路混合(详见colour_op_multipass_fallback部分)

       

  • 无论是顶点程序还是片断程序,只要使用就要指明其语法规则(例如:vs_1_1, ps_2_x, arbfp1 等等)
  • 其他诸如立方体映射贴图以及dot3混合等效果。

       

    在一个材质脚本中,技术的排列要有一定的先后顺序,例如,排在前面的技术比排在后面的技术有更高的优先级。一般来说,你要把最高级最需要的技术放在脚本的前面,然后将其他的备用的技术按照顺序依次放在后面。

       

    为了帮助我们清晰的辨识每一个使用到的技术,你选择可以给技术取个名字,当然你也可以选择不取名。但是,脚本中没有名字的技术会以该技术的索引号为名。例如:材质中第一个技术的索引号为0,如果它没有名字的话,那么它的名字就是"0"。技术名在脚本中应当是唯一的,否则最终的技术会得到所有同名技术融合后的结果。如果发生这种情况,一条警告消息会发给Ogre.log。当复制材料和修改已存在的技术时,如果给技术取了名字,会很有帮助:(详见3.1.11 材质拷贝)

       

    格式:Format: technique 技术名

    技术只有为数不多的几个属于它们自己的属性:它们所属的"方案"(详见下面 scheme 部分),该方案的细节层次索引(详见下面 lod_index 部分)。另外还有一个材质属性,叫做 lod_distances,它不是技术属性,然而却与 lod_index 有直接关系,所以为方便起见也把它列在这里。

       

    scheme

       

    设置技术所属的"方案"。材质方案被用来控制从一套技术到另一套技术的顶层转换。例如,你也许会使用这个属性定义材质的"高"、"中"、"低"复杂度水平,使得用户在权衡过后,可以挑选出显示效果与显示质量的适当比率。另一个可能的情况是,你可以针对顶级机器采用高动态范围全开的管线,而对于其他机器选用较简单的管线;这种问题就能够用"方案"来实现。活动方案被控制在视口层,且默认的活动方案是"Default"。

       

    格式: scheme <方案名>

    示例: scheme hdr

    默认: scheme Default

    lod_index

       

    设置该技术所属的细节层次索引。

       

    格式: lod_index <数字>

    数字的合法数值范围是 0(最高细节层次)到 65535,尽管这是不可能的。在技术之间的细节层次索引中不能留空当。也就是说,细节层次索引要按顺序排列,例如:0,1,2,3,……;而不能出现:0,10,20,30,……,这样的情况。

       

    示例: lod_index 1

    每个技术都必须对应属于一个细节层次索引,默认它们都属于索引0,即最高等级的细节层次。增加索引的数值意味着降低细节层次。你可以给不止一个技术赋值相同的细节层次索引,这就是说OGRE会自动从中挑选最好的技术。为了方便阅读,建议你先按照细节层次顺序,然后再按照优先级顺序,排列你的技术,尽管按照优先级排列是唯一必要条件(OGRE按照排列的前后顺序决定哪一个是"最好的")。你必须在lod_index 0层上至少有一个技术。

       

    在一个细节层次水平上所应用的距离是靠包含在材质里的lod_distances属性决定的。细节详见下面lod_distances部分。

       

    默认: lod_index 0

    lod_distances

       

    注意:这一属性必须在材质部分之外指定(例如,所有技术的父层次),而在这里进行介绍是因为它与这部分关系最密切。

       

    在设置这个属性前,你先要指定你想要这个材质基于距离镜头的远近距离决定它使用的技术。你必须给定一个升序的距离表,其中每一项指定了材质将要转换到下一个细节层次的距离。暗含的意思就是,如果小于距离表中最小值,则所有材质在细节层次0上都会显示。你必须保证每个细节层次上至少有一个技术(所以,如果你指定了三个距离,你就必须有技术1、技术2和技术3)。注意你必须总是保证在lod_index 0上至少有一个技术。

       

    格式: lod_distances <distance_1> [<distance_2> ... <distance_n>]

    示例: lod_distances 300.0 600.5 1200

    距离在300单位以下时,上例会令材质选用lod_index 0中最好的技术;距离在300到600之间时,会选用lod_index 1中最好的技术;距离在600到1200之间时,选用lod_index 2中最好的技术;距离在1200以上时,选用lod_index 3中最好的技术。

       

    技术也包括一个或一个以上渲染通路(且必须至少有一个),详见3.1.2 渲染通路(Pass)部分。