Ogre参考手册(二)3.1.1-3.1.2 材质、技术、通道
说明
翻译自Ogre 1.81 manual,在不影响理解的情况下做了删减,以减小阅读的时间和翻译的工作量
这么做只是去掉了文字上修饰部分,并没有减少任何原文档中的知识点,可以作为对等的参考手册
另外对一些不易理解的部分做了修改,或通过“附”做了标注
如果你发现了不易理解的部分,可以跟帖回复,我会原文做修改或回复
注:原文编写时间2006年第三季度,已经接近十年
所以里面所说的老显卡都已是古董,先进显卡也已是老显卡
3 脚本
Ogre的很多功能可以通过脚本驱动,以便于设置。脚本都是简单的文本文件,可以使用任何标准的文本编辑器编辑。脚本编辑后立即生效,不需要重新编译。有利于快速创建原型
Ogre支持以下脚本:
材质、合成器、粒子、层(overlay)、字体定义
3.1 材质
材质脚本提供了通过脚本定义复杂材质的能力。同时,你仍可以在代码中通过Material和Texture等类设置材质,不过那么做比较笨。作为替代,你可以将材质定义在文本文件中并在需要的时候加载。
脚本加载
材质脚本在资源组初始化时加载,Ogre查找所有资源位置(Root::addResourceLocation)下的’.material’扩展名文件并解析。如果你需要手动解析文件,可以使用MaterialSerializer::parseScript()。
需要注意,材质并没有在解析过程中完全加载,即仅加载了定义,纹理或者其它资源都没有加载。这是因为材质库通常都很大,实际中某个场景大都仅使用了相对很小的子集,完全加载所有脚本中的材质会导致不必要的内存消耗。你可以以通常的方式访问一个延迟加载的材质(MaterialManager::getSingleton.getByName()),但在使用之前必须调用load方法。在使用entyity等设置材质时,Ogre自动完成这些。
另外,材质名称必须在系统的所有脚本中唯一,因为材质都通过名称标识。
格式
可以在单个脚本中定义多个材质。采用伪C++格式,各段使用大括号’{}’限定,注释使用’//’(不允许嵌套注释,1.8之前不允许中文注释)。例:
// This is a comment
material walls/funkywall1
{
// first, preferred technique
technique
{
// first pass
pass
{
ambient 0.5 0.5 0.5
diffuse 1.0 1.0 1.0
// Texture unit 0
texture_unit
{
texture wibbly.jpg
scroll_anim 0.1 0.0
wave_xform scale sine 0.0 0.7 0.0 1.0
}
// Texture unit 1 (this is a multitexture pass)
texture_unit
{
texture wobbly.png
rotate_anim 0.25
colour_op add
}
}
}
// Second technique, can be used as a fallback or LOD level
technique
{
// .. and so on
}
}
材质必须有名称,名称必须唯一,名称中可以含路径符’/’,该字符可以用来逻辑划分材质,也有助于避免重复,引擎并不依据此按树结构处理。如果材质名称包含空格,需用双引号括起来
注:冒号’:’用于指定材质拷贝(继承),不可以作为名称使用
材质可以从之前定义的材质继承,通过在材质名后使用’:’,之后是被继承的材质名称。你可以只继承其它材质的一部分,参考“脚本继承”,你还可以在继承中使用变量,参考“脚本变量”
材质由多个技术(3.1.1 Technique)组成,技术是获取你想要的效果的一种方式。你可以提供多个技术,以便在硬件不支持最佳技术时提供备选的实现,或者你希望在物体很远的时候采用材质的低LOD(level of detail)版本以节省渲染能力。
技术由多个通道组成(pass),用于将物体的完整渲染划分为多次以实现组合效果。当通道中使用的纹理个数超出了硬件支持的最大个数时,Ogre自动在运行时将其化分为多个通道(仅在没有使用片段着色器的时候)。每个通道都有些顶层属性如环境光等。参考3.1.2 Pass
每个通道可包含0到多个纹理单元,参考3.1.3TextureUnit。定义了使用的纹理图、可选的混合操作(多纹理)和纹理效果
可以在通道中引用顶点、片段着色程序,同时指定一组程序参数。着色程序声明在独立的.program脚本文件中。参考:3.1.4声明顶点/片段程序,3.1.9在通道中使用顶点/几何/片段程序
材质具有以下属性:
lod_strategy
设置所采用lod策略名称,策略名称包括:
‘Distance’ 依据相机的距离计算LOD
‘PixelCount’ 基于屏幕空间的像素数计算LOD
格式:lod_strategy <name>, 默认Distance
lod_distances(废弃)
使用lod_values代替
lod_values
从高LOD到低LOD指定一组值,标明材质切换到下一LOD的位置点,即定义材质改变LOD的数值。设置此属性,表明需要根据相机的距离或者近似的屏幕覆盖率选择材质所用的技术。隐含的,LOD 0在小于第一个值时激活(你不需要在开始指定0)。你需要保证每个值对应的lod_index至少对应一个技术(如果你指定了三个值,你需要多个技术分别对应LOD 0 1 2 3)。你必须为LOD 0设置至少一个技术。
格式:lod_values <value0> <value1>…., 默认无
例:lod_values 300.0 600.5 1200 ,设置4个lod,lod0为0-300,lod3为1200以上。
receive_shadows
设置使用此材质的物体是否接受阴影投射
格式:receive_shadows <on|off>, 默认on
物体是否接受阴影受很多因素控制,参考:7阴影。注:透明物体永远不接受阴影,此选项仅用于不透明物体
transparency_casts_shadows
控制透明物体是否投射阴影
格式:transparency_casts_shadows <on|off>,默认off
物体是否接受阴影受很多因素控制,参考:7阴影。选项控制是否允许透明材质投射阴影,否则不投射。比如:渲染纹理阴影时,透明材质通常并不渲染到阴影纹理,因为其不阻挡光线。此标记可覆盖这种处理方式
set_texture_alias
设置纹理别名关联的纹理
格式:set_texture_alias <alias name> <texture name>
用于设置从其它材质中继承的纹理单元所使用的纹理。参考:3.1.12纹理别名
3.1.1 Techniques 技术
材质脚本中的技术定义了物体的一种渲染方式。最简单材质定义仅包含一个技术,不过因为硬件能力各种各样,这么做需要确保你的目标硬件都具备该技术所要求的能力。另外,如果你希望使用材质LOD,使用技术可以定义更简单的材质渲染方式,即远距离的物体使用更简单的、对性能要求更小的技术。
当材质第一次使用时,需要先编译。包括扫描所有技术,并标记所有当前渲染API和硬件支持的技术。如果没有技术被支持,材质将渲染为空白。编译过程检查以下内容:
l 各通道纹理个数
如果纹理个数超过了图形卡支持的个数,只要没有使用片段着色器,该技术仍然可用。这种情况下,Ogre将会把含有过多纹理的通道化分为多个通道以支持低性能的显卡,同时多纹理混合也将转换为多通道混合
l 是否使用了顶点、几何、片段着色程序
l 其它效果如立方体映射、dot3混合
l 供应商名称是否符合用户的特定设置
在材质脚本中,技术需要以性能的顺序排列。即排在前面的技术优先于后面技术的使用。这意味这你应该将最先进的技术排在前面。
为了清晰的标明技术,可以给技术指定名称(可选)。没有名称的技术采用技术索引号作为名称。第一个技术索引为0,名称为”0”。技术名称必须唯一,否则最终的技术将是所有同名技术的混合结果,同时Ogre.log将记录一条警告。指定名称的技术有助于在材质继承时修改已有的技术
技术有以下属性:
scheme
设置技术所属的方案。材质方案用于从一组技术切换到另一组。比如,你可以在材质中定义高中低三个等级以便于用户选择性能/质量。或者比如你在高端机器上使用全部HDR管线,用着色器渲染所有物体,在其它硬件条件下仅采用简单的管线。这些都可以通过方案实现。当前活动的方案一般在viewport级控制(viewport::setMaterialScheme),默认的方案是’Default’
格式:scheme <name>, 例:scheme hdr
lod_index
设置技术的LOD (细节层次,level of detail)索引
格式:lod_index <int> , 默认0
所有技术都对应某个Lod,默认为0,即最高的LOD。增加索引意味更低的LOD。你可以(大多数时候)为多个技术指定相同的LOD,这意味着Ogre将挑选相同LOD中最好的技术。为了可读性,建议你将技术按LOD、性能的顺序排列,虽然只后一种是必须的(Ogre依据顺序决定哪一个最好)。你需要至少有一个Lod 0技术。
LOD的应用距离依据材质的lod_distances设置
shadow_caster_material
使用纹理阴影时,你可以指定将对象渲染到阴影纹理时的替代材质。这如同shadow_caster_vertex_program的高级版本,注意你必须在一个通道中渲染阴影,而且只能是第一个通道。
shadow_receiver_material
使用纹理阴影时,你可以指定执行阴影接收通道时的替代材质。注意,这里显式的接收通道仅应用于非集成纹理阴影,即阴影渲染被单独处理(通过调整通道或者灯光叠加通道)。这如同shadow_receiver_vertex_program / shadow_receiver_fragment_program的高级版本,注意你需要在一个通道中渲染阴影,而且只能是第一个通道。
gpu_vendor_rule/gpu_device_rule
虽然Ogre可以很好检测硬件的兼容性并依据此设置支持的技术,但偶而有些图形卡的特殊行为超出必要的检测范围,你可以匹配特殊的规则让技术仅在特定的供应商图形卡上可用/不可用,或者在匹配设备名称模式时可用/不可用
格式:gpu_vender_rule <include|exclude> <vender_name>
gpu_device_rule <include | exclue > <device_pattern> [case_sensitive]
include表示在匹配时技术可用,esclude表示不匹配时可用,你可以指定多个规则。有效的vendor_name目前包括:nvidia\ati\intel\s3\3dlabs。deviec_pattern可以是任何字符,你还可以使用通配符’*’。例:
gpu_vendor_rule include nvidia
gpu_vendor_rule include intel
gpu_device_rule exclude *950*
即技术仅支持nvidia和intel制造、且设备名称不包含950的图形卡
注:这些规则仅用于在硬件兼容性判断通过时将技术标记为不支持。通过了规则验证的技术仍适应于普通的硬件兼容性验证。
3.1.2 Pass 通道/通路
通道是相关几何体的一次渲染,对应一组渲染状态下的一次渲染API调用。一个技术可以包含1到16个通道,技术包含的通道越多,渲染的成本越高。
通道可以指定名字,没有指定名字的通道名称默认为通道索引。比如:技术对应的第一个通道索引为0,则名字为”0”。一个技术中的通道名必须唯一,否则最终通道将是所有同名通道的混合结果。这种情况下Ogre.log将会记录一条警告信息。为通道指定名称有助于材质继承时修改已有的通道。
通道包括以下属性和0到多个纹理单元texture_unit,以及可选的顶点/几何/片段着色程序:
ambient
环境光反射属性,对应环境光的红、绿、蓝成份在顶点的反射比例。可以使用vertexcolour指定使用网格(mesh)中定义的顶点色。默认颜色为纯白。当光照关闭(lighting off)或者任意一个纹理层设置了’colour_op replace’属性时,此设置无效。使用asm\cg\hlsl时,此属性无效,使用glsl时可在着色器中读取opengl材质属性
格式: ambient (<red> <green> <blue>
[<alpha>]) | vertexcolour, 默认: ambient 1.0 1.0 1.0 1.0
例:ambient 0.0 0.8 0.0 或 ambient vertexcolour
diffuse
漫反射光属性,对应漫反射光(场景中创建的Light类实例)的红、绿、蓝成份在顶点的反射比例。可以使用vertexcolour指定使用网格中定义的顶点色。默认颜色为纯白。当光照关闭(lighting off)或者任意一个纹理层设置了’colour_op
replace’属性时,此设置无效。使用asm\cg\hlsl时,此属性无效,使用glsl是可在着色器中读取opengl材质属性
用法: diffuse (<red> <green> <blue>
[<alpha>]) | vertexcolour, 默认: diffuse 1.0 1.0 1.0 1.0
例:diffuse 0.0 0.8 0.0 或 diffuse vertexcolour
specular
镜面光属性,对应镜面光(Light类实例高亮)的红、绿、蓝成份在顶点的反射比例。可以使用vertexcolour指定使用网格中定义的顶点色。镜面高亮的程度由参数shininess决定,shininess越大高亮越尖锐,shininess取0-1时镜面光将应用到整个表面,最好的取值范围为1-128。动态灯光关闭或者任意纹理层使用’colour_op replace’时,此设置无效
用法: specular (<red> <green> <blue> [<alpha>]) | vertexcolour <shininess>
例:specular 1.0 1.0 1.0 1.0 128
默认: specular 0.0 0.0 0.0 0.0 0.0
emissvie
物体自我照明属性。可以使用关键字vertexcolour指定使用网格中定义的顶点色。
用法: emissive (<red> <green> <blue> [<alpha>]) | vertexcolour
例:emissvie 1.0 0 0
scene_blend
设置通道与场景已有内容的混合方式。纹理的混合(参考3.1.3texture_unit)用于纹理层之间的混合,通道混合设置整个通道的最终结果与渲染目标已存在内容的混合方式。混合支持透明等特效。有两种格式:一种为用于常见混合的预定义方式,另一种直接设置源、目标因子。
格式一:scene_blend <add|modulate|alpha_blend|colour_blend>
这是简单的形式,通过一个参数枚举常见的混合类型:
add 渲染颜色叠加到场景。用于爆炸、烟火、照明、幽灵,等价于’scene_blend one one’
modulate 渲染颜色与场景相乘。渲染同时会将场景变暗。适合烟熏的玻璃、半透明等。等价于’scene_blend dest_colour zero’
colour_blend 根据颜色为场景上色,不会暗化场景。等价于’scene_blend src_colour one_minus_src_colour
alpha_blend 利用alpha值混合场景,等价于’scene_blend src_alpha one_minus_arc_alpha’
格式二:scene_blend <src_factor> <dest_factor>
这个版本允许对混合操作进行完全的控制,最终结果=textue*sourceFactor+scene_pixcel*destFactor,有效的因子包括:
one 常量1
zero 常量0
dest_colour 目标颜色
src_color 源颜色
one_minus_dest_colour 1-dest_colour
one_minus_src_colour 1-src_colour
dest_alpha 目标alpha
src_alpha 源alpha
one_minus_dest_alpha 1-dest_alpha
one_minus_src_alpha 1-src_alpha
默认:scene_blend one zero 不透明
separate_scene_blend
类似scene_blend,可以分别指定颜色成份和alpha成份的混合方式。此选项仅在渲染目标存在alpha通道时才意义,以便后续可以使用alpha通道,比如渲染到纹理。
格式一: separate_scene_blend <simple_colour_blend> <simple_alpha_blend>
与scene_blend格式一相同
格式二: separate_scene_blend <colour_src_factor> <colour_dest_factor> <alpha_src_factor> <alpha_dest_factor>
与scene_blend格式二相同
scene_blend_op
改变默认的场景混合等式的源、目标成份最后的混合表达式操作符,该操作符默认为’add’/’+’,即混合等式默认为:
source*srcFactor ‘+’ dest*destFactor.
格式:scene_blend_op <add|subtract|reverse_subtract|min|max>
separate_scene_blend_op
类似于scene_blend_op,区别在于分别设置颜色和alpha成份的混合表达式操作符
格式: separate_scene_blend_op <colourOp> <alphaOp>
默认值:separate_scene_blend_op add add
depth_check
是否进行深度检查,参考depth_func进行更高级的配置
默认:depth_check on
depth_write
是否进行深度写
默认:depth_write on
depth_func
设置深度比较函数
格式:depth_func always_fail | always_pass | less | less_equal | equal | not_qual | greate_equal | greater
默认:depth_func less_equal 即小于等于时通过测试
depth_bias
深度偏移,用于共面时将其移动到其它之上。
格式:depth_bias <constant_bias> [<slopescale_bias>]
最终深度值 = depth - (constant_bias * minObservableDepth + maxSlope * slopescale_bias)
depth_bias 1表示深度值向前移动一个刻度。当两个面共顶点时,depth_bias 1即可将其移到上面。如果不共顶点,数据精度会导致计算的深度存在偏差(距离相机越近深度偏差越大,同样的距离差在相机很近时对应了较大的深度差),这种情况下至少要depth_bias 2 2才能移到上层。
iteration_depth_bias
用于通道多次迭代时,设置附加的偏移值。如果需迭代三次,第一次偏移为depth_bias,第二次为depth_bais+ iteration_depth_bias,第三次为depth_bais+ iteration_depth_bias*2
格式: iteration_depth_bias <bias_per_iteration>
alpha_rejection
设置通道依据alpha值抛弃像素的方式,用于处理仅存在透明、不透明两种状态的物体,比如树叶。
格式:alpha_rejection <always_fail | always_pass | less | less_equal | equal | not_qual | greater_equal | greater> <value>
例: alpha_rejection greater_equal 128,理论上value可以使用0-255之间任何值,但为了硬件兼容性最好限制在0-128。
alpha_to_coverage
设置是否依据纹理alpha对纹理边缘进行多重采样,以便与背景较好的融合,一般只能用于2006年之后的显卡。适用于植物的叶子和链接栅栏样式纹理。
格式:alpha_to_coverage <on|off>
light_scissor
设置当前通道的渲染是否限制在依据灯光衰减范围计算的屏幕空间裁剪矩形之内
格式:light_scissor <on|off>
这个选项通常仅在当前通道是灯光叠加通道时有用,而且至少是在技术的第二个或以上的通道。即设置不对当前灯光影响外的区域进行渲染。如果多个灯光传递到该通道,裁剪区将会定义为覆盖所有灯光的屏幕空间。方向灯因为无限大,将忽略此选项。
使用标准的灯光叠加阴影时不用指定此选项,因为这是默认行为。如果你使用集成纹理阴影自定义的通道,就需要指定。
light_clip_planes
设置三角形装配是否限制在灯光覆盖的裁剪体内。方向灯忽略此选项,点光源裁剪体定义为根据灯光衰减计算的立方体,聚光灯裁剪体为依据照射角和灯光衰减范围确定的金字塔形。
格式:light_clip_planes <on|off>
此选项仅在只有一个点光源或聚光灯时有效,如果超过一个光源或者是方向灯时无效。如果没有灯,则所有物体不被渲染。
使用标准的叠加阴影时(模板叠加、纹理叠加),不论通道如何设置,你都可以通过SceneManager::setShadowUseLightClipPlanes开启裁剪(因为是逐个灯光进行渲染)。此选项默认关闭,因为使用裁剪平面并不一定会更快,这依赖于灯光覆盖的场景范围。一般来说,灯光范围越小,得到的益处越可能大于裁剪本身的性能损耗。如果你不使用阴影或者使用集成纹理阴影自定义的通道方式,可以使用此选项设置各个通道。
使用Opengl时需要注意:使用ARB顶点程序时所有自定义裁剪平面均无效。使用GLSL时仅在shader中使用gl_ClipVertex时自定义裁剪才可用,详细参考GLSL文档。在Direct3D中自定义裁剪永远可用。
illumination_stage
采用叠加光照模型时(模板叠加、纹理叠加),场景分为3个独立的阶段进行渲染。ambient(环境光),per-light(逐个灯光阴影叠加)、decal(贴花)。通常Ogre可自动将通道分类,但有些效果需要手动指定照明属性。比如在默认的渲染序列中,纹理在最后decal阶段才应用,这会暗化镜面光的效果。作为代替方案,你可以将纹理应用到per-light阶段,以便在贴纹理之后再叠加镜面光,而不再提供单独的贴花阶段。
如果你设置一个通道的illumination阶段,你需要同时设置技术内所有通道,否则设置无效。每个分类可以有多于一个通道,且不可调换顺序。即所有的ambient通道将在per_light通道之前渲染,同样所有的per_light通道也在decal通道前渲染,同时各分类内的通道也保持按顺序渲染。
格式:illumination_stage <ambient | per_light | decal>
normalize_normals
是否自动normalise各顶点法线
格式:normalise_normals <on | off>, 默认off
缩放物体会导致法线缩放,这可能会导致光照计算错误。默认情况下,SceneManager自动检测和re_normalizse所有被缩放物体的法线,这会存在一些性能消耗。如果你愿意手工控制,可以调用SceneManager::setNormaliseNormalsOnScale(false),然后在对法线缩放敏感的材质中使用此选项.
transparent_sorting
设置透明纹理是否按深度排序
格式:transparent_sorting <on | off | force> , 默认 on
默认情况下,所有透明物体依据相机距离排序后从远到近渲染。这是通常的做法,但有些情况下,并不需要深度排序。比如需要当前帧和下一帧渲染顺序必须一样的时候。这种情况下,可以设置为off阻止排序。
还可以通过force设置强制排序。通常在通道透明(目标颜色参与计算)且需要深度写或读,表明不排序不能进行可靠的渲染时才排序。通过设置’force’,可以让Ogre强制进行排序而不管其它情况。
cull_hardware
设置硬件裁剪方式
格式:cull_hardware <clockwise|anticlockwise|none>, 默认clockwise
注:Ogre默认与Opengl一致,都采用右手坐标系,和Direct3D相反
cull_software
设置软件裁剪方式
格式:cull_software <back|front|none>, 默认back
有些情况下,引擎在将几何体发送到硬件之前也会进行裁剪。软件裁剪依据表面的法线方向(大部分时候可以预计算,并不一定与Ogre默认的一致),不同于硬件依据三角面的顶点顺序。如果使用合适的场景管理器,你可以通过关闭硬件裁剪,完全使用软件基于表面法线方向进行裁剪。
lighting
设置灯光是否有效。灯光关闭时,通道对应的所有物体将被完全照亮。使用顶点程序时此选项无效。
格式: lighting <on|off> 默认on
灯光关闭时,所有ambient\diffuse\specular\emissive和shading属性无效。灯光开启时,物体依据顶点法线计算diffuse\specular以及全局的ambient\emissive
shading
设置通道动态灯光着色类型
格式:shading <flat | gouraud | phong> 默认 gouraud
灯光开启时,光照用于计算各顶点颜色。此选项用于定义如何根据计算出的顶点颜色对表面差值。
flat 无差值,采用表面第一个顶点颜色
gouruand 依据表面的顶点颜色线性差值
phong 依据顶点法线对表面差值,然后再计算各像素颜色(逐像素光照)。可以得到更自然的光照效果,不过花费更高,在高分割化时效果更好,不过不是所有硬件都支持。
polygon_mode
多边形光栅化方式,是否进行填充或者仅绘制边线或顶点
格式:polygon_mode <solid | wireframe | points>, 默认solid
polygon_mode_overrideable
设置通道的polygon_mode是否可被相机的polygon_mode降级。
格式:polygon_mode_overrideable <true|false> 默认true
fog_override
设置否是重载场景雾设置。注:仅影响固定管线雾,原始的场景雾参数仍通过fog_params参数传送到着色器
格式:fog_override <override> [<type> <colour> <density> <start> <end>], 默认false
例: fog_override true exp 1 1 1 0.002 100 10000
colour_write
是否写入颜色
格式:colour_write <on|off> 默认on
通过关闭颜色写和最小化其它设置,可用于初始化深度缓冲区。这可以在较新的显卡上显著的提高性能,特别是使用了复杂的片段着色器时,因为深度检查失败后不再需要运行片段着色器。
start_light
设置通道使用的第一个光源
格式:start_light <number> 默认0
可用于指定多个不同的通道分别处理不同的光源。同时可以与iteration选项结合使用
max_lights
设置通道最大可用光源个数
格式:max_lights <number>, 默认8
基于固定管线的最大的可用灯光由Rendering System决定,典型为8。可编程管线依赖相应的程序。
iteration
设置通道迭代方式,即运行多次
格式1:iteration <once | once_per_light> [lightType]
格式2:iteration <number> [<per_light>[lightType]]
格式3:iteraion <number>[<per_n_lights><num_lights>[lightType]]
默认通道仅运行一次。不过,如果你使用可编程管线,或者你希望超出正常支持的灯光个数限制,你需要使用once_per_light选项。这种情况下,仅light index 0被使用,通道被执行多次,每次不同的灯光被依次设置为light index 0。这会让通道耗费昂贵,但这大概是实现某些效果的唯一办法,比如支持1-n个灯光的逐像素的光照效果。
采用number而不是once设置通道在设置渲染状态后执行多次。因为初始设置后渲染状态不变,所以每次重复调用速度很快,这对于使用了着色程序并需要在相同渲染状态下多次迭代时很理想,比如:毛发、运动模糊等特殊的过滤。
如果你使用了once_per_light,你需要在通道前添加ambient通道,否则不在所有灯光范围内的物体将不会渲染。即便在场景没有环境光时这也很重要,因为你可能希望显示该对象的轮廓。
lightType参数仅在使用once_per_light\per_light\per_n_lights时有效,用于限制通道运行于某一种光源类型:point\directional\spot。这在写顶点\片段着色器时会很有用,因为假定了光源类型会容易很多。而且至少点光源和方向光可以以同一种方式处理
注:可通过自动参数pass_number\pass_iteration_number告诉着色程序通道索引号和迭代索引号
// GLSL simple Fur
vertex_program GLSLDemo/FurVS glsl
{
source fur.vert
default_params
{
param_named_auto lightPosition light_position_object_space 0
param_named_auto eyePosition camera_position_object_space
param_named_auto passNumber pass_number
param_named_auto multiPassNumber pass_iteration_number
param_named furLength float 0.15
}
}
point_sprites
是否将点渲染为四边形,默认off。开启point_sprites需设置point_size为适当大小或者同时开启point_size_attenuation,否则默认渲染1像素大小的点
示例:
point_sprites on
point_size 5
point_size_attenuation on 0 10 0
point_size
点精灵渲染大小,默认值1.0,为一个像素大小,当point_size_attenuation开启时为相对大小,对应整个屏幕高度。需开启点精灵,点最大/最小大小受point_size_min\point_size_max控制。 示例: point_size 32
point_size_attenuation
点精灵大小是否按距离衰减,公式 = pointSize * 1 / (constant + linear * dist + quadratic * dist^2)
需设置constant linear quadratic 三个参数,默认 0 1 0 ,即按透视衰减。需开启点精灵,点最大/最小大小受point_size_min\point_size_max控制
用法:point_size_attenuation <(on [constant linear quadratic])|off>
示例:
point_sprites on
point_size_attenuation on 1 2 0.1
point_size_min
点精灵最小大小,默认为0 : point_size_min 0
point_size_max
点精灵最大大小,默认为0,代表显卡支持的最大大小
point_size_max 0