一個渲染通路就是幾何問題裏的一次渲染;一個帶有一整套渲染屬性的渲染API的一次調用。一個技術能夠包含有1到16個渲染通路,固然,渲染通路用得越多,技術在渲染的時候開銷越大。php
爲了清楚識別使用的究竟是哪一個渲染通路,渲染通路經常被起個名字,固然,也能夠不起,名字並非必需的。腳本中沒有名字的渲染通路將會以渲染通路索引號爲名。例如:在一個技術裏,第一個渲染通路索引號是index 0,因此,若是腳本中沒有對它命名,那麼它的名字就是「0」。一個技術中的渲染通路的名字必須是惟一的,不然,最後一個渲染通路的結果就會是全部相同名字的渲染通路的效果的融合。若是發生這種事,一個警告消息就會發到Ogre.log中。並且,命名渲染通路還有助於複製材質和修改已經存在的渲染通路:(詳見3.1.11 材質拷貝部分)編程
渲染通路有一套全局屬性(以下所述),0或多個紋理單元入口,:(詳見3.1.3 紋理單元部分),以及可選的對於頂點程序或片段程序的引用(詳見3.1.9 在渲染通路中使用頂點程序和片段程序部分)。數組
下面介紹在.material腳本中「渲染通路」部分可以使用的一些屬性:less
屬性詳解ide
ambient函數
設置此渲染通路中周圍環境的反射係數。當asm,CG,HLSL(High Level Shader Language高級渲染語言)使用時,該屬性無效。與GLSL()一塊兒使用時,渲染器能夠讀OpenGL材質狀態。spa
格式: ambient (<red> <green> <blue> [<alpha>]| vertexcolour) 數值的取值範圍在0.0到1.0之間。 示例: ambient 0.0 0.8 0.0
渲染通路的基本顏色取決於各頂點紅色,綠色和藍色光的反射量。此屬性決定了反射多少環境光(無目標的全局光)。也能夠如在網格中定義的同樣,經過使用關鍵字vertexcolour而不是使用顏色值,使環境反射係數跟蹤頂點顏色。默認值是全白的,意思就是物體整個徹底被照亮。若是你想要看見散射和鏡面反射的效果,就要減小這個屬性的相關數值,或者改變顏色的混合,使物體有一個不是白色的基礎色。若是使用了'lighting off'屬性將動態光照關閉了或者任何紋理層有'colour_op replace'屬性,那麼「ambient」這個屬性無效。.net
默認: ambient 1.0 1.0 1.0 1.0
diffuseblog
設置此渲染通路中漫反射係數。當asm,CG,HLSL(High Level Shader Language,高級渲染語言)使用時,該屬性無效。與GLSL(OpenGL's Shader Language,OpenGL的渲染語言)一塊兒使用時,渲染器能夠讀OpenGL材質狀態。索引
格式: diffuse (<red> <green> <blue> [<alpha>]| vertexcolour) 數值的取值範圍在0.0到1.0之間。 示例: diffuse 1.0 0.5 0.5
渲染通路的基本顏色取決於各頂點紅色,綠色和藍色光的反射量。此屬性決定了反射多少四散光(來自場景中光照類實例的光)。也能夠像在網格里同樣定義,用vertexcolour關鍵字而不是用顏色值,令四散反射係數追蹤頂點顏色。默認值是全白,意思就是物體反射所能接收到的全部白光。若是使用了'lighting off'屬性將動態光照被關閉了或者任何紋理層有'colour_op replace'屬性,那麼「ambient」這個屬性無效。
Default: diffuse 1.0 1.0 1.0 1.0
specular
設置此渲染通路中鏡面反射顏色的反射係數。當asm,CG,HLSL(High Level Shader Language,高級渲染語言)使用時,該屬性無效。與GLSL(OpenGL's Shader Language,OpenGL的渲染語言)一塊兒使用時,渲染器能夠讀OpenGL材質狀態。
格式: specular (<red> <green> <blue> [<alpha>]| vertexcolour) <shininess> 數值的取值範圍在0.0到1.0之間。閃耀值(shininess)能夠是任意比0大的值。 示例: specular 1.0 1.0 1.0 12.5
渲染通路的基本顏色取決於各頂點紅色,綠色和藍色光的反射量。此屬性決定了反射多少鏡面光(來自場景中光照類實例的高光)。也能夠像在網格里同樣定義,用vertexcolour關鍵字而不是用顏色值,令鏡面反射係數追蹤頂點顏色。默認值沒有鏡面反光。鏡面反射的這種高光取決於顏色參數,閃耀值的設置大小。閃耀值設置得越高,高光就越耀眼。閃耀值在0.0到1.0之間時,使用要當心,由於這會引發高光顏色會被應用到有使用這種高光屬性材質的整個平面。這樣的話,當對該平面的視角發生改變的時候,會發生特別噁心的閃爍。閃耀值在1到128之間時,在DirectX和OpenGL渲染器上都表現良好。若是使用了'lighting off'屬性將動態光照被關閉了或者任何紋理層有'colour_op replace'屬性,那麼「ambient」這個屬性無效。
默認: specular 0.0 0.0 0.0 0.0 0.0
emissive
設置一個物體自發光的量。當asm,CG,HLSL(High Level Shader Language,高級渲染語言)使用時,該屬性無效。與GLSL(OpenGL's Shader Language,OpenGL的渲染語言)一塊兒使用時,渲染器能夠讀OpenGL材質狀態。
格式: emissive (<red> <green> <blue> [<alpha>]| vertexcolour) 數值的取值範圍在0.0到1.0之間。 示例: emissive 1.0 0.0 0.0
若是一個物體是自發光的,那麼它就不須要外界的光去照亮它,不管是環境光仍是其它的光,就好像有本身的環境光同樣。然而,其實這個屬性並不像名字所暗示的那樣,這個物體對場景中的其餘物體來講並非一個光源(若是你想讓它成爲一個光源,你須要建立一個光源而後將光源放在這個物體的中心上)。也能夠像在網格里同樣定義,用vertexcolour關鍵字而不是用顏色值,令這樣放射出來的顏色追蹤頂點顏色。若是使用了'lighting off'屬性將動態光照被關閉了或者任何紋理層有'colour_op replace'屬性,那麼「ambient」這個屬性無效。
默認: emissive 0.0 0.0 0.0 0.0
scene_blend
設置此渲染通路與場景中現有的內容混合的方式。紋理單元入口所見的那個紋理混合操做被看做是紋理層之間的混合,而這個混合是將此渲染通路的輸出結果與當前渲染目標的內容相結合。因此,這種混合就容許物體透明和其餘特殊效果。有兩種形式可供選擇使用:一是使用預約義混合形式;二是使用自定義的辦法,源因數和目標因數都有你本身DIY。
格式1: scene_blend <add|modulate|alpha_blend|colour_blend> 示例: scene_blend add
這是一個比較簡單的形式,經常使用的混合形式由一個參數枚舉出來,可用的混合形式參數以下:
格式2: scene_blend <src_factor> <dest_factor> 示例: scene_blend one one_minus_dest_alpha
這種格式容許你經過設置源和目標因數,從而徹底控制混合操做。最終被寫入渲染目標的顏色結果是(texture * sourceFactor) + (scene_pixel * destFactor)。兩個參數的可選值以下:
默認: scene_blend one zero (這句意爲不透明的)
depth_check
設置此渲染通路的深度緩衝檢測的狀態是打開狀態仍是關閉狀態。
格式: depth_check <on|off>
若是深度緩衝檢測處於打開狀態,則不管什麼時候一個像素要想寫入畫面緩衝,深度緩衝檢測就檢查這個像素是否比在那一點的其它像素都要靠前。若是不是,那麼這個像素就不寫入。若是深度緩衝檢測關閉了,則不管以前渲染的結果,一概寫入這個像素。更高級的配置還可參看depth_func
默認: depth_check on
depth_write
設置此渲染通路的深度緩衝寫入的狀態是打開狀態仍是關閉狀態。
格式: depth_write <on|off>
若是深度緩衝寫入處於打開狀態,不管什麼時候一個像素想要寫入畫面緩衝,深度緩衝都會更新那個像素的深度值,所以,若是未來的像素在這個像素的後面,就會影響未來的渲染操做。若是這一屬性被關閉了,那麼像素就不會更新深度緩衝。通常來講,這一屬性是打開的,可是,當你渲染靜態背景或者位於場景後部的一系列透明物體以便它們可以彼此正確地重疊時,也能夠關閉。
默認: depth_write on
depth_func
當深度檢測打開時,設置用於比較深度值的函數。
格式: depth_func <func>
若是深度檢測處於打開狀態(參看depth_check),那麼將要寫入的像素的深度值與緩衝區中現有內容的深度值會發生比較。通常來講,這種比較是小於等於,例如:將要寫入的像素比現有內容距離咱們更近(或相等)。可能的函數以下:
默認: 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>
當動態光照打開時,效果就在每一個頂點處生成顏色值。這些值是否全平面插入(如何插入)就依賴於這個屬性設置。
默認: shading gouraud
polygon_mode
設置多邊形應該如何被柵格化。例如:它們應該是被填充後畫出來,仍是做爲點(只有頂點)、線(只有外邊框)畫出來。
格式: polygon_mode <solid|wireframe|points>
默認: polygon_mode solid
fog_override
這個屬性告訴渲染通路是否撤銷場景的霧設置,而強制執行此渲染通路它本身的設置。當場景中其餘的物體被霧遮擋,而你不想讓霧影響某些物體時很是有用。固然反之亦然。注意這隻影響固定功能霧——原來的場景霧參數仍然被送入渲染器,使用fog_params參數綁定(這就容許你關閉固定功能霧,轉而在渲染器中計算;若是你想關閉陰影霧,你能夠經過陰影參數關閉它。)
格式: fog_override <override?> [<type> <colour> <density> <start> <end>] 默認: fog_override false
若是你指定第一個參數爲真,並給出了其他參數,就代表你要告訴渲染通路若是在使用這些霧設置和使用場景設置之間選擇的話,優先選擇使用這些霧設置。若是你指定第一個參數爲真,但沒給出其他參數,就代表你要告訴渲染通路不使用任何霧設置,不管場景如何設置。如下是參數的解釋:
示例: 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,經常使用於渲染固定功能材質。當你要使用可編程管線(詳見3.1.9 在渲染通路中使用頂點程序和片段程序部分),這個限制依賴於你要運行的程序。若是你使用'iteration once_per_light'(詳見下面 iteration),則它的有效性僅限於你想使用的渲染通路的數量。可是,不管你使用哪一種方法,都要應用max_lights限制。
默認: 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]]
示例:
依照默認設置,渲染通路只執行一次。可是,若是你使用可編程管線,或者你但願超出支持的光源數量限制,你或許想要使用once_per_light選項。在這種狀況下,只有光源0被使用,每次使用不一樣的光源做爲光源0,渲染通路執行屢次。顯然,這會使渲染通路的代價很高,可是,考慮1到n個光源的每像素光照效果,這多是惟一達到這種效果的辦法。
使用數字代替「once」表示創建渲染狀態後渲染通路的一次以上的迭代執行。渲染狀態在初始化創建後就再也不改變,因此對於使用須要迭代屢次相同渲染狀態的可編程渲染,重複的繪圖調用是很是快速和理想的。例如,皮毛、動做模糊、特殊濾鏡等渲染。
若是你使用了once_per_light,你也應該在此渲染通路以前的技術裏增長一個環境渲染通路,不然,當這個物體附近沒有光源時,它就不會被渲染;即便你的場景裏沒有環境光時,這也是很重要的,由於本來你仍然是想要顯示物體的輪廓的。
此屬性的光源類型參數僅在你使用once_per_light、per_light或者per_n_light時應用,且還限制運行單一類型光源('點光源'、'方向光源'或'斑光源')的渲染通路。以下面的例子所示,這個渲染通路將會每一個電光源執行一次。若是你能估計到將要處理的光源類型,這會是有用的,由於當你要寫一個頂點/片段程序時,它會很容易。至少點光源和方向光源能夠用一種方法處理。
默認: iteration once
示例:使用了一個在第二次渲染通路中包含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告訴頂點或片段程序渲染通路數量和迭代數。
point_size
此設置容許你在渲染一個點列或者一個point sprites列時改變點的大小。這個命令的插值依賴於point_size_attenuation選項——若是是關閉的(默認狀況),點的大小是屏幕像素的大小;若是是打開的,表現爲標準化屏幕座標(屏幕高爲1.0)。
注意:某些設備有其所支持的點的大小的上限——相同的顯卡不一樣的應用程序接口可能不一樣!不要相信點的大小,由於那些屏幕上很大的點可能僅限於某些顯卡。最高像素的範圍從64像素到256像素。
格式: point_size <size> 默認: point_size 1.0
point_sprites
這個設置指定此渲染通路的硬件point sprites渲染是否打開。若是打開了,意味着一個點列被做爲一個四元組列渲染而不是做爲一列點渲染。若是你使用了公告板集而且只須要使用基於公告板的大小相同的點,使用這個選項是很是有用的。你也能夠在任何其它點列渲染中使用這個屬性。
格式: point_sprites <on|off> 默認: point_sprites off
point_size_attenuation
定義點的大小是否根據視覺空間距離增長而衰減,以及以何種方式衰減。當你使用point sprites時,這個選項特別有用,由於它定義了當遠離鏡頭時,應如何減少尺寸。你也能夠關閉這個選項,使point sprites成爲一個常數的屏幕尺寸(像點同樣),或者打開這個選項,使之隨距離而改變。
若是你打開了這個選項,你只要提供最後3個參數。衰減方程爲點的大小乘以1 / (constant + linear * dist + quadratic * d^2);所以關閉這個選項就至關於(constant = 1, linear = 0, quadratic = 0)且標準透視縮減是(constant = 0, linear = 1, quadratic = 0)。後者假設你指定打開這個選項但未給出後3個參數。
注意衰減的結果應限於點尺寸的最小和最大值之間(詳見下面介紹)。
格式: point_size_attenuation <on|off> [constant linear quadratic] 默認: point_size_attenuation off
point_size_min
設置點衰減(詳見上面point_size_attenuation)的最小值。細節詳見上面point_size。
格式: point_size_min <size> 默認: point_size_min 0
point_size_max
設置點衰減(詳見上面point_size_attenuation)的最大值。細節詳見上面point_size。 0值意味着將最大值設置爲當前顯卡所支持的最大值。
格式: point_size_max <size> 默認: point_size_max 0