OGRE在渲染通路中使用顶点程序和片断程序

292 篇文章 14 订阅

3.1.9 在渲染通路中使用顶点程序和片断程序

在材质脚本的pass段中,你可以引用.program脚本中定义的顶点程序和/或片断程序(详见3.1.4 顶点程序与片断程序的声明)。这些程序与使用他们的渲染通路分开定义,是因为他们很可能在多个分开的材质间被重复使用,更可能跨越多个不同的.material材质脚本,所以这种方法可以让你只定义一次而多次使用。

如前文所述命名程序一样,你也可以向它提供参数。下面是一个简单的例子:

vertex_program_ref myVertexProgram
{
	param_indexed_auto 0 worldviewproj_matrix
	param_indexed      4 float4  10.0 0 0 0
}

在这个例子中,我们给渲染通路绑定了一个叫做'myVertexProgram'的顶点程序(它可能被定义在其他地方),并且给它2个参数,一个是'auto'参数,意为我们不必提供数值,只要一个识别码就够了(在这个例子中它是由Ogre自动更新的世界/视点/投影矩阵)。第二个参数是人工指定的参数,一个浮点四元组。其索引于后文描述。

连接到顶点程序和片断程序的语法是一致的,唯一的区别是用'fragment_program_ref'代替了'vertex_program_ref'。

多数情况下顶点程序和片断程序在渲染通路中是彼此联合的,但这不是一成不变的。你可以有一个可以被多个不同片断程序使用的顶点程序。出现的另一种情况是你可以将固定功能管线和可编程管线(shaders)混合在一起使用。你可以使用非可编程顶点固定功能管线,然后在渲染通路中提供一个fragment_program_ref,即渲染通路中会没有vertex_program_ref段。渲染通路中引用的片断程序必须符合以相关API定义的要求,以便从顶点固定管线的输出中读取内容。你也可能只有顶点程序,其输出内容给片断固定功能管线。

渲染API(DirectX和OpenGL)之间的从固定功能管线中读取或者向固定功能管线中写入的要求是相似的,但是每种渲染器(顶点或者片断)实际如何做还要依赖于渲染语言。对于HLSL(DirectX API)和相关的asm,请参考MSDN,链接是http://msdn.microsoft.com/library/。对于GLSL(OpenGL),请参考GLSL规范1.1的7.6节,可在http://developer.3dlabs.com/documents/index.htm获得。GLSL提供的多种变量的编译版本允许你的程序读写各种不同的固定功能管线。对于Cg,请参考CgUsersManual.pdf中的语言概述部分,连同Cg工具包一并可在http://developer.nvidia.com/object/cg_toolkit.html获得。对于HLSL和Cg它的各种绑定允许你的渲染程序读写各种固定功能管线。


参数详解

参数可以被指定为如下四种之一。无论你要定义一个参数只为这个程序特别使用,还是指定默认的程序参数,语法都是一样的。程序特殊使用的参数设置会重载默认值。

  • 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'简单地是表示应当被写进参数表的位置的数值,应当从你的程序定义派生。索引是与常量在显卡上的存储方式相关的,即四元组方式。例如,如果你在索引0位置定义了一个float4参数,那么下一个索引就会是1。如果你在索引0位置定义了一个matrix4x4,那么下一个可用索引就会是4,因为一个4x4矩阵占据4个索引位置。
'type'的值可以是float4,matrix4x4,float<n>,int4,int<n>。注意'int'参数只可用于某些更为高级的程序语法中,细节请检查D3D或者GL顶点/片断程序有关文档。一般最有用的是float4和matrix4x4。注意如果你使用了一个不是4的倍数的类型,那么剩余的值会被填充为0(因为GPU总是使用4个浮点数一组表示常量,尽管只用了其中的一个)。
'value'简单地是由空格或者tab制表符分割的数值列表,这些数值可以被转换成你指定过的类型。
param_indexed_auto
此命令告诉Ogre用源数值自动更新给定的参数。这就将你从编写代码的繁重劳动中解放出来,当参数总是在改变的时候,不用逐桢去更新。
格式:param_indexed_auto <index> <value_code> <extra_params>
示例:param_indexed_auto 0 worldviewproj_matrix
'index'意思与param_indexed中所述相同;注意,这次你不必指定参数的大小,因为引擎已经知道了。在示例中,使用了世界/视点/投影矩阵暗含地就是说这是matrix4x4。
'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

