材质
技术(Techniques)
格式:Format: technique 技术名
技术只有为数不多的几个属于它们自己的属性:
scheme
设置技术所属的“方案”
格式: scheme <方案名>
示例: scheme hdr
默认: scheme Default
lod_index
设置该技术所属的细节层次索引。
格式: lod_index <数字>
数字的合法数值范围是 0(最高细节层次)到 65535,尽管这是不可能的。在技术之间的细节层次索引中不能留空当。也就是说,细节层次索引要按顺序排列,例如:0,1,2,3,……;而不能出现:0,10,20,30,……,这样的情况。
示例: lod_index 1
默认: lod_index 0
lod_distances
材质属性,与 lod_index 有直接关系
格式: lod_distances <distance_1> [<distance_2> ... <distance_n>]
示例: lod_distances 300.0 600.5 1200
渲染通路(Pass)
ambient
设置此渲染通路中周围环境的反射系数
格式: ambient (<red> <green> <blue> [<alpha>]| vertexcolour)
数值的取值范围在0.0到1.0之间。
示例: ambient 0.0 0.8 0.0
默认: ambient 1.0 1.0 1.0 1.0
diffuse
设置此渲染通路中漫反射系数。
格式: diffuse (<red> <green> <blue> [<alpha>]| vertexcolour)
数值的取值范围在0.0到1.0之间。
示例: diffuse 1.0 0.5 0.5
Default: diffuse 1.0 1.0 1.0 1.0
specular
设置此渲染通路中镜面反射颜色的反射系数。
格式: specular (<red> <green> <blue> [<alpha>]| vertexcolour) <shininess>
数值的取值范围在0.0到1.0之间。闪耀值(shininess)可以是任意比0大的值。
示例: specular 1.0 1.0 1.0 12.5
默认: specular 0.0 0.0 0.0 0.0 0.0
emissive
设置一个物体自发光的量。
格式: emissive (<red> <green> <blue> [<alpha>]| vertexcolour)
数值的取值范围在0.0到1.0之间。
示例: emissive 1.0 0.0 0.0
默认: emissive 0.0 0.0 0.0 0.0
scene_blend
设置此渲染通路与场景中现有的内容混合的方式
格式1: scene_blend <add|modulate|alpha_blend|colour_blend>
示例: scene_blend add
可用的混合形式参数如下:
- 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_src_alpha”
格式2: scene_blend <src_factor> <dest_factor>
示例: scene_blend one one_minus_dest_alpha
这种格式允许你通过设置源和目标因数,从而完全控制混合操作。最终被写入渲染目标的颜色结果是(texture * sourceFactor) + (scene_pixel * destFactor)。两个参数的可选值如下:
one
常数值1.0
zero
常数值0.0
dest_colour
已存在的像素颜色
src_colour
纹理像素颜色
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 (这句意为不透明的)
depth_check
设置此渲染通路的深度缓冲检测的状态是打开状态还是关闭状态。
格式: depth_check <on|off>
默认: depth_check on
depth_write
设置此渲染通路的深度缓冲写入的状态是打开状态还是关闭状态。
格式: depth_write <on|off>
默认: depth_write on
depth_func
当深度检测打开时,设置用于比较深度值的函数。
格式: depth_func <func>
能的函数如下:
always_fail
永远不向渲染目标写入像素
always_pass
总是将像素写入渲染目标
less
如果将要写入的像素的深度小于现在缓冲区内容的深度,则写入
less_equal
如果将要写入的像素的深度小于等于现在缓冲区内容的深度,则写入
equal
如果将要写入的像素的深度等于现在缓冲区内容的深度,则写入
not_equal
如果将要写入的像素的深度不等于现在缓冲区内容的深度,则写入
greater_equal
如果将要写入的像素的深度大于等于现在缓冲区内容的深度,则写入
greater
如果将要写入的像素的深度大于现在缓冲区内容的深度,则写入
默认: depth_func less_equal
depth_bias
设置此渲染通路的深度值的偏向。可用于使共面的多边形中的一个位于其它之上。例如:印制花纹图案。
格式: depth_bias <constant_bias> [<slopescale_bias>]
深度偏向值最终由偏向常数(constant_bias)*最小可观察的深度(minObservableDepth)+最大坡度(maxSlope)*坡度偏向(slopescale_bias)共同决定。坡度偏向与多边形到镜头的角度有关,形成相应的偏向值,但是在一些时间比较早的硬件上,这被忽略了。偏向常数是形成最小深度值的一个因素,所以1的价值就在于一点一点地缓慢地推进深度。
alpha_rejection
设置此项,可以使用alpha作为一个阀值,令渲染通路拒绝来自管线的像素。
格式: alpha_rejection <function> <value>
示例: alpha_rejection greater_equal 128
如上例所示,拒绝所有来自管线的alpha值大于等于128的像素。 function参数可以选择在depth_function属性的参数列表中所列的参数。value参数理论上可以是0到255之间的任意数,但是考虑到硬件兼容性,最好限制在0到128之间。
默认: alpha_rejection always_pass
cull_hardware
设置此渲染通路的硬件裁剪模式。
格式: cull_hardware <clockwise|anticlockwise|none>
硬件渲染引擎裁剪三角形的典型方法是基于三角形顶点的环绕顺序。顶点环绕顺序又与渲染操作中顶点传送和编号的方向有关,从镜头中看到的有可能是顺时针的也可能是逆时针的。如果选择了'cull_hardware clockwise'设置,则所有从镜头看顺时针顺序的三角形被硬件剪裁掉。显然,'anticlockwise'设置裁剪掉逆时针顺序的三角形。'none'设置关闭硬件裁剪,即所有三角形都渲染(用于渲染双侧道路)。
默认: cull_hardware clockwise
默认值与OpenGL的默认值相同,与Direct3D的默认值相反(因为OGRE与OpenGL一样使用右手坐标系)。
cull_software
设置此渲染通路的软件裁剪模式。
格式: cull_software <back|front|none>
在某些情形下,引擎也会在将几何体送往硬件渲染前进行软件裁剪。此设置仅在场景管理器使用它时起效(因为最好用在大量平面的世界几何体,而不是移动的几何体,因为用于移动的物体上代价会很大),但是如果在送入硬件之前可以有效裁剪的话还是可以使用的。在这种情况下,裁剪就要基于面向镜头的是三角形的背面还是正面——这个定义是基于面法向的(即:垂直于多边形平面且标示出正面方向的向量)。因为OGRE期望平面的逆时针方向为正向,所以软件裁剪'cull_software back'相当于硬件裁剪'cull_hardware clockwise'设置,也是为什么这两个作为默认设置的原因。虽然反映裁剪方式的命名是不同的,但是由于多数时候面法向都是预先计算好的且不一定是OGRE期望的方式,因此如果你有使用你自定义的面法向的场景管理器,也可以设置'cull_hardware none'然后完全基于你的面法向进行软件裁剪。
默认: cull_software back
lighting
设置动态光照是处于打开状态还是关闭状态。如果光照被关闭,那么所有使用此渲染通路的物体将被完全照亮。如果使用了顶点程序,则此属性无效。
格式: lighting <on|off>
关闭动态光照会使得任何环境光、漫反射光、镜面反射光、放射光和阴影属性都成为了多余的。当打开光照时,物体按照顶点的法向被照亮。
默认: lighting on
shading
设置此渲染通路中为表现动态光照而使用的各种阴影形式。
格式: shading <flat|gouraud|phong>
当动态光照打开时,效果就在每个顶点处生成颜色值。这些值是否全平面插入(如何插入)就依赖于这个属性设置。
flat
无插值参与。每个平面的阴影由平面上第一个顶点的颜色决定。
gouraud
平面上每个顶点的颜色采用线性插入。
phong
在全平面上插入顶点法线向量,被用于决定每个像素的颜色。能够得到更加自然的光照效果,但是代价也相应更高,在高级应用中表现更好。并不是所有硬件都支持此属性。
默认: shading gouraud
polygon_mode
设置多边形应该如何被栅格化。例如:它们应该是被填充后画出来,还是作为点(只有顶点)、线(只有外边框)画出来。
格式: polygon_mode <solid|wireframe|points>
solid
一般情况——填充多边形
wireframe
多边形只画外边框
points
只画每个多边形的点
默认: polygon_mode solid
fog_override
这个属性告诉渲染通路是否撤销场景的雾设置,而强制执行此渲染通路它自己的设置。当场景中其他的物体被雾遮挡,而你不想让雾影响某些物体时非常有用。当然反之亦然。注意这只影响固定功能雾——原来的场景雾参数仍然被送入渲染器,使用fog_params参数绑定(这就允许你关闭固定功能雾,转而在渲染器中计算;如果你想关闭阴影雾,你可以通过阴影参数关闭它。)
格式: fog_override <override?> [<type> <colour> <density> <start> <end>]
默认: fog_override false
如果你指定第一个参数为真,并给出了其余参数,就表明你要告诉渲染通路如果在使用这些雾设置和使用场景设置之间选择的话,优先选择使用这些雾设置。如果你指定第一个参数为真,但没给出其余参数,就表明你要告诉渲染通路不使用任何雾设置,无论场景如何设置。以下是参数的解释:
type
none = 没有雾,相当于使用'fog_override true'。
linear = 线性雾,从 <start> 开始到 <end> 结束的这一段距离有雾。
exp = 雾以几何方式增加(fog = 1/e^(distance * density)), 使用浓度 <density> 参数控制。
exp2 = 雾以几何的二次方增加,更加快速(fog = 1/e^(distance * density)^2),使用浓度 <density> 参数控制。
colour
3个0到1之间的符点数组成的序列,表示红色、绿色、蓝色的亮度。
density
用于'exp'或者'exp2'雾类型的浓度参数。虽不用于线性模式,但是也必须写上,作为占位符。
start
线性雾距离镜头的开始距离。在其它模式下,尽管不用这个参数,也必须写上,作为占位符。
end
线性雾距离镜头的结束距离。在其它模式下,尽管不用这个参数,也必须写上,作为占位符。
示例: fog_override true exp 1 1 1 0.002 100 10000
colour_write
设置此渲染通路的颜色写入是打开还是关闭的。
格式: colour_write <on|off>
如果颜色写入被关闭,那么此渲染通路中没有可见像素写入屏幕。你也许认为这没什么用,但是如果你关闭颜色写入并且合理利用其他一些小的渲染设置,你可以使用这个渲染通路在执行后续的填充颜色数据的渲染通路之前初始化深度缓冲区。这样可以极大地提升效果,尤其是当你使用复杂的片断程序的时候,因为如果深度检测失败了,片断程序根本就不会运行。
默认: colour_write on
start_light
设置此渲染通路使用的首个光源。
格式: start_light <number>
你可以使用这个属性设置此渲染通路的光源的开始位置。换句话说,如果你设置start_light为2,那么被处理的第一个光源就是实际列表中的第三个光源。例如,你可以利用这个选项,使用不同的渲染通路处理第一组的几个光源对第二组的几个光源,或者使用它与iteration选项协作,从列表的给定点开始迭代(例如,在第一个渲染通路里处理头两个光源,然后从此开始每次两个光源重复进行)
默认: start_light 0
max_lights
设置此渲染通路使用的光源的最大数量。
格式: max_lights <number>
光源的最大数量由渲染系统设定,通常为8,常用于渲染固定功能材质。
默认: max_lights 8
iteration
设置此渲染通路是否被迭代,多次重复执行。
格式 1: iteration <once | once_per_light> [lightType]
格式 2: iteration <number> [<per_light> [lightType]]
格式 3: iteration <number> [<per_n_lights> <num_lights> [lightType]]
示例:
iteration once
渲染通路只执行一次,默认设置。
iteration once_per_light point
渲染通路每个光源点执行一次。
iteration 5
此渲染通路的渲染状态将被建立,并且绘图调用将执行5次。
iteration 5 per_light point
此渲染通路的渲染状态将被建立,并且绘图调用将每个光源点各执行5次。
iteration 1 per_n_lights 2 point
此渲染通路的渲染状态将被建立,并且绘图调用将每2个光源点执行5次。
默认: iteration once
point_size
此设置允许你在渲染一个点列或者一个point sprites列时改变点的大小
格式: point_size <size>
默认: point_size 1.0
point_sprites
这个设置指定此渲染通路的硬件point sprites渲染是否打开。
格式: point_sprites <on|off>
默认: point_sprites off
point_size_attenuation
定义点的大小是否根据视觉空间距离增加而衰减,以及以何种方式衰减。
格式: point_size_attenuation <on|off> [constant linear quadratic]
默认: point_size_attenuation off
point_size_min
设置点衰减(详见上面point_size_attenuation)的最小值
格式: point_size_min <size>
默认: point_size_min 0
point_size_max
设置点衰减(详见上面point_size_attenuation)的最大值。
格式: point_size_max <size>
默认: point_size_max 0
纹理单元
纹理别名texture_alias
设置此纹理单元的别名。
格式: texture_alias <纹理别名>
示例: texture_alias NormalMap
如果此材质被其他材质复制且在新材质中只有纹理会被改变,这种情况下,设置别名是很有用处的。
默认:如果一个纹理单元有名字,那么此纹理单元的别名默认就是这个名字。
纹理texture
设置这一层要使用的静态纹理图像的名字。
格式: texture <texturename> [<type>] [unlimited | numMipMaps] [alpha] [<PixelFormat>]
示例: texture funkywall.jpg
这个设置与anim_texture属性是互斥的。注意纹理文件不能包含空格。喜欢在文件名里用空格的Windows用户们,请不要使用空格,而使用下划线替代。
参数type允许你指定创建的纹理类型——默认值是'2d',但是你可以改变;下面给出了全部列表:
1d
1维纹理;即仅有1像素高的纹理。这种纹理可以用于在纹理内(也可能在片断程序内)编码一个功能和使用它来进行简单查找。当你用一维纹理坐标的片断程序时这个设置是很重要的,因为GL要求你使用相匹配的纹理类型。(虽然D3D会让你通过,但是为了跨平台考虑,还是要注意这一点。)为了有最好的兼容性和显示效果,纹理宽度仍然需要是2的整数次幂,并且有深度。
2d
如果你省略type参数,则假设2d为默认值。纹理的宽度和高度都最好是2的整数次幂,使之成为一个正方形,因为这样的设置在大多数硬件上表现最好。可以由2D纹理坐标指向。
3d
三维纹理,例如volume纹理。这类纹理有2的整数次幂的宽和高,且有深度。可由3D纹理坐标指向,例如通过像素渲染器(pixel shader)。
cubic
这类纹理由贴在立方体内侧的6个2D纹理组成。可由3D纹理坐标指向,并且对于立方体反射映射(cubic reflection maps)和标准映射(normal maps)很有用。
'numMipMaps'选项允许你指定这个纹理的mipmap数量。默认值无限('unlimited')意味着mips的大小生成下限到1x1。你可以随意指定一个固定的数(甚至是0)。注意,如果你在多个材质脚本中使用相同的纹理,生成的mipmap数量将与装载纹理的第一个纹理单元中指定的数量一致——所以务必保持你的使用一致。
'alpha'选项允许你指定一个单独的通道(透明的)纹理作为alpha装载,而不是默认的载入红色通道。这有助于在固定功能的管线中使用只有alpha的纹理。默认值:none
<PixelFormat>选项允许你指定想要创建的像素格式,可能不同于装载的纹理文件的像素格式。应当牢记于心的是最终的像素格式会受到硬件能力的限制,所以你可能得不到完全符合你的要求的格式。可用选项如下:
PF_L8
8位像素格式,所有位表示luminace。
PF_L16
16位像素格式,所有位表示luminace。
PF_A8
8位像素格式,所有位表示alpha。
PF_A4L4
8位像素格式,4位alpha,4位luminace。
PF_BYTE_LA
2字节像素格式,1字节luminace,1字节alpha。
PF_R5G6B5
16位像素格式,5位红,6位绿,5位蓝。
PF_B5G6R5
16位像素格式,5位蓝,6位绿,5位红。
PF_R3G3B2
8位像素格式,3位红,3位绿,2位蓝。
PF_A4R4G4B4
16位像素格式,alpha、红、绿、蓝各4位。
PF_A1R5G5B5
16位像素格式,1位alpha,红、绿、蓝各5位。
PF_R8G8B8
24位像素格式,红、绿、蓝各8位。
PF_B8G8R8
24位像素格式,蓝、绿、红各8位。
PF_A8R8G8B8
32位像素格式,alpha、红、绿、蓝各8位。
PF_A8B8G8R8
32位像素格式,alpha、蓝、绿、红各8位。
PF_B8G8R8A8
32位像素格式,蓝、绿、红、alpha各8位。
PF_R8G8B8A8
32位像素格式,红、绿、蓝、alpha各8位。
PF_X8R8G8B8
32位像素格式,8位红,8位绿,8位蓝,与PF_A8R8G8B8一样,不过去掉了alpha。
PF_X8B8G8R8
32位像素格式,8位蓝,8位绿,8位红,与PF_A8B8G8R8一样,不过去掉了alpha。
PF_A2R10G10B10
32位像素格式,2位alpha,红、绿、蓝各10位。
PF_A2B10G10R10
32位像素格式,2位alpha,蓝、绿、红各10位。
PF_FLOAT16_R
16位像素格式,16位符点数红
PF_FLOAT16_RGB
48位像素格式,16位符点数红,16位符点数绿,16位符点数蓝。
PF_FLOAT16_RGBA
64位像素格式,16位符点数红,16位符点数绿,16位符点数蓝,16位符点数alpha。
PF_FLOAT32_R
32位像素格式,32位符点数红。
PF_FLOAT32_RGB
96位像素格式,32位符点数红,32位符点数绿,32位符点数蓝。
PF_FLOAT32_RGBA
128位像素格式,32位符点数红,32位符点数绿,32位符点数蓝,32位符点数alpha。
PF_SHORT_RGBA
64位像素格式,16位红、绿、蓝、alpha。
活动纹理anim_texture
设置用于活动纹理层的图像。这种情况下的活动纹理指的是有多幅画面,而每一幅画面都是单独的一个图像文件。有两种格式,一种是隐式的决定图像名,一种是显式的命名。
格式1 (短格式): anim_texture <base_name> <num_frames> <duration>
示例: anim_texture flame.jpg 5 2.5
上面格式1的例子建立了一个有5幅画面组成的活动纹理层,分别被命名为flame_0.jpg,flame_1.jpg,flame_2.jpg等等,长度2.5秒(2fps)。如果延时(duration)设置为0,那么不发生自动转换,需要在代码中手动改变。
格式2 (长格式): anim_texture <frame1> <frame2> ... <duration>
示例: anim_texture flamestart.jpg flamemore.png flameagain.jpg moreflame.jpg lastflame.tga 2.5
上面格式2的例子也建立了与格式1的例子一样延时的动画,只不过这次是由5个单独命名的图像文件组成的。第一种格式更简单,之所以给出第二种格式是为了解决图像不能统一命名的情况。
默认: 无
立方体纹理cubic_texture
设置在立方体纹理内使用的图像。由6个独立的图像组成一个立方体的6个面。如果硬件支持的话,这类纹理常被用在反射映射(reflection maps)或者天空盒(skyboxes)中。共有两种格式,一种是简短格式,图像名按一定特殊格式命名;另一种格式虽然更灵活,可以任意取名,但是长度也相应更长。
格式1 (短格式): cubic_texture <base_name> <combinedUVW|separateUV>
格式1这种格式的基础名如'skybox.jpg',系统会希望你提供的各面图像名为skybox_fr.jpg,skybox_bk.jpg,skybox_up.jpg,skybox_dn.jpg,skybox_lf.jpg,and skybox_rt.jpg。
格式2 (长格式): cubic_texture <front> <back> <left> <right> <up> <down> separateUV
格式2这种格式,每一面都显式地指定,以防如果没办法按一致的标准命名。你可以使用带separateUV参数的格式2,因为combinedUVW需要一个单独的纹理名赋值给复合3D纹理(见下面)。
两种格式中,最后一个参数的意思如下:
combinedUVW
6个纹理被合在一个立方体纹理映射中,使用带U,V,W元素的3D纹理坐标。对于反射映射是必要的,因为你永远不知道你将要需要的是哪一个面。需要注意的是,不是所有的显卡都支持立方体环境映射。
separateUV
6个纹理被分开来保存,但是被一个纹理层引用。在任一时刻只有一个纹理处于活动状态(实际上,它们被作为6幅画面保存起来),所以使用2D UV坐标。这种类型适用于天空盒(skyboxes)因为每次只有一面被渲染,而且在更老的显卡上也有硬件支持。
默认: 无
绑定类型binding_type
告诉这个纹理单元是绑定到片断处理单元还是绑定到顶点处理单元(3.1.10 顶点纹理拾取(Vertex Texture Fetch))。
格式: binding_type <vertex|fragment>
默认: binding_type fragment
内容类型content_type
告诉这个纹理单元从哪里取得它的内容,默认是从用texture,cubic_texture,anim_texture属性定义的一个命名纹理中取得内容。但是,你也可以从其他自动化的来源获取。选项如下:
named
默认选项,内容来自一个有名字的纹理,以平常的方式从一个文件或者根据给定的名字手动创建装载。
shadow
这个选项允许你拉入一个阴影纹理,并且只有在你使用纹理阴影和'custom sequence'阴影类型(详见[[文档:手册:1-4-0:7. 阴影|7. 阴影)时才可用。除非你使用基于光源的渲染通路循环或者在同一渲染通路的多个纹理单元中使用light_start选项使得光源从更高的序号开始,否则,讨论中的阴影纹理将会从第n个最近光源产生阴影。当你在同一个渲染通路的多个纹理单元中使用这个选项时,每一个引用下一个阴影纹理。万一你想要在另一个渲染通路里再次使用同一个阴影纹理,阴影纹理序号在下一个渲染通路内被重置(例如:单独的specular/gloss渲染通路)。依靠使用这个选项,正确的光源可视区域投影就被使用固定的方式建立起来了。如果你使用渲染器,只需在渲染器中引用texture_viewproj_matrix auto 参数即可。
格式: content_type <named|shadow>
默认: content_type named
纹理坐标集tex_coord_set
设置这个纹理层要使用的纹理坐标集。一个网格可以定义多个纹理坐标集,此属性设置这个材质使用哪一个坐标集。
格式: tex_coord_set <set_num>
示例: tex_coord_set 2
默认: tex_coord_set 0
纹理寻址模式tex_address_mode
定义在这个纹理层的纹理坐标超过1.0时发生的事情。你可以选择简单格式,一次对全部3个纹理坐标指定寻址模式,或者扩展的格式,使用三分之二的参数每个纹理坐标指定不同的模式。
简单格式: tex_address_mode <uvw_mode>
扩展格式: tex_address_mode <u_mode> <v_mode> [<w_mode>]
wrap
任何超过1.0的值都被置为0.0。纹理被重复一次。
clamp
超过1.0的值被固定为1.0。超过1.0的其它地方的纹理,沿用最后像素的纹理。用于当叠加过滤时,需要从0.0到1.0精确覆盖且没有模糊边界的纹理。
mirror
每到边界处纹理翻转,意思就是每个1.0 u或者v处纹理被镜像翻转。
border
超出[0.0, 1.0]范围的值都被置为边界色,也可以设置tex_border_colour属性。
默认: tex_address_mode wrap
纹理边界色tex_border_colour
设置边界色。(参考tex_address_mode)。
格式: tex_border_colour <red> <green> <blue> [<alpha>]
颜色的数值取值范围在0.0到1.0。
示例: tex_border_colour 0.0 1.0 0.3
默认: tex_border_colour 0.0 0.0 0.0 1.0
过滤filtering
设置当放大或缩小纹理时,使用的纹理过滤形式。这个属性有两种格式,简单格式就是指定预先定义好的过滤选项集的名字;复杂格式,就要你自己分别设定缩小,放大,mip过滤。
简单格式
格式: filtering <none|bilinear|trilinear|anisotropic>
默认: filtering bilinear
这种格式,你只需要提供如下的一个参数:
none
不使用过滤或mipmapping缩放。这相当于复杂格式的'filtering point point none'。
bilinear
当放大或缩小一个纹理时,使用2x2 box过滤,从列表中挑出一个mipmap但是在mipmaps的各级之间不使用过滤。这相当于复杂格式的'filtering linear linear point'。
trilinear
当放大或缩小一个纹理时,使用2x2 box过滤,最近的2个mipmaps被一起过滤。这相当于复杂格式的'filtering linear linear linear'。
anisotropic
除了过滤算法考虑了与镜头相关的三角形坡面而不是一味地简单做一个2x2像素过滤之外,这个属性与'trilinear'相同。这使得三角形的锐角看起来较少失真。相当于复杂格式的'filtering anisotropic anisotropic linear'。注意,要想这个属性有所不同,你还必须设置max_anisotropy属性。
复杂格式
Format: filtering <minification> <magnification> <mip>
Default: filtering linear linear point
这个格式给你对于缩小,放大,和mip过滤完全的控制权。参数如下:
none
无——唯一的一个'mip'过滤可用的参数,此参数完全关闭了mipmapping。对于缩小和放大的最低设置是'point'。
point
挑选缩小和放大模式最近的像素。在mip模式中,此选项挑选出最符合mipmap要求的。
linear
围绕最近像素点过滤出一个2x2大小的像素块。在'mip'过滤中,这可以在mipmap各层级之间衔接。
anisotropic
仅针对缩小和放大模式可用,对于三角形的摄像机空间斜坡过滤补偿。注意,要想这个属性有所不同,还必须设置max_anisotropy属性。
最大各向异性max_anisotropy
当过滤纹理时,设置渲染器将要补偿的各项异性的程度。这个度就是纹理在屏幕可见部分的高和宽的比值,就如伸向远方且竖直方向的纹理坐标比水平方向的纹理坐标变化的更快的地平面有比面对着你的墙更高的各向异性(如果你的目光与墙面垂直,则各向异性为1)。为了进行补偿,你需要把max_anisotropy属性设置为比1大的值。最大值由硬件决定,而通常来说设为8或者16。
为了使用这个属性,你必须设置这个纹理的缩小和/或放大过滤。
格式: max_anisotropy <value>
默认: max_anisotropy 1
mipmap_bias
设置用于mipmap计算的偏向值,因此允许你决定哪一级的纹理细节用于哪个距离。在规定的距离计算之后应用偏向值,对每一个偏向单元做出1级mipmap级别调整。负的偏向值强制增大使用的mip级别,正的偏向值减小使用的mip级别。偏向是符点数,所以你可以使用所有的数值进行调整。
为了使用这个属性,你的硬件必须支持mipmap偏向(通过渲染系统能力暴露出来),而且你的缩小过滤必须被设置成point或linear。
格式: mipmap_bias <value>
默认: mipmap_bias 0
colour_op
决定这个纹理层的颜色如何与它下面的一层叠加复合起来(或者如果它是第一层的话,如何将它与光照效果复合起来)。
格式: colour_op <replace|add|modulate|alpha_blend>
这个方法是混合纹理层最简单的方法,因为它只需要一个参数,给你最普通的混合类型,并且自动建立两种混合方法:一种是针对单渲染通路多纹理硬件可用时的混合;另一种是针对单渲染通路多纹理硬件不可用时通过多渲染通路完成混合。然而,这是相当受限的,并且无法使用更加灵活的多纹理操作,简单地因为这些在多渲染通路回撤模式下不能被自动地支持,或者你需要使用colour_op_multipass_fallback显式地设置一个回撤点。
replace
不加调整,用纹理颜色替换所有颜色。
add
加颜色成分。
modulate
乘颜色成分。
alpha_blend
基于纹理alpha混合。
默认: colour_op modulate
colour_op_ex
这是colour_op属性的扩展版,对于在这个纹理层与前面一个纹理层之间应用的混合允许极详细的控制。多纹理硬件可以应用更加复杂的混合操作,但受限于硬件所能用的纹理单元数。
格式: colour_op_ex <operation> <source1> <source2> [<manual_factor>] [<manual_colour1>] [<manual_colour2>]
示例: colour_op_ex add_signed src_manual src_current 0.5
看下面有关使用这个方法在多渲染通路和多纹理之间可能出现的问题。纹理颜色操作决定了渲染后最终平面出现的颜色。纹理单元被用来从各种不同的源中混合颜色值(例如,将通过光源计算的表面四散光与纹理的颜色叠加复合到一起)。这种方法允许你指定使用的“操作”,例如用“加”还是“乘”计算,以及用什么值作参数,是固定值还是以前算好的值。
Operation options
source1
不加任何改变地使用source1。
source2
不加任何改变地使用source2。
modulate
source1乘source2。
modulate_x2
source1乘source2,再乘2 (加亮).
modulate_x4
source1乘source2,再乘4 (加亮).
add
source1加source2。
add_signed
source1加source2,再减0.5.
add_smooth
source1加source2, 再减它们的乘积。
subtract
source1减source2
blend_diffuse_alpha
使用向顶点插入alpha值的方法调整source1,用(1-alpha)调节source2,再把两次调节后的结果相加。
blend_texture_alpha
同blend_diffuse_alpha,但是对纹理使用alpha。
blend_current_alpha
同blend_diffuse_alpha,但是对之前的stages使用当前alpha(对于第一层来说,与blend_diffuse_alpha相同)
blend_manual
同blend_diffuse_alpha,但是使用一个恒量alpha值,这个值在<manual>中指定。
dotproduct
source1点积source2
blend_diffuse_colour
使用向顶点中插入的颜色值调节source1,然后加上用(1-colour)调节过的source2。
Source1 and source2 options
src_current
建立于前面stages的颜色
src_texture
来自被赋值给这一层的纹理的颜色
src_diffuse
来自顶点的插入的四散光颜色(对于第一层来说,与src_current相同)。
src_specular
来自顶点的插入的镜面反射光颜色。
src_manual
在命令尾部手动指定的颜色。
例如'modulate'取用前面纹理层的颜色结果,并且把新的纹理乘到这个结果上。牢记颜色是0.0-1.0的RGB值,所以把它们乘在一起通过做乘法使之着色会得到相同范围的结果。但是要注意连续的乘法一般有加深变暗纹理的效果,因此有像modulate_x2一样的增亮操作。由于某些APIs(包括Direct3D)的限制,'texture'参数只能被用作第一个参数,而不能是第二个参数。
还应注意的是,最后一个参数只有在你决定手动给操作传递数值时,才是必要的。因此,在你使用'blend_manual'操作时,才需要你填充这些参数。
重点: OGRE试图使用多纹理硬件混合纹理层。但是,如果纹理单元数不足(GeForce2是2个,GeForce3是4个),它就不得不退而使用多路渲染,例如用不同纹理多次渲染同一物体。这不仅是低效的而且可供使用的混合操作的范围也小。因此,如果你使用这个方法,你就需要设置colour_op_multipass_fallback属性用来指定在硬件不足时使用哪种效果(默认是'modulate',如果你在此运用了华丽的混合操作,结果肯定不如预期来得好)。如果你希望避免这种情况,使用更简单的colour_op属性,虽没有太多的灵活混合操作,但是可以自动建立多路渲染,因为它只允许有直接多路等价渲染的操作。
默认: none (colour_op modulate)
colour_op_multipass_fallback
在如果使用了colour_op_ex属性且没有足够的多纹理硬件支持时,设置这个纹理层的多路后撤操作。
格式: colour_op_multipass_fallback <src_factor> <dest_factor>
示例: colour_op_mulitpass_fallback one one_minus_dest_alpha
因为你使用colour_op_ex属性创建的一些效果仅在多纹理硬件下支持,如果硬件缺乏,系统不得不后撤为多路渲染,不幸的是有许多效果并不被支持。这个属性就可以让你指定最适合你的后撤操作。
参数与scene_blend属性相同;这是因为多路渲染是有效地场景混合渲染,每一层都在采用了一种令物体透明的技术的前一层之上被渲染,它重复地在同一地方渲染就得到了多纹理效果。如果你使用了更简单的(同时也低灵活性的)colour_op属性,你不需要调用属性,因为系统为你创建了后撤操作。
alpha_op_ex
行为方式与colour_op_ex如出一辙,只不过它是决定alpha值如何在纹理层之间复合,而不是colour值。唯一的区别是colour_op_ex最后是两个颜色值,而alpha_op_ex是一个浮点值。
env_map
打开/关闭纹理坐标效果,以决定这一层能否环境映射。
格式: env_map <off|spherical|planar|cubic_reflection|cubic_normal>
环境映射依靠使用基于物体的顶点或法线与观察着眼睛之间的关系自动生成的纹理坐标使得物体看起来是有反射效果的。
spherical
球面环境映射。需要一个单独的纹理,这个纹理或者是被反射场景的凸透镜视图,或者是其它球面映射的纹理(平滑高亮的纹理是比较好的)。这一效果基于视线和物体顶点法线之间的关系,所以当有大量渐变法线时效果最好,例如:弯曲的物体。
planar
与球面环境映射相似,但是效果基于视口内的顶点位置而不是顶点法线。这一效果也因此用于平面物体(由于法线全都一样,球面env_map表现不好)或者没有法线的物体。
cubic_reflection
一种更高级的反射映射形式,使用一组6个纹理组成一个立方体的内表面,如果沿着场景的坐标轴看其中每一个纹理都是一个视图。在所有情况下工作得都极好,可是比球面映射需要更高规格的显卡。而且需要你绑定cubic_texture到这个纹理单元并且使用'combinedUVW'选项。
cubic_normal
生成三维纹理坐标,其中包括含有顶点数据的法线信息中的摄像机空间法向量。此外,这个特性的完全使用也需要设置'combinedUVW'选项的cubic_texture。
默认: env_map off
scroll
给纹理设置一个固定的滚动偏移量。
格式: scroll <x> <y>
此方法给纹理的偏移在这一层设定了一个固定的量。对于不改变纹理坐标模式的小调整很有用。但是如果你想要一个动态的滚动效果,详见scroll_anim属性。
scroll_anim
给纹理层设置一个动态的滚动。对于在纹理层上创建固定速度的滚动效果很有用(对于不同的滚动速度,详见wave_xform属性)。
格式: scroll_anim <xspeed> <yspeed>
rotate
将一个纹理旋转一个固定的角度。
这个属性只将纹理方向旋转一个固定的角度,对于固定的调整比较有用。如果你想要动态调整,详见rotate_anim。
格式: rotate <angle>
参数<angle>是逆时针旋转的角的度数。
rotate_anim
为这一层创建动态旋转效果。对于创建固定速度的旋转动作比较有用(对于变速的情况,详见wave_xform)。
格式: rotate_anim <revs_per_second>
参数<revs_per_second>是每秒逆时针旋转的次数。
scale
调整这个纹理层应用的比例系数。用于调整纹理的大小,不改变几何体。这是一个固定的比例系数,如果你想要动态的比例系数,详见wave_xform。
格式: scale <x_scale> <y_scale>
比例的有效值要大于0,比例系数如果为2,就表示在那一维上的纹理有2倍那么大。
wave_xform
建立一个基于波功能的动态改变形式。用于更高级的纹理层改变效果。你可以在一个纹理层中随意添加多个此属性的实例。
格式: wave_xform <xform_type> <wave_type> <base> <frequency> <phase> <amplitude>
示例: wave_xform scale_x sine 1.0 0.2 0.0 5.0
xform_type
scroll_x
变动x滚动值
scroll_y
变动y滚动值
rotate
变动旋转值
scale_x
变动x比例值
scale_y
变动y比例值
wave_type
sine
典型的正弦波,在最小值和最大值之间平稳地循环。
triangle
以恒定的速度增加减少的有角度的波,在极值时立即改变。
square
最大是波长的一半,最小是瞬时转换之间的停止时间。
sawtooth
经过一段时间,从最小逐渐持续增加到最大,最后立即回到最小。
inverse_sawtooth
经过一段时间,从最大逐渐持续减少到最小,最后又立即返回最大。::base
基值,如果amplitude > 0就是指最小值,amplitdue < 0就是指最大值。
frequency
波每秒重复的次数,即速度。
phase
波开始的偏移量。
amplitude
波的大小。
波的输出范围在{base, base+amplitude}。所以,以在x方向调整纹理为例,沿正弦波方向从1(标准值)调整到5,即表示每5秒一个周期(每秒0.2个波)。
transform
这个属性允许你为纹理单元指定一个4x4变换矩阵,因而取代上述的滚动、旋转、比例属性。
格式: transform m00 m01 m02 m03 m10 m11 m12 m13 m20 m21 m22 m23 m30 m31 m32 m33
上面4x4矩阵中的数值序号为m<row><col>,前面一个为行号,后面一个为列号。
在渲染通路中使用顶点程序和片断程序
参数详解
参数可以被指定为如下四种之一。无论你要定义一个参数只为这个程序特别使用,还是指定默认的程序参数,语法都是一样的。程序特殊使用的参数设置会重载默认值。
- param_indexed
- param_indexed_auto
- param_named
- param_named_auto
param_indexed
此命令设置索引参数的数值。
格式:param_indexed <index> <type> <value>
示例:param_indexed 0 float4 10.0 0 0 0
'index'简单地是表示应当被写进参数表的位置的数值,应当从你的程序定义派生。
'type'的值可以是float4,matrix4x4,float<n>,int4,int<n>。
'value'简单地是由空格或者tab制表符分割的数值列表,这些数值可以被转换成你指定过的类型。
param_indexed_auto
此命令告诉Ogre用源数值自动更新给定的参数。这就将你从编写代码的繁重劳动中解放出来,当参数总是在改变的时候,不用逐桢去更新。
格式:param_indexed_auto <index> <value_code> <extra_params>
示例:param_indexed_auto 0 worldviewproj_matrix
'value_code'是如下列表中的一个值:
world_matrix
当前世界矩阵。
inverse_world_matrix
当前世界矩阵的反转矩阵。
transpose_world_matrix
当前世界矩阵的转置矩阵
inverse_transpose_world_matrix
当前世界矩阵的反转转置矩阵。
world_matrix_array_3x4
一组世界矩阵,每一个由3x4矩阵表示(3行4列)通常用于doing hardware skinning。你应当令你的顶点程序入口数量足够多以便应付实际使用中的骨骼数量,即要有一组numBones*3个float4。
view_matrix
当前视点矩阵。
inverse_view_matrix
当前视点矩阵的反转矩阵。
transpose_view_matrix
当前视点矩阵的转置矩阵。
inverse_transpose_view_matrix
当前视点矩阵的反转转置矩阵。
projection_matrix
当前投影矩阵。
inverse_projection_matrix
当前投影矩阵的反转矩阵。
transpose_projection_matrix
当前投影矩阵的转置矩阵。
inverse_transpose_projection_matrix
当前投影矩阵的反转转置矩阵。
worldview_matrix
当前世界视点联合矩阵。
inverse_worldview_matrix
当前世界视点联合矩阵的反转矩阵。
transpose_worldview_matrix
当前世界视点联合矩阵的转置矩阵。
inverse_transpose_worldview_matrix
当前世界视点联合矩阵的反转转置矩阵。
viewproj_matrix
当前视点投影联合矩阵。
inverse_viewproj_matrix
当前视点投影联合矩阵的反转矩阵。
transpose_viewproj_matrix
当前视点投影联合矩阵的转置矩阵。
inverse_transpose_viewproj_matrix
当前视点投影联合矩阵的反转转置矩阵。
worldviewproj_matrix
当前世界视点投影联合矩阵。
inverse_worldviewproj_matrix
当前世界视点投影联合矩阵的反转矩阵。
transpose_worldviewproj_matrix
当前世界视点投影联合矩阵的转置矩阵。
inverse_transpose_worldviewproj_matrix
当前世界视点投影联合矩阵的反转转置矩阵。
render_target_flipping
如果绕过投影矩阵变换,此值用来调节改变y坐标。如果渲染目标需要纹理翻转,此值为-1,反之,为+1。
light_diffuse_colour
给定光源的漫反射颜色;这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将被置为黑。
light_specular_colour
给定光源的镜面反射颜色;这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将被置为黑。
light_attenuation
一个float4包含给定光源的4个光源衰减变量。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将全被置为0。参数的顺序是范围,常量衰减,线性衰减,二次衰减。
spotlight_params
一个float4包含3个点光源参数和一个控制值。参数的顺序是cos(内角/2),cos(外角/2),falloff,且最后的w值为1.0f。对于非点光源,此值为float4(1,0,0,1)。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的第'n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果光源比这个还少,那么细节就不像点光源了。
light_position
给定光源在世界空间中的位置。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将全被置为0。注意,这个属性可用于所有光源,甚至直射光,因为参数被设置为4D向量。点光源会是(pos.x,pos.y,pos.z,1.0f),与此同时,直射光会是(-dir.x,-dir.y,-dir.z,0.0f)。像点积之类的操作在这两种情况下都可以使用。
light_direction
给定光源在世界空间内的方向。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将全被置为0。 不建议使用——这个属性只用于直射光,而我们建议你使用light_position替代,因为它返回的是一个一般的4D向量。
light_position_object_space
给定光源在物体空间中的位置(即物体在(0,0,0)时)。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将全被置为0。注意,这个属性可用于所有光源,甚至直射光,因为参数被设置为4D向量。点光源会是(pos.x,pos.y,pos.z,1.0f),与此同时,直射光会是(-dir.x,-dir.y,-dir.z,0.0f)。像点积之类的操作在这两种情况下都可以使用。
light_direction_object_space
给定光源在物体空间内的方向(即物体在(0,0,0)时)。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将全被置为0。 不建议使用,点光源除外,对于直射光我们建议你使用light_position_object_space替代,因为它返回的是一个一般的4D向量。
light_distance_object_space
给定光源距物体中心的距离——这对于相对小的物体的每个顶点距离计算是有用的估计。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的第'n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将全被置为0。
light_position_view_space
给定光源在视点空间中的位置(即物体在(0,0,0)时)。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将全被置为0。注意,这个属性可用于所有光源,甚至直射光,因为参数被设置为4D向量。点光源会是(pos.x,pos.y,pos.z,1.0f),与此同时,直射光会是(-dir.x,-dir.y,-dir.z,0.0f)。像点积之类的操作在这两种情况下都可以使用。
light_direction_view_space
给定光源在视点空间内的方向(即物体在(0,0,0)时)。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。如果附近没有光源,那么参数将全被置为0。 不建议使用,点光源除外,对于直射光我们建议你使用light_position_object_space替代,因为它返回的是一个一般的4D向量。
light_power
给定光源的'能量'调节,HDR渲染中有用。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源——注意直射光总在列表的首位且总是存在的)。
light_diffuse_colour_array
同light_diffuse_colour,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_specular_colour_array
同light_specular_colour,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_attenuation_array
同light_attenuation,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
spotlight_params_array
同spotlight_params,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_position_array
同light_position,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_direction_array
同light_direction,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_position_object_space_array
同light_position_object_space,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_direction_object_space_array
同light_direction_object_space,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_distance_object_space_array
同light_distance_object_space,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_position_view_space_array
同light_position_view_space,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_direction_view_space_array
同light_direction_view_space,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
light_power_array
同light_power,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
ambient_light_colour
场景中当前设置的环境光颜色。
surface_ambient_colour
渲染通路的环境反射颜色属性(详见ambient部分)。这样允许你手动访问固定功能管线属性。
surface_diffuse_colour
渲染通路的漫反射颜色属性(详见diffuse部分)。这样允许你手动访问固定功能管线属性。
surface_specular_colour
渲染通路的镜面反射颜色属性(详见specular部分)。这样允许你手动访问固定功能管线属性。
surface_emissive_colour
渲染通路的自发光的量(详见emissive部分)。这样允许你手动访问固定功能管线属性。
surface_shininess
渲染通路的闪光,影响镜面高光的大小(详见specular部分)。这样允许你手动绑定固定功能管线属性。
derived_ambient_light_colour
源环境光颜色,其'r'、'g'、'b'分量由surface_ambient_colour与ambient_light_colour相乘之积分别填充,'a'分量由平面环境alpha分量填充。
derived_scene_colour
源场景色,其'r'、'g'、'b'分量由derived_ambient_light_colour与surface_emissive_colour相加之和分别填充,'a'分量由平面漫反射alpha分量填充。
derived_light_diffuse_colour
源漫反射光颜色,其'r'、'g'、'b'分量由surface_diffuse_colour与light_diffuse_colour相乘之积分别填充,'a'分量由平面漫反射alpha分量填充。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源)。
derived_light_specular_colour
源镜面反射光颜色,其'r'、'g'、'b'分量由surface_specular_colour与light_specular_colour相乘之积分别填充,'a'分量由平面镜面反射alpha分量填充。这需要'extra_params'中的一个索引,并且关联到能够影响到这个物体的'第n个'最近光源(0代表最近的光源)。
derived_light_diffuse_colour_array
同derived_light_diffuse_colour,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
derived_light_specular_colour_array
同derived_light_specular_colour,只不过这是一组参数多个光源,且'extra_params'表示要被处理的'第n个最近'光源的数量。这个参数与基于光源的渲染通路循环选项不兼容但是可以被单渲染通路光照使用。
fog_colour
场景中当前设置的雾的颜色。
fog_params
场景中当前设置的雾的参数。((exp_density,linear_start,linear_end,1.0 /(linear_end - linear_start))。
camera_position
世界空间中当前摄像机的位置。
camera_position_object_space
物体空间中当前摄像机的位置(当物体在(0,0,0)时)。
time
当前时间,可选参数(或者为1.0f,如果没有提供的话)。
time_0_x
单浮点时间值,基于作为'extra_params'给出的“周期时间”重复。
costime_0_x
time_0_x的余弦。
sintime_0_x
time_0_x的正弦。
tantime_0_x
time_0_x的正切。
time_0_x_packed
time0_x,sintime0_x,costime0_x,tantime0_x四元向量。
time_0_1
同time0_x但是取值范围限制在[0..1]。
costime_0_1
同costime0_x但是取值范围限制在[0..1]。
sintime_0_1
同sintime0_x但是取值范围限制在[0..1]。
tantime_0_1
同tantime0_x但是取值范围限制在[0..1]。
time_0_1_packed
同time0_x_packed但是所有值的取值范围限制在[0..1]。
time_0_2pi
同time0_x但是取值范围限制在[0..2*Pi]。
costime_0_2pi
同costime0_x但是取值范围限制在[0..2*Pi]。
sintime_0_2pi
同sintime0_x但是取值范围限制在[0..2*Pi]。
tantime_0_2pi
同tantime0_x但是取值范围限制在[0..2*Pi]。
time_0_2pi_packed
同time0_x_packed但是取值范围限制在[0..2*Pi]。
frame_time
当前桢时间,可选参数(或者为1.0f,如果没有提供的话)。
fps
当前每秒桢数。
viewport_width
当前视口像素宽度。
viewport_height
当前视口像素高度。
inverse_viewport_width
当前视口像素宽度倒数(1.0/当前视口像素宽度)。
inverse_viewport_height
当前视口像素高度倒数(1.0/当前视口像素高度)。
viewport_size
视口大小,四元向量viewport_width、viewport_height、inverse_viewport_width、inverse_viewport_height。
texel_offsets
提供对纹理元素到像素映射的渲染系统特定纹理坐标偏移量细节。float4(horizontalOffset,verticalOffset,horizontalOffset / viewport_width,verticalOffset / viewport_height)。
view_direction
物体空间中视点方向向量。
view_side_vector
视点本地X坐标。
view_up_vector
视点本地Y坐标。
fov
垂直弧线可视区域。
near_clip_distance
近裁剪距离,世界单位。
far_clip_distance
远裁剪距离,世界单位(对于无限视点投影来说可能是0)。
texture_viewproj_matrix
应用于被指定作为“阴影接受者”的顶点程序或者是纹理单元被标记为content_type shadow;这为当前阴影投影机提供了视点/投影矩阵的细节。可选的'extra_params'入口指定了投影机表示哪个光源(对于content_type shadow的例子,在一个渲染通路里可能出现不止一个阴影纹理),其中0是默认的并且表示该渲染通路引用的第一个光源。
scene_depth_range
提供有关从当前被用来渲染的摄像机观察到的深度范围信息。float4(minDepth,maxDepth,depthRange,1 / depthRange)。
shadow_scene_depth_range
提供有关从与选定的光源相关的阴影摄像机观察到的深度范围信息。需要一个光源索引参数。float4(minDepth,maxDepth,depthRange,1 / depthRange)。
texture_size
提供选定纹理单元的纹理大小。需要一个纹理单元索引参数。float4(width,height,depth,1)。对于2D纹理,深度设置为1,对于1D纹理,高度和深度设置为1。
inverse_texture_size
提供选定纹理单元的纹理大小的倒数。需要一个纹理单元索引参数。float4(1 / width,1 / height,1 / depth,1)。对于2D纹理,深度设置为1,对于1D纹理,高度和深度设置为1。
packed_texture_size
提供选定纹理单元的打包纹理大小。需要一个纹理单元索引参数。float4(width,height,1 / width,1 / height)。对于3D纹理,深度被忽略掉,对于1D纹理,高度被设置为1。
pass_number
设置gpu参数中活动渲染通路索引号。技术中第一个渲染通路编号为0,第二个编号为1,以此类推。这对于需要知道各是什么渲染通路的多通路渲染(如皮毛或者模糊渲染)是有用的。依靠在程序定义中的默认的程序参数列表里设置自动参数,没有必要在每个渲染通路中设置渲染通路号参数。(详见fur_example)
pass_iteration_number
用于需要知道当前渲染通路循环数是多少的GPU程序。渲染通路的第一次循环编号为0。最后一次循环号是渲染通路循环数-1。如果一个渲染通路它的循环属性被置为5,那么最后一次的循环号(第5次执行这个渲染通路)是4。(详见iteration)
animation_parametric
用于硬件顶点动画。对于变形动画来说,设置参数值(0..1)表示第一个位置关键桢(绑定到位置)与第二个位置关键桢(绑定到第一个空的纹理坐标)之间的距离,以便顶点程序可以在它们之间插值。对于姿势动画,说明一组最多有4个参数权值,它们应用于一组姿势,每组姿势最多4个,(每一个绑定到常量的x、y、z、w上),一个姿势一个。原始位置被放在一般的位置缓冲器中,且权重为1.0的姿势所在的位置的偏移量是前n个空纹理坐标;'n'由传递给includes_pose_animation的值决定。如果需要的同步姿势比4个多,那么你会需要不止一个渲染器常量存放这些参数值,在这种情况下,你需要使用这个进行多次绑定,引用不同的常量入口;第二个会包含姿势5到8的参数,第三个包含姿势9到12的参数,以此类推。
custom
这允许你映射一个自定义参数到GPU程序参数上(详见Renderable::setCustomParameter)。它需要你添上'extra_params'中索引,该索引在Renderable::setCustomParameter调用时会被用到,且这会保证无论何时使用这个Renderable,它都会有其自定义的参数映射。重要的是这个参数已经在所有Renderables上定义了,且包含这个自动映射的材质赋值给Renderables,否则过程会失败。
param_named
这同param_indexed是一样的,但是使用一个命名的参数替代索引号。这只能与包括参数名的高级程序一起使用;如果你要使用一个编译程序,那么你除了索引别无选择。注意,你也可以在高级程序中使用索引参数,但是这样它就不便移动了,因为如果你用高级程序渲染参数,索引号会发生改变。
格式: param_named <name> <type> <value>
示例:param_named shininess float4 10.0 0 0 0
这里的type是必需的,因为当材质脚本被分析时,程序并不被编译和装载,所以在这时,我们不知道参数是什么类型。程序只有被使用过后才装载和编译,为的是节约内存。
param_named_auto
功能同param_indexed_auto,只不过这个是有名字的,用于高级程序。
格式:param_named_auto <name> <value_code> <extra_params>
示例:param_named_auto worldViewProj WORLDVIEWPROJ_MATRIX
extra_params允许的数值代码和意思详见param_indexed_auto。
粒子
可用的粒子系统属性
- quota
- material
- particle_width
- particle_height
- cull_each
- billboard_type
- billboard_origin
- billboard_rotation_type
- common_direction
- common_up_vector
- renderer
- sorted
- local_space
- point_rendering
- accurate_facing
- iteration_interval
- nonvisible_update_timeout
粒子系统属性
这部分描述了可以在任何一个使用脚本的粒子系统上设置的属性。所有属性都有默认值,所有设置在脚本中都是可选的。
quota
设置这个系统在某一时刻所允许包含的最多粒子数。当达到这个限制时,粒子发射器将不允许再发射粒子,直到某些粒子被消灭(例如,它们的time_to_live存续时间用尽)。值得注意的是,你几乎是肯定要改变这个设置的,因为默认值太短了(粒子池只能增加,而不能减少)。
格式: quota <max_particles>
示例: quota 10000
默认: 10
material
设置这个系统中的全体粒子将要使用的材质的名字。此系统中的全部粒子使用相同的材质,尽管每一个粒子可以通过使用它自己的颜色属性为材质附加颜色。
格式: material <material_name>
示例: material Examples/Flare
默认: none (空材质)
particle_width
在世界坐标中,设置粒子的宽度。注意,当billboard_type()被设置为'point'或者'perpendicular_self'时,这个属性是绝对值;而当billboard_type是'oriented_common','oriented_self'或者'perpendicular_common'时,它是依方向向量的长度而定的。
格式: particle_width <width>
示例: particle_width 20
默认: 100
particle_height
在世界坐标中,设置粒子的高度。注意,当billboard_type()被设置为'point'或者'perpendicular_self'时,这个属性是绝对值;而当billboard_type是'oriented_common','oriented_self'或者'perpendicular_common'时,它是依方向向量的长度而定的。
格式: particle_height <height>
示例: particle_height 20
默认: 100
cull_each
所有的粒子系统都被包括在一个包含这个系统所有粒子的边界盒内。这对一般的局部的有限的粒子系统,如大部分粒子是同时可见的或是同时不可见的,是足够的。但是,对于那些在更大面积上扩散的粒子(例如,一个雨水系统),实际上你也许想要单独的处理每一个粒子以便节约时间,因为很可能只有一小部分的粒子是可见的。你可以通过设置cull_each的参数为真,做到这一点。
格式: cull_each <true|false>
示例: cull_each true
默认: false
renderer
粒子系统并不渲染它本身,它们通过ParticleRenderer类完成这一点。那些类被带着一个管理器注册,为的是给粒子系统提供一个特殊的外观。OGRE默认配置了一个基于公告板的渲染器(billboard-based renderer),但是更多的可以通过插件增加。粒子渲染器要用一个唯一的名字注册,你可以利用这个名字决定使用哪个渲染器。默认的是'billboard'。
粒子渲染器可以有属性,并且可以通过在根粒子系统中设定属性进行传递。
格式: renderer <renderer_name>
默认: billboard
sorted
默认情况下,粒子是不排序的。若设定这个属性为'真',粒子将会根据摄影机的位置关系被排序,最远的优先。通过花费一小点儿排序的代价,就可以制作出特定的渲染效果。
格式: sorted <true|false>
默认: false
local_space
默认情况下,粒子是被发射到世界空间的,例如,如果你改变了粒子系统所在的节点,它不会影响到粒子本身(只是粒子发射器)。这就意味着给出了一般期望的行为,即建立了真实世界的粒子离开发射它们的物体后独立运动的模型。但是,要建立一些效果,你可能想让粒子保持附加在粒子发射器所在的局部空间内并直接跟随它们。这个选项就可以让你实现这一点。
格式: local_space <true|false>
默认: false
billboard_type
这实际上是'公告板'粒子渲染器(默认)的一个属性,同时也是通过在系统声明中直接声明的方法给粒子渲染器传递属性的一个示例。使用默认渲染器的粒子被用公告板进行渲染,即由2个旋转到面向指定方向的三角形组成的矩形构成的平面。但是,定向一个公告板有不止一种方法。传统方法是公告板直接面对摄像机:这也是默认的方法。但是,这种安排只是对于表现像光晕一样的模糊的球状物看上去还算可以。对于更多的诸如激光射线这样的线性效果,事实上你想要粒子有其自己的方向。
格式: billboard_type <point|oriented_common|oriented_self|perpendicular_common|perpendicular_self>
示例: billboard_type oriented_self
默认: point
此参数有如下选项:
point
默认排列,它估计球状粒子和公告板总是完全面对摄像机。
oriented_common
粒子面向一个共同的固定的方向向量(参看common_direction),即它们的局部Y轴。公告板只围绕这个轴旋转,给粒子一些方向感。利于暴风雨,流星等粒子按一个方向移动的效果——较oriented_self(见下面)略快。
oriented_self
粒子面向它们自己的方向向量,即它们的局部Y轴。隨着粒子改变方向,公告板也重定向它自己面向这个方向。利于激光射线,焰火,以及其它的按其自己的方向行进的粒子。
perpendicular_common
粒子垂直于一个共同的固定的方向向量(参看common_direction),即它们的局部Z轴和它们的局部Y轴共同确定的平面,有共同的方向和向上的向量(参看common_up_vector)。公告板从未旋转至面向摄像机,你可能使用双面材质以便确保粒子不会被背面包含。利于光环,圆环等粒子将垂直于地面的效果——较perpendicular_self(见下面)略快。
perpendicular_self
粒子垂直于它们自己的方向向量,即它们的Z轴和Y轴共同确定的平面,有它们自己的方向向量和共同的向上向量(参见common_up_vector)。公告板从未旋转至面向摄像机,你可能使用双面材质以便确保粒子不会被背面包含。利于圆环堆等粒子将垂直于它们的行进方向的效果。
billboard_origin
指定所有公告板粒子的起始点,控制公告板粒子的出现位置。
格式: billboard_origin <top_left|top_center|top_right|center_left|center|center_right|bottom_left|bottom_center|bottom_right>
示例: billboard_origin top_right
默认: center
此参数有如下选项:
top_left
公告板起始点在左上角。
top_center
公告板起始点在顶边中央。
top_right
公告板起始点在右上角。
center_left
公告板起始点在左边中央。
center
公告板起始点在中央。
center_right
公告板起始点在右边中央。
bottom_left
公告板起始点在左下角。
bottom_center
公告板起始点在底边中央。
bottom_right
公告板起始点在右下角。
billboard_rotation_type
默认情况下,公告板粒子会根据粒子旋转去旋转纹理坐标。但是旋转纹理坐标有一些缺点,例如,纹理的四角会在旋转后丢失,而当使用折叠地址模式或者子纹理采样时,公告板的四角会被不想要的纹理区域填充。这个设置允许你指定其它的旋转类型。
格式: billboard_rotation_type <vertex|texcoord>
示例: billboard_rotation_type vertex
默认: texcoord
此参数有如下选项:
vertex
公告板粒子将依据粒子旋转规则绕它们面向的方向旋转它们的顶点。旋转顶点满足纹理角完全匹配公告板角,因此有上面提及的优点,但是需要花费较多的时间以生成顶点。
texcoord
公告板粒子将依据粒子旋转规则旋转纹理坐标。旋转纹理坐标比旋转顶点更快,但是有上面提及的一些缺点。
common_direction
如果billboard_type被设置为oriented_common或者perpendicular_common才需要,这个向量是用于定位系统中所有粒子的共用向量。
格式: common_direction <x> <y> <z>
示例: common_direction 0 -1 0
默认: 0 0 1
common_up_vector
如果billboard_type被设置为perpendicular_self或者perpendicular_common才需要,这个向量是用于定位系统中所有粒子的共用向上向量。
格式: common_up_vector <x> <y> <z>
示例: common_up_vector 0 1 0
默认: 0 1 0
point_rendering
事实上,这是‘公告板’粒子渲染器(默认设置)的一个属性,设置与否关系到公告板将使用点渲染而不是手动生成渲染画面。
默认情况下,公告板区域依靠内存中的一块纹理矩形生成的几何体渲染的,要考虑到大小和方向设置,以及将它装载入显卡的问题。可选择的方式是使用硬件指针渲染,即意味着每个公告板只有一个位置需要被传送而不是4个,并且硬件依据渲染状态排序如何渲染。
虽然使用点渲染较手动生成渲染区域更快,但是多了许多限制。限制如下:
仅支持'point'定向类型
每个粒子的大小和外观由材质通路控制(point_size, point_size_attenuation,point_sprites)
不支持每个粒子大小(源自上文)
不支持每个粒子旋转,且这只能通过材质定义中的纹理单元旋转控制
仅支持'center'起始点
一些驱动程序对于支持的点的大小有上限限制——甚至相同卡的不同API之间也可能区别!不要依靠点的大小让屏幕上的东西变得很大,因为它们可能会受限于某些卡。大小的上限可能在64到256像素之间。
如果你使用这个选项,你将几乎是肯定要打开材质通路中的point attenuation和point sprites。
accurate_facing
事实上,这是‘公告板’粒子渲染器(默认设置)的一个属性,且设置与否关系到公告板区域将使用一个有些慢但更精确的计算使公告板面向摄像机。默认使用摄像机方向,这样更快,但同时意味着,当你旋转摄像机时,公告板不会保持相同的方向。'accurate_facing true'选项基于从每一个公告板到摄像机的向量进行计算,即意味着即使摄像机旋转方向也是一致的。
格式: accurate_facing on|off
默认: accurate_facing off 0
iteration_interval
通常粒子系统是基于帧率被更新的;但是随着更极端的帧率范围,这可以给出不同的结果,特别是低帧率。你可以使用这个选项设定升级频率为固定的间隔,在低帧率时,粒子更新会按固定的间隔重复,直到帧率恢复正常。0值意为默认帧时间循环。
格式: iteration_interval <secs>
示例: iteration_interval 0.01
默认: iteration_interval 0
nonvisible_update_timeout
当粒子系统在其已经无法可见需要停止更新时设置。默认情况下,可见粒子系统一直更新,即使不在视口内。这意味着当它们进入视口时可以保证一致性。但是,更新粒子系统所花费的代价可能是很昂贵的。
这个选项让你在粒子系统上设置一个'timeout'时限,以便如果它这么长时间不可见,即停止更新,直到它下次可见。值0表示关闭timeout,总是更新。
格式: nonvisible_update_timeout <secs>
示例: nonvisible_update_timeout 10
默认: nonvisible_update_timeout 0
粒子发射器
粒子发射器按类型划分为几类,例如:Point发射器从单独一点发射,而Box发射器则是从一块儿区域随机发射。新的发射器可以通过插件加入到Ogre中去。向系统中增加一个发射器需要将发射器嵌入到其它块中,以关键字“emitter”后跟发射器类型名(大小写敏感)开头。Ogre现在支持'Point','Box','Cylinder','Ellipsoid','HollowEllipsoid'以及'Ring'发射器。
粒子发射器通用属性
- angle
- colour
- colour_range_start
- colour_range_end
- direction
- emission_rate
- position
- velocity
- velocity_min
- velocity_max
- time_to_live
- time_to_live_min
- time_to_live_max
- duration
- duration_min
- duration_max
- repeat_delay
- repeat_delay_min
- repeat_delay_max
粒子发射器属性
这部分描述的是所有小辫子发射器的通用属性。特殊的发射器类型可能也支持它们自己的额外的属性。
angle
设置发射的粒子可以偏离发射方向的最大角(按角度计算,参看 direction)。此值设置为10允许粒子在任一方向上最多偏离发射方向10度。值180意味着可以朝任意方向发射,而0意味着总是精确地沿发射器方向发射。
格式: angle <degrees>
示例: angle 30
默认: 0
colour
为所有发射的粒子设置一个静态颜色。也可参看colour_range_start和colour_range_end属性,设置一组颜色。颜色参数的格式是"r g b a",每个分量的取值范围是从0到1之间,alpha值是可选项(如果未指定,则假定alpha为1)。
格式: colour <r g b> [<a>]
示例: colour 1 0 0 1
默认: 1 1 1 1
colour_range_start和colour_range_end
除了这两个属性必须一起制定外,其它的都和'colour'属性一样,并且制定了被发射出去的粒子的可用颜色范围。实际的颜色将会在这两个值之间随机选择。
格式: 同 colour
示例(随机生成红蓝之间的颜色): colour_range_start 1 0 0 colour_range_end 0 0 1
默认: 都是 1 1 1 1
direction
设置发射器的方向。这与粒子系统所在的SceneNode有关,意思就是随着其它可移动物体改变节点方向,发射器也会随着移动。
格式: direction <x> <y> <z>
示例: direction 0 1 0
默认: 1 0 0
emission_rate
设置每秒要发射多少粒子。在连续发射过程中,个别发射器不是必须发射这些的——这是一个相对参数,发射器可能选择每半秒就发射完所有的粒子,这主要取决于发射器。此属性也会受到粒子系统的'quota'设置的限制。
格式: emission_rate <particles_per_second>
示例: emission_rate 50
默认: 10
position
设置发射器相对于粒子系统所在的场景节点所处的位置。
格式: position <x> <y> <z>
示例: position 10 0 40
默认: 0 0 0
velocity
给所有粒子设置发射时的速率。也可参看velocity_min和velocity_max两个属性,它们允许你设置一个速率范围,而不是一个固定不变的值。
格式: velocity <world_units_per_second>
示例: velocity 100
默认: 1
velocity_min & velocity_max
这两个属性除了是设置一个速率范围外,其它的与'velocity'一样。而且每一个粒子都是以在这个范围内的随机速率被发射出去的。
格式: 同 velocity
示例: velocity_min 50 velocity_max 100
默认: 都是 1
time_to_live
设置每个粒子在被销毁之前存活的秒数。粒子影响器是可以改变这个数值的,但是这个值是发射时才传给粒子的。参看time_to_live_min和time_to_live_max属性,这连个可以让你设置一个生命时间范围,而不是一个固定的数值。
格式: time_to_live <seconds>
示例: time_to_live 10
默认: 5
time_to_live_min & time_to_live_max
这两个属性除了是设置一个生命时间范围以外,其它的与time_to_live一样,并且每个粒子在发射时得到这一范围内的一个随机的数值,作为其存在时间。
格式: 同 time_to_live
示例: time_to_live_min 2 time_to_live_max 5
默认: 都是 5
duration
设置发射器处于活动状态的秒数。发射器可以被再次打开,查看repeat_delay。数值0意味着无限时。参看duration_min和duration_max属性,这两个属性可以让你设置一个时间范围,而不是一个固定值。
格式: duration <seconds>
示例: duration 2.5
默认: 0
duration_min & duration_max
除了这两个属性是设置一个可变的时间范围外,其它的与duration一样。
格式: 同 duration
示例: duration_min 2 duration_max 5
默认: 都是 0
repeat_delay
设置重新开始发射需要等待的秒数。参看repeat_delay_min和repeat_delay_max属性,这两个属性允许你设置一个repeat_delays时间范围,而不是设置一个固定的值。
格式: repeat_delay <seconds>
示例: repeat_delay 2.5
默认: 0
repeat_delay_min & repeat_delay_max
这两个属性除了是设置重新开始需要等待的时间范围外,其它的与repeat_delay一样,并且每次发射器被启动,它都会在这个范围内得到一个随机数值,作为重新开始发射需要的等待时间。
格式: 同 repeat_delay
示例: repeat_delay 2 repeat_delay 5
默认: 都是 0
标准粒子发射器
Ogre预先定义了几种粒子发射器。新的粒子发射器可以通过创建插件增加:可以查看Plugin_ParticleFX项目,它是教你如何创建新的粒子发射器的好例子(那里实现了这些发射器)。
- Point Emitter
- Box Emitter
- Cylinder Emitter
- Ellipsoid Emitter
- Hollow Ellipsoid Emitter
- Ring Emitter
Point Emitter
这个发射器从一个定点,即它所在的位置,发射粒子。除了标准发射器属性,这个发射器没有其它属性。
要创建一个点发射器,需要在你的粒子系统脚本中包含类似下面的部分:
emmiter Point
{
// Settings go here
}
请注意,发生器的名字('Point')是大小写敏感的。
Box Emitter
这个发射器从一个3维盒子里的随机位置发射粒子。它有额外的属性:
width
设置盒子的宽度(这是盒子沿着它自己的X轴的长度,依赖于形成盒子Z坐标的'direction'属性)。
格式:width <units>
示例:width 250
默认:100
height
设置盒子的高度(这是盒子沿着它自己的Y轴的长度,依赖于形成盒子Z坐标的'direction'属性)。
格式:height <units>
示例:height 250
默认:100
depth
设置盒子的深度(这是盒子沿着它自己的Z轴的长度,与'direction'属性相同)
格式:depth <units>
示例:depth 250
默认:100
要创建一个盒发射器,需要在你的粒子系统脚本中包含类似下面的部分:
emitter Box
{
// Settings go here
}
Cylinder Emitter
这个发射器从一个沿Z轴摆放的圆柱体区域内的随机方向发射粒子。这个发射器有着与Box Emitter完全一致的参数,所以在此不多赘言——宽度和高度决定圆柱体沿坐标轴的形状(如果宽度和高度不同,那么得到的结果是椭圆柱体),深度决定了圆柱体的长度。
Ellipsoid Emitter
这个发射器是从一个椭圆体形状的区域里发射粒子的,例如一个球体或者压扁了的球体区域。参数再一次与Box Emitter相似,除了维度描述为每个坐标轴上的范围最广的点。
Hollow Ellipsoid Emitter
这个发射器很像Ellipsoid Emitter,除了椭圆体中心有一个空洞区域不发射粒子。因此,它有3个额外的参数定义这个空洞区域:
inner_width
不发射任何粒子的内部区域的宽度。
inner_height
不发射任何粒子的内部区域的高度。
inner_depth
不发射任何粒子的内部区域的深度。
Ring Emitter
这个发射器从一个环状区域发射粒子。除了只有2个维度外,有点像Hollow Ellipsoid Emitter。
inner_width
不发射任何粒子的内部区域的宽度。
inner_height
不发射任何粒子的内部区域的高度。
还可参看:3.3 粒子脚本,3.3.2 粒子发射器
Emitting Emitters
在粒子逾期时产生新的发射器是可能的,例如产生火焰类型的效果。这是通过以下指令控制的:
emit_emitter_quota
这个参数是一个系统级参数,就是告诉系统任意一次可能使用多少个发射器。也就是允许进行空间分配处理。
name
这个参数是一个发射器级参数,即给发射器确定一个名字。这样,当粒子消亡时,其它粒子发生器可以引用这个名字作为生成的新发射器。
emit_emitter
这个参数是一个发射器级参数,如果指定,则意为当这个发射器发射的粒子消亡时,生成一个新的发射器。
粒子影响器
粒子影响器可以在粒子存续期间对粒子进行修改。它们按“类型”分为:LinearForce影响器,对所有粒子应用一个力;ColourFader影响器改变飞行中的粒子的颜色。新的影响器可以通过创建插件的形式增加到Ogre中来。你可以通过将影响器嵌套在另一个别的程序块里的办法,向系统中增加一个影响器,以关键字affector开头,后跟影响器的类型名(注意:大小写敏感)。Ogre当前支持LinearForce和ColourFader两种影响器。
粒子影响器事实上没有统一的属性;属性都是每种影响器特有的。
标准粒子影响器
Ogre预定义了几种粒子影响器。新的影响器还可以通过插件的形式增加:如何通过插件创建新的影响器,您可以参看Plugin_ParticleFX项目作为一个例子。(那里有这些粒子影响器的实现方式)
- Linear Force Affector
- ColourFader Affector
- ColourFader2 Affector
- Scaler Affector
- Rotator Affector
- ColourInterpolator Affector
- ColourImage Affector
- DeflectorPlane Affector
- DirectionRandomiser Affector
Linear Force Affector
这个影响器对所有粒子施加一个力,改变粒子的运动轨迹。可以用于重力,风力,或者其它线性力。其额外属性有:
force_vector
为应用到每一个粒子的那个力设置向量。这个向量的模决定了力的大小。
格式:force_vector <x> <y> <z>
示例:force_vector 50 0 -50
默认:0 -100 0(一个重力效果)
force_application
设置这个力向量作用于粒子动量的方法。
格式:force_application <add|average>
示例:force_application average
默认:add
可选参数有:
average
最终动量是这个力与粒子当前运动的平均值。这样也就使得其本身虽然是稳定的,但是在粒子改变方向时的速度是非线性的。
add
最终动量是粒子的当前运动与这个力之和。这是传统的力的叠加,但是潜在地可能导致无限速率。
要创建一个线性力影响器,需要你的粒子系统脚本中包含一段如下代码:
affector LinearForce
{
// 设置写在这里
}
请注意:影响器类型的名字(LinearForce)是大小写敏感的。
ColourFader Affector
此影响器修改飞行中的粒子的颜色。额外的属性有:
red
设置每秒时间内粒子颜色中的红色分量的调整量。
格式:red <delta_value>
示例:red -0.1
默认:0
green
设置每秒时间内粒子颜色中的绿色分量的调整量。
格式:green <delta_value>
示例:green -0.1
默认:0
blue
设置每秒时间内粒子颜色中的蓝色分量的调整量。
格式:blue <delta_value>
示例:blue -0.1
默认:0
alpha
设置每秒时间内粒子颜色中的alpha分量的调整量。
格式:alpha <delta_value>
示例:alpha -0.1
默认:0
要创建一个颜色减弱影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector ColourFader
{
// 设置写在这里
}
ColourFader2 Affector
此影响器类似ColourFader Affector,只不过这个影响器有两个颜色改变状态。在粒子存续期内,指定还剩一段时间时,激活第二个颜色改变状态。
red1
设置在第一个状态期间每秒时间内粒子颜色的红色分量的调整量。
格式:red <delta_value>
示例:red -0.1
默认:0
green1
设置在第一个状态期间每秒时间内粒子颜色的绿色分量的调整量。
格式:green <delta_value>
示例:green -0.1
默认:0
blue1
设置在第一个状态期间每秒时间内粒子颜色的蓝色分量的调整量。
格式:blue <delta_value>
示例:blue -0.1
默认:0
alpha1
设置在第一个状态期间每秒时间内粒子颜色的alpha分量的调整量。
格式:alpha <delta_value>
示例:alpha -0.1
默认:0
red2
设置在第二个状态期间每秒时间内粒子颜色的红色分量的调整量。
格式:red <delta_value>
示例:red -0.1
默认:0
green2
设置在第二个状态期间每秒时间内粒子颜色的绿色分量的调整量。
格式:green <delta_value>
示例:green -0.1
默认:0
blue2
设置在第二个状态期间每秒时间内粒子颜色的蓝色分量的调整量。
格式:blue <delta_value>
示例:blue -0.1
默认:0
alpha2
设置在第二个状态期间每秒时间内粒子颜色的alpha分量的调整量。
格式:alpha <delta_value>
示例:alpha -0.1
默认:0
state_change
当一个粒子还有这么多存续时间时,它将转入状态二。
格式:state_change <seconds>
示例:state_change 2
默认:1
要创建一个颜色减弱2影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector ColourFader2
{
// 设置写在这里
}
Scaler Affector
此影响器调节飞行中的粒子的大小。额外的属性有:
rate
每秒时间内在x和y方向上对粒子的调节量。
要创建一个伸缩影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector Scaler
{
// 设置写在这里
}
Rotator Affector
此影响器依靠旋转粒子的贴图纹理来旋转飞行中的粒子。额外的属性有:
rotation_speed_range_start
赋值给发射出去的粒子的旋转速度范围的初始值。
格式:rotation_speed_range_start <degrees_per_second>
示例:rotation_speed_range_start 90
默认:0
rotation_speed_range_end
赋值给发射出去的粒子的旋转速度范围的结束值。
格式:rotation_speed_range_end <degrees_per_second>
示例:rotation_speed_range_end 180
默认:0
rotation_range_start
赋值给发射出去的粒子的旋转角度的初始值。
格式:rotation_range_start <degrees>
示例:rotation_range_start 0
默认:0
rotation_range_end
赋值给发射出去的粒子的旋转角度的结束值。
格式:rotation_range_end <degrees>
示例:rotation_range_end 360
默认:0
要创建一个旋转影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector Rotator
{
// 设置写在这里
}
ColourInterpolator Affector
类似于ColourFader和ColourFader2,此影响器也是修改飞行中的粒子的颜色。只不过这个影响器有一组不定个数的已经定义好的状态。它在粒子存续期内在几种状态间插值变换粒子的颜色。额外的属性有:
time0
状态0的时间点。
格式:time0 <0到1,基于粒子的存续时间>
示例:time0 0
默认:1
colour0
状态0时的颜色。
格式:colour0 <r g b> [<a>]
示例:colour0 1 0 0 1
默认:0.5 0.5 0.5 0.0
time1
状态1的时间点。
格式:time1 <0到1,基于粒子的存续时间>
示例:time1 0.5
默认:1
colour1
状态1时的颜色。
格式:colour1 <r g b> [<a>]
示例:colour1 0 1 0 1
默认:0.5 0.5 0.5 0.0
time2
状态2的时间点。
格式:time2 <0到1,基于粒子的存续时间>
示例:time2 1
默认:1
colour2
状态2时的颜色。
格式:colour2 <r g b> [<a>]
示例:colour2 0 0 1 1
默认:0.5 0.5 0.5 0.0
[...]
状态数是可变的。最多6个。即time5和colour5是最后的参数。要想创建一个颜色插值影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector ColourInterpolator
{
// 设置写在这里
}
ColourImage Affector
这是另一个改变飞行粒子的颜色的影响器,但替代编程定义颜色的是,从一个指定的图像文件中取得颜色。在粒子的存续时间内,颜色的取值范围是从图像的左侧开始向右移动,因此,只使用了水平方向的图像。额外属性有:
image
赋值给发射出去的粒子的旋转速度范围的初始值。
格式:image <image_name>
示例:image rainbow.png
默认:无
要创建一个图像颜色影响器,需要在你的粒子系统脚本中包含如下一段代码:
affector ColourImage
{
// 设置写在这里
}
DeflectorPlane Affector
此影响器定义一个平面,这个平面反弹碰到它的粒子。额外的属性有:
plane_point
反弹平面上一点。与plane_normal一起使用。
默认:plane_point 0 0 0
plane_normal
反弹平面的法线向量。与plane_point一起使用。
默认:plane_normal 0 1 0
bounce
当一个粒子被反弹时的弹力大小。0表示没有反弹,1表示100%反弹。
默认:bounce 1.0
DirectionRandomiser Affector
此影响器随机选定粒子运动的方向。额外属性有:
randomness
每一轴向上随机性的大小。
示例:randomness 5
默认:randomness 1
scope
每一轮受影响的粒子的百分比。
示例:scope 0.5
默认:scope 1.0
keep_velocity
决定是否不改变粒子的速率。
示例:keep_velocity true //不改变粒子速率
默认:keep_velocity false //即改变粒子速率
字体定义脚本
Ogre使用基于纹理的字体渲染TextAreaOverlayElement。你也可以使用Font对象去实现你想要的目标。字体的最终格式是一个由字体生成的Material对象,以及一组"glyph"(字符轮廓)纹理坐标信息。
在OGRE中,你可以用两种方法得到字体:
1、利用一个艺术包或者字体生成工具自己设计一个字体纹理
2、让OGRE生成一个基于truetype字体的字体纹理
前一种方法给你最大的自由度,以及最棒的性能表现效果(从启动时间上看),但是,如果你想快速使用一个字体,而不愿自己生成纹理的话,后一种方法是更为方便的。建议使用后一种方法进行原形设计,而到了最后要完成最终一步时,在转成前一种方法。
所有字体定义被保存在.fontdef文件中,这些文件在开始启动时,由系统进行分析。每一个.fontdef文件可以包含多个字体定义。在.fontdef文件中的一个入口的基本格式是:
<font_name>
{
type <image | truetype>
source <image file | truetype font file>
...
... custom attributes depending on type
}
使用一个现有字体纹理
如果有一个或多个艺术家与你一起工作,不要怀疑,他们可以为你制造出一个非常漂亮的字体纹理。OGRE支持全部色彩的字体纹理,或者保持黑白单色/灰阶以及使用TextArea的色彩特性。字体纹理总有一个alpha通道,最好是一个8位的alpha通道,就像TGA和PNG文件支持的那样,因为它可以得到更为漂亮的边界。要使用一个现有的纹理,你需要进行如下设置:
type image
这只是告诉OGRE,你想要一个预先画好的字体。
source <filename>
这是那个你想要调用的图片文件的名字。它会从标准TextureManager资源位置被装入,而且是任意OGRE支持的类型,尽管不推荐JPEG格式,因为缺少alpha而且是有损压缩。推荐PNG格式,它具备无损压缩和一个8位alpha通道的双重优点。
glyph <character> <u1> <v1> <u2> <v2>
这个是为指定的字提供纹理坐标。你必须为纹理中所有的每一个字,重复这一步骤。前两个数字是左上角的x和y坐标,后两个是右下角的x和y坐标。注意,你一定要使用等高的字,因为等比例字体,宽度可以有所不同。
一条给Windows用户的提示:建议使用(http://www.lmnopc.com/bitmapfontbuilder/),一个自由工具,可以用来生成纹理并且为你导出字符宽度,你可以在Tools文件夹下找到一个工具,将这个二进制的输出文件转换成'glyph'线条。
生成一个字体纹理
你也可以利用truetype字体生成一个字体纹理。不建议在成品中过多使用这个,因为每个字体渲染纹理都要花费几秒钟时间,增大载入时间。然而,不管怎样,它是一个非常好的快速得到你选择的字体的输出文本的方法。
下面是你需要提供的一些属性:
type truetype
告诉OGRE从一个字体里生成纹理。
source <ttf file>
要载入的ttf文件名。它将在普通资源位置和任何增加到FontManager中的资源位置搜索。
size <size_in_points>
按标准点计算要生成字体的大小。注意,这只影响字符在字体纹理中是多大,不影响在屏幕上显示的大小。你应当根据你期望渲染多大的字体来裁减这个的大小,因为生成一个庞大的纹理将导致字符在缩得很小的时候变得模糊(由于mipmapping),而且相反地,生成一个小字体会导致渲染大号文本时产生块状字。
resolution <dpi>
按每英寸中的点数计算的清晰度,与上面的point size关联使用以决定最终大小。一般是72 / 96 dpi。
antialias_colour <true|false>
这是一个可选项,默认是“false”。生成器会默认使用纹理的alpha分量对字体抗锯齿,如果你使用alpha混合渲染你的文本会看起来很好。无论你想在自己的代码中使用哪个基于混合的颜色,如:add或modulate,你都要设置这个选项为“true”,因此颜色值也是抗锯齿的。如果你设置这个为真,并且使用alpha混合,你会发现你的字体的边也是抗锯齿的,快速得到一个看上去很“细”的字体,因为不仅是alpha混合了边界,颜色也变淡了。如果有所怀疑,让这个选项保持默认“false”,也没关系。
code_points nn-nn [nn-nn] ..
这一指令允许你指定哪一个unicode编码点应当作为字符轮廓被生成为字体纹理。如果你不指定,编码点33-166将会默认被生成,覆盖基本的Latin 1 字符轮廓。如果你使用了这个标记,你应当指定一个包含编码点范围的独立空间列表,格式为“开始位置-结束位置”。数值必须是十进制数。
你也可以在运行时使用FontManager创建新字体。
示例:
使用了一个在第二次渲染通路中包含10次迭代操作用以生成皮毛的简单的皮毛渲染材质脚本
// 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
}
}
fragment_program GLSLDemo/FurFS glsl
{
source fur.frag
default_params
{
param_named Ka float 0.2
param_named Kd float 0.5
param_named Ks float 0.0
param_named furTU int 0
}
}
material Fur
{
technique GLSL
{
pass base_coat
{
ambient 0.7 0.7 0.7
diffuse 0.5 0.8 0.5
specular 1.0 1.0 1.0 1.5
vertex_program_ref GLSLDemo/FurVS
{
}
fragment_program_ref GLSLDemo/FurFS
{
}
texture_unit
{
texture Fur.tga
tex_coord_set 0
filtering trilinear
}
}
pass grow_fur
{
ambient 0.7 0.7 0.7
diffuse 0.8 1.0 0.8
specular 1.0 1.0 1.0 64
depth_write off
scene_blend src_alpha one
iteration 10
vertex_program_ref GLSLDemo/FurVS
{
}
fragment_program_ref GLSLDemo/FurFS
{
}
texture_unit
{
texture Fur.tga
tex_coord_set 0
filtering trilinear
}
}
}
}
注意:使用GPU程序自动参数pass_number和pass_iteration_number告诉顶点或片断程序渲染通路数量和迭代数。