阴影和顶点程序

当使用阴影时(详见7. 阴影),顶点程序的使用可以增加一些额外的复杂度,因为Ogre只在使用固定功能管线时才能自动处理所有事情。如果你使用顶点程序,并且也正要使用阴影,你可能需要做出一些调整。

如果你使用模版阴影,那么任何执行顶点变形操作的顶点程序可能会有问题,因为模版阴影在CPU上计算,并不访问被修改过的顶点。如果顶点程序要完成标准骨骼动画,这是可以的(参看上述部分),因为Ogre知道如何用软件方法复制效果,但是任何其他顶点变形都不能被复制,且你将或者不得不接受阴影无法反映改变的结果或者干脆关闭那个物体的阴影。

如果你使用纹理阴影,那么顶点变形是可以接受的;但是,当渲染物体到阴影纹理中时(阴影施放者通路),阴影不得不被渲染为固体颜色(参看环境光颜色)。因此你必须提供一个备选顶点程序,Ogre提供给你一种方法,指定一个程序渲染阴影施放者时使用。基本上,你可以使用与原始顶点程序完全相同的语法连接备选顶点程序:

shadow_caster_vertex_program_ref myShadowCasterVertexProgram
{
	param_indexed_auto 0 worldviewproj_matrix
	param_indexed_auto 4 ambient_light_colour
}

当渲染阴影施放者时,Ogre会自动地使用备选程序。你可以向程序上绑定相同或不同的参数——最重要的事情是绑定ambiend_light_colour,因为这决定着经过调节后的阴影的颜色。如果你不提供备选程序,Ogre会回退到固定功能材质上,但是任何你在顶点程序中所作出的顶点改变在这里都不会反映出来。

此外,当用阴影纹理渲染阴影接收者时,Ogre需要投影阴影纹理。在固定功能模式下这是自动完成的,但是如果接收者使用了顶点程序,它们需要有一个阴影接收者程序完成通常的顶点改变,但是也生成了投影纹理坐标。连接到渲染通路里的额外的程序如下所示:

shadow_receiver_vertex_program_ref myShadowReceiverVertexProgram
{
	param_indexed_auto 0 worldviewproj_matrix
	param_indexed_auto 4 texture_viewproj_matrix
}

就写这个备选程序来说,有一个'texture_viewproj_matrix'绑定的自动参数,给程序提供纹理投影参数。顶点程序应该完成它的一般顶点处理,而使用这个矩阵生成纹理坐标且将他们放置在纹理坐标集0和1中,因为一些阴影技术使用2个纹理单元。这种顶点程序的顶点输出颜色必须总是白的,以便不影响最终渲染完成的阴影颜色。

当使用附加的纹理阴影时,阴影渲染通路实际上是光照渲染,所以如果你运行了任何片断程序进行光照渲染,你也许要拉入一个自定义的片断程序。shadow_receiver_fragment_program_ref的使用方法如下:

shadow_receiver_fragment_program_ref myShadowReceiverFragmentProgram
{
	param_named_auto lightDiffuse light_diffuse_colour 0 
}

你应当放过来自自定义顶点程序的投影阴影坐标。至于纹理,纹理单元0将会总是阴影纹理。任何其他渲染通路里绑定的纹理也会被处理,但是会被向后移动一个单位以便为阴影纹理留出空间。因此你的阴影接收者片断程序很可能与你的一般材质的光照渲染通路是一样的,除了你额外在索引0处插入了一个纹理采样器,使用它调整结果(调节漫反射和镜面反射分量)。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值