1. 程式人生 > >ogre中的材質指令碼

ogre中的材質指令碼

資源組管理器初始化完畢時,裝載材質指令碼,OGRE會自動的在組相關的資源位置查詢".materal”副檔名的檔案,並對這些指令碼進行語法解 析。手動解析可以通過MaterialSerializer::parseScript()。但是注意的是:解析指令碼時並沒有對指令碼中定義的全部紋理等資 源進行載入,所以,在我們訪問一個材質的時候,一定要確保它已經裝載,或者,我們手動將此材質Load()一次再進行訪問。另外,材質名必須唯一,且不可 有”:”號。

格式:以{},空格,//,作為識別符號。

// 後跟註釋,不支援多行註釋。

{} 之間代表為一個解析單元。

    每一個material XXX 代表是一個材質單元。其中,每一個technique代表一個材質渲染手法,pass是每個渲染通路模式,  texture_unit則是一個紋理單元。

一個材質指令碼允許有多個渲染手法技術,一個渲染手法技術中允許有多個渲染通路模式,一個渲染通道允許有多個紋理單元。

渲染技術Techinique:

一個“渲染技術”就是一個單獨的渲染物體的方法。多個技術的存在原因是為適用不同的顯示卡以及根據遠近關係對一個物體進行不同的渲染。

技術的排列需要一定順序,一般來說,最常用最的技術放在指令碼最前面,

格式為:  Techinique 技術名

不命名的技術預設會以其序列號進行命名,注意,技術名不可重複。

方案技術scheme:

因為我們對不同的顯示卡標準或根據某中不同的需求,設計出不同的技術,每種技術所適用的環境方案需要我們指出。

格式為:  scheme 方案名

預設的方案是default,若我們某一個技術適用於開啟hdr,Shader3.0的方案,我們只需對該技術設定方案為 scheme hdr_open_shader_3_0 即可。

細節層次索引 lod_index:

每一個技術都必須對應一個細節層次索引。一般來說,預設的都是0,即最近最優秀的渲染技術,當我們需要對遠處細節進行渲染時,則設定這個值吧。

格式為:  lod_index 數值層級

雖說lod的數值層級是從0-65535,一般設定2-4層就差不多了吧。因為技術有一定的排列順序,所以,我們一般是將index大的技術放在後面。

細節層次距離 lod_distances:

這裡指定使用不同的細節層次的距離值,注意該屬性必須在所有的技術塊外面進行宣告指定。

如例子中所標識:lod_distance 200 就代表,在0-200這個距離內,我們使用細節層次為0的技術,在200以上的則使用細節層次為1的技術

Lod_distance 200 700.5 則表示在0-200時我們使用細節0,200-700.5這段距離使用細節1的材質技術,700.5以上使用細節2的材質技術。200和700.5間使用空格間隔。

所以技術的排列順序通常為這樣

Material MyTestMaterial

{

lod_distances 200

       Technique Lod_0_Hdr_Open_Shader_3_0

       {

Lod_index 0

              Pass 0

{

       Texture_unit

       {

              //…..

}

       Texture_unit

       {

              //…..

}

              }

Pass 1

{

       Texture unit

{

       // ….

}

}

}

       Technique Lod_0_Hdr_Close_Shader_1_0

       {

Lod_index 0

              Pass

{

       Texture_unit

       {

              //…..

}

       Texture_unit

       {

              //…..

}

              }

}

       Technique Lod_1_Hdr_Open_Shader_3_0

       {

Lod_index 1

              Pass

{

       Texture_unit

       {

              //…..

}

       Texture_unit

       {

              //…..

}

              }

}

       Technique Lod_1_Hdr_Close_Shader_1_0

       {

Lod_index 1

              Pass

{

       Texture_unit

       {

              //…..

}

       Texture_unit

       {

              //…..

}

              }

}

}

Pass渲染通路:

再次強調一個概念:一個材質指令碼,為了適應不同的顯示卡和LOD細節層次技術,我們允許有多個技術,為了加速充分的使用GPU,每個技術中同時又支援多通道的渲染,每個渲染通道內,同時又允許有多個紋理單元。首先這個改變必須明確理解才能順利的進行材質指令碼的設計。

我們在“渲染通路”這層可以設定以下屬性:

ambient       材質的環境光反射係數

格式是 ambient red green blue alpha

    每個值要求為0.0-1.0之間,例如ambient 0.2 0.2 1.0 1.0代表每個頂點對環境光的反射係數。注意:若關閉了動態光照和紋理層的光照色彩混合的話,該項就不起作用了,此時完全是紋理顏色。預設值為全白。

diffuse       材質的漫反射係數

格式是 diffuse red green blue alpha 其他同上。

specular      材質的鏡面反射係數

格式是 specular red green blue alpha Shininess ,最後多了一個引數,是閃耀值(高光係數),該值處於1-128之間。注意:若該值較大則會令人感到耀眼的反射。

emissive      材質自發光係數

格式是 emissive red green blue alpha

scene_blend

設定渲染通道和現有的渲染層內容混合方式,有預設的四種方式:

格式為scene_blend add或scene_blend modulate/alpha_blend/colour_blend

Add 是將渲染出的顏色和亮度一起疊加到渲染場景中,相當於“scene_blend one one”

Modulate 是將渲染輸出的顏色疊加到渲染場景中,相當於”scene_blend dest_colour zero”

alpha_blend 是將渲染輸出的亮度疊加到渲染場景中,相當於”scene_blend src_colour one_minus_src_colour”

colour_blend 是將渲染輸出的alpha值進行遮罩緩和。相當於”scene_blend src_alpha one_minus_src_alpha”

當然,我們也可以不使用預設的方式,進行自定義源和目標的混合因數

格式為 scene_blend src_factor dest_factor

     這樣最終渲染出的顏色就是 (渲染通道的結果 * src_factor) + (渲染場景的顏色 * dest_factor),其中src_factor dest_factor兩個引數可選以下值:

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 或 depth_check off

depth_write

是否開啟深度緩衝寫入。 格式為 depth_write on 或 depth_write off

預設的時候深度緩衝是開啟的,個別時候我們需要渲染一系列透明物體的關係時候,則將其關閉。

depth_func

寫入象素前的深度比較函式。 格式為 depth_func compareFun

其中compareFun可以取下面值之一。

always_fail

永遠不向渲染目標寫入畫素

always_pass

總是將畫素寫入渲染目標

less

如果將要寫入的畫素的深度小於現在緩衝區內容的深度,則寫入

less_equal

如果將要寫入的畫素的深度小於等於現在緩衝區內容的深度,則寫入

equal

如果將要寫入的畫素的深度等於現在緩衝區內容的深度,則寫入

not_equal

如果將要寫入的畫素的深度不等於現在緩衝區內容的深度,則寫入

greater_equal

如果將要寫入的畫素的深度大於等於現在緩衝區內容的深度,則寫入

greater

如果將要寫入的畫素的深度大於現在緩衝區內容的深度,則寫入

預設值是 depth_func less_equal ,注意:當我們關閉深入緩衝檢測的話,該函式無效。

depth_bias

設定此渲染通路的深度值的偏向。可用於使共面的多邊形中的一個位於其它之上,例如印製花紋圖案。

alpha_rejection 對渲染管道的材質紋理進行alpha資訊剪裁。 格式為 alpha_rejection

compareFun value

其中value取值範圍是0-255,例如 alpha_rejection less_equal 122 則代表拋棄渲染管道中alpha值大於等於122的象素。附註:考慮到硬體相容,Value最好是0-128之間。

cull_hardware

硬體剔除方式。 格式為 cull_hardware HCutFun

HCutFun列舉下列三種方式:clockwise / anticlockwise/ none

clockwise將逆時針的三角型都cut掉(即CUT鏡頭反面)

anticlockwise將順時針的三角型都cut掉(即CUT鏡頭正面)

none 不做任何剪下。

預設為 clockwise

cull_software

軟體剪裁方式, 格式為 cull_software SCutFun

SCutFun 列舉以下三種格式:back / front / none

實際上,這個和硬體裁減是類似的,不過,對於一些動態的物件建議不要開啟該項,消耗很大。預設是 back 剪裁。

lighting

是否開啟動態光照, 格式為 lighting on / off

注意:使用了頂點程式,此屬性無效。動態光照一旦關閉,環境光反射,鏡面反射光,放射光,陰影等屬性均無效。預設為on

shading

Ogre著色方式 , 格式為 shading flat/ gouraud/ phong

Flat不進行插值,每個平面的陰影都由該平面的第一個頂點色決定。

Gouraud 對平面上每個頂點顏色進行線形插入計算。

Phong 全平面使用頂點法線向量。效果好,代價高,部份硬體無法支援此屬性。

預設為 : gouraud

polygon_mode

柵格化方式。   格式為 polygon_mode solid/ wireframe/ points

面,線,點的柵格化。預設當然是面solid模式。

fog_override

是否開啟霧化。 fog_override true/false

當fog_override true的時候就需要順序跟出以下引數

霧的type: none 無霧。 相當於fog_override false

           Linear 線性霧。 從 start到end之間有霧

           Exp 幾何方次性霧。 受濃度 density 影響

           Exp2 幾何二次方增加。 受濃度 density 影響

霧的顏色 color: RGB三種顏色值。0.0-1.0之間

霧的濃度 density:設定幾何方次性霧的濃度。對線形霧不影響,但也必須寫上進行佔位。

霧的起始位置 start :對非線性霧無效,但必須寫上佔位。

霧的結束位置 end : 對非線性霧無效,但必須寫上佔位。

例如:fog_override true exp 1 1 1 0.002 100 10000 開啟幾何次方霧。顏色為1,1,1白色,濃度為0.002(若是線性則代表,離鏡頭100至10000之間的距離有霧)

colour_write

是否關閉渲染通路的顏色寫入功能。 colour_write on/off

該功能一旦關閉,則代表渲染通路不可輸入任何的顏色渲染。僅在初期初始化深度緩衝區時個別時間有用。預設為開on

max_lights

此渲染通路最大光源數量。一般使用預設為8 格式為 max_lights 8

iteration

是否對渲染通路進行迭代渲染。 預設為僅渲染一次,格式為Iteration once

Iteration 5 代表本渲染通路將被重複執行5次渲染。

Iteration once per_light point 則代表本渲染通道將每個光源點進行一次渲染。

Iteration 5 per_light point則代表本渲染通道將每個光源點進行5次渲染。

· point_size

· point_sprites

· point_size_attenuation

· point_size_min

· point_size_max

OGRE的材質指令碼 (二)

Texture_unit 紋理單元

我們在PASS渲染通道處已經進行了一次整體的渲染環境設定,然而,在每個紋理單元,我們還可以對單獨的紋理進行渲染屬性設定。

texture_alias

設定一個紋理的別名,類似於技術的別名。格式: texture_alias 紋理別名

預設該別名就是紋理單元的名字。

texture

本層要使用的靜態紋理圖象名字。可以簡單的格式為

Texture xxx.jpg (注意:紋理檔名禁止有空格)也可對其屬性進行詳細的設定。如下

Texture xxx.jpg 2d 8 none PF_A8R8G8B8

2d是裝載的紋理型別,型別實際上包括1d(1象素的紋理點),2d(紋理面,預設也是該項),3d(3D帶深度的紋理),cubic(有些類似天空盒式的貼在立方體內側6個2D紋理,但是僅可貼同一種紋理,不如使用cubic_texture)

8 是MipMap的層級,預設是unlinited,代表可以無限的對紋理進行mipmap,我們這裡設定為8代表生成8個層級遞減的MIPMAP。注意:若多個材質指令碼中使用同一個紋理,切記他們的mipmap數量必須一致。

None 這項是我們指定的單獨的透明通道做為alpha進行裝載,預設的為 none,表示以紅色作為alpha通道。

PF_A8R8G8B8紋理格式,常用的有PF_R5G6B5,PF_A4R4G4B4,PF_A8R8G8B8,PF_X8R8G8B8等。

anim_texture

與上面的texture對應,是用於活動的紋理層,即動態圖象。注意,這裡不是使用預設的儲存好的.gif動畫,而是匯入多楨圖,設定好楨之間的間隔時間。這裡我們有兩種方法:

一種是按照Ogre內部規定對動畫的紋理命名:xxx_0.jpg xxx_1.jpg xxx_2.jpg這樣以0為首,加下劃線遞增命名,這樣我們呼叫時會比較方便,這樣便可以了

Anim_texture xxx.jpg 3 2.2 即代表xxx_0.jpg這樣命名的紋理有3張,間隔時間為2.2秒。

另一種是非標準的紋理命名,則需要我們如下寫:

Anim_texture 1.jpg flame2.jpg xxx_3.png hit4.tga 2.2 直接以空格間隔標示逐個標示出每一楨的紋理即可。

注意:2.2是每楨間的間隔時間,若設定為0,則不會自動進行楨畫面切換,需要我們程式碼中手工控制了。

cubic_texture

建立一個立方體紋理。這個一般用於反射對映和天空盒中。其格式和動態紋理一樣,有兩種方式,一種是Ogre制定的規範,我們呼叫就更加簡單,如下

Cubic_texture skybox.jpg combinedUVW

我們僅提供一個基礎的紋理名,此時OGRE會預設的去查詢skybox_fr.jpg, skybox_bk.jpg, skybox_up.jpg, skybox_dn.jpg, skybox_lf.jpg, skybox_rt.jpg這些紋理。

第二中方式則是按照“前後上下左右”的順序將這些紋理羅列出來。

最後一個引數需要設定為combinedUVW或separateUV, combinedUVW會將紋理組合到一個立方體紋理對映中,帶有UVW三維紋理座標,適合做反射對映。而separateUV僅僅儲存2D的UV座標,適用於天空盒。

tex_coord_set

因為一個Mesh網格允許有多套紋理座標集,我們在這裡設定使用哪套座標集。格式為 tex_coord_set 3 (使用編號為3的座標集)

預設為 tex_coord_set 0

tex_address_mode

紋理定址模式。即當紋理UV值大於1.0時的紋理處理方法。引數有以下幾種列舉選擇:

Wrap 會將所有UV值大於1.0的值設定為0.0,紋理會被重複連續繪製。

Clamp 會將所有UV值大於1.0的值設定為1.0,這樣的話就相當於在模糊邊界。

Mirror 會當UV值等於1.0的時候,將紋理反轉後連續繪製。

Border 超過1.0的UV都會被設定為邊界色,就是描邊效果。此項可設定tex_border_colour屬性。

tex_border_colour

和上一屬性對應,設定紋理邊界色,僅對Border紋理定址有效。

格式 : tex_border_colour RGBA(0.0 – 1.0取值)

filtering

紋理過濾形式:我們可以使用其預定的四種基本型別,包括

None 不進行紋理過濾

Bilinear 進行雙線性紋理過濾。就是對mipmap進行挑選過濾,但是不對mipmap各個級別之間進行過濾

Trilinear 進行三線性紋理過濾。將最近的兩個mipmap一起進行過濾。

Anisotropic 各向異性紋理過濾。使用該項,則你必須設定其max_anisotropy值。

預設為bilinear。

max_anisotropy

最大各相異性程度偏差值。根據硬體不同一般限制為8或者16

預設為 max_anisotropy 1

mipmap_bias

我們在Pass通道時已經允許設定mipmap紋理Lod運用層級以及適用的距離。在紋理單元這層級我們可以重新對其進行調整。格式為

Mipmap_bias -3 後面的整數代表在所有的範圍內強制使用增大或縮小的mip級別。-3代表,在所有範圍內強制使用更大3級的mip紋理。

預設是不進行層級偏移:mipmap_bias 0

colour_op

簡單的紋理混合方式,我們可以使用預定義的4項列舉:

Replace 不處理,用當前的紋理直接替換掉後面的所有顏色。覆蓋式。

Add 將當前紋理色和後面的渲染顏色進行加法處理。

Modulate 將當前紋理色和後面的渲染顏色進行乘法處理。

Alpha_blend 將當前紋理和後面的紋理進行alpha顏色混合。

預設為 colour_op modulate 當前紋理色和後面顏色進行乘法混合。

colour_op_ex

高階的紋理混合模式,可以詳細的指定混合係數和效果,但個人不推薦使用。效率消耗較大,且受不用的硬體限制性大,使用預設支援的4種混合模式可以了。

colour_op_multipass_fallback

當上面一個colour_op_ex設定要求過高,硬體無法支援多紋理混合時,則不得不呼叫該項進行多通路混合渲染。若我們使用的是colour_op預設定的4種紋理混合模式,則無需在此處理,OGRE底層已經做了完善的處理。

alpha_op_ex

同colour_op_ex,不推薦使用。

相關推薦

OGRE材質指令碼 (三)

       Container Panel (MyNewOverlays/FirstPanel)      // Container對應的是element,這兩者都是對Panel的修飾詞,當該面上有新的子面時就使用Container,若是一個完全無子面的面, 則可使用 element進行修飾。Panel是註

OGRE材質指令碼 (四)

       Ogre中的圖象資料的資訊都被封裝在一個個的PixelBox物件之中,我們需要注意的是PixelBox本身是儲存在GPU中,但是真正的紋理都是保 存在記憶體中,並非讀到GPU中。GPU中的 PixelBox儲存著記憶體中象素的格式位置內容資訊的描述,但是PixelBox並沒有記憶體管理的功能,它

OGRE材質指令碼 (二)

Texture_unit 紋理單元我們在PASS渲染通道處已經進行了一次整體的渲染環境設定,然而,在每個紋理單元,我們還可以對單獨的紋理進行渲染屬性設定。 texture_alias 設定一個紋理的別名,類似於技術的別名。格式: texture_alias 紋理別名預設該別名

ogre材質指令碼

資源組管理器初始化完畢時,裝載材質指令碼,OGRE會自動的在組相關的資源位置查詢".materal”副檔名的檔案,並對這些指令碼進行語法解 析。手動解析可以通過MaterialSerializer::parseScript()。但是注意的是:解析指令碼時並沒有對指令碼

細說 ogre 材質指令碼

資源組管理器初始化完畢時,裝載材質指令碼,OGRE會自動的在組相關的資源位置查詢".materal”副檔名的檔案,並對這些指令碼進行語法解析。手動解析可以通過MaterialSerializer::parseScript()。但是注意的是:解析指令碼時並沒有對指令碼中定義的全部紋理等資源進行載入,所以,在我們

Ogre材質指令碼定義引數變數

1、頂點著色程式中傳遞引數: GpuProgramParametersSharedPtr params = entity->getSubEntity(0)->getMaterial()-> getTechnique(0)->getPass(0)-&g

OGRE 材質指令碼解析的分析

material 08-Default { technique { pass { ambient 0.588235 0.588235 0.588235 1 diffuse 0.588235 0.588235 0.588235 1 specula

Ogre材質(Material)

     在Ogre中,Overlay、Entity、Particle等都會用到材質。 Ogre中的材質指令碼只不過是指定程式該如何去使用紋理(Texture),具體關於材質指令碼的編寫及引數可參考ogre中文手冊。下面來說說一般的材質應用:     材質做為一種資源,它也有

ogre材質指令碼屬性

頂層Material屬性 屬性名                   值的格式                  描述 lod_distances               <d1> [<d2> ... <dn>]        LOD

JSP指令碼、表示式、宣告和註釋

宣告   在 JSP 頁面中 , 可以宣告一個或者多個合法的變數和方法 , 聲明後的變數和方法可以在本 JSP 頁面的任何位置使用 , 並將在 JSP 頁面初始化時被初始化   語法格式如下 :   <!%declaration; [declaration;] ...%&

linux基礎篇(九):Redhat7系統使用指令碼安裝虛擬機器

安裝虛擬機器 要安裝一個虛擬機器,我們需要開啟virt-manager然後一步一步的去設定才能到達安裝頁面,但是有沒有更好的辦法能夠只需要一部到達安裝虛擬機器的頁面呢,下面就給大家展示用指令碼直接到達安裝一個虛擬機器的頁面 安裝虛擬機器我們當然要在真機中操作,每一步都一定要仔細檢查

如何在Linux系統編寫指令碼檔案自動執行

        在叢集的部署和啟動過程中,往往要執行叫較多的命令,特別是已經部署成功在啟動的時候,總有一些初始化的工作要做。這個時候如果還是選擇一個一個去依次執行未免有些太浪費時間,因此選擇了指令碼的方式。並且指令碼的方式也便於向

《守望先鋒》網路指令碼化的武器和技能系統

https://www.gameres.com/751979.html 《守望先鋒》中網路指令碼化的武器和技能系統 釋出者: 一元 | 釋出時間: 2017-5-24 10:36| 評論數: 4

除錯經驗——SQLPLUS切換指令碼編輯器的方法

SQLPLUS中預設的編輯器為notepad,想改為notepad++,應怎麼做呢?   方法: 1. 確認前提條件: 1)系統中已安裝有notepad++應用程式 2) 在系統環境變數Path中添加了notepad++.exe的路徑使用define命令 &nb

Django通過指令碼的方式將json資料寫入資料庫

      這裡記錄一下django中通過指令碼的方式寫入json資料的一些技巧。       通過指令碼不僅可以將已有的json資料寫入資料庫,而且可以批量地模擬一些後臺資料,方便進行頁面的展示。    

Python遞迴列出目錄檔案指令碼及其匿名函式

1.遞迴列出目錄裡的檔案的指令碼舉例 列出目錄中的檔案可以通過下面方法:os.listdir() In [1]: import os In [4]: os.listdir('/root') Out[4]: ['.tcshrc', '.bash_history', '.bashrc',

Eclipsejsp頁面js指令碼報錯this inspection checks that the script tag content is valid XML.

首先,js程式碼沒有錯誤,在裡面使用了el表示式,但是編輯器總是提示this inspection checks that the script tag content is valid XML,解決辦法如下: 關閉js校驗,這個就不用多說了,Preference中關閉即可。

記錄ogregpu程式在compositor使用問題

ogre中通過更改gpu程式中的引數,獲取到自己想要的渲染效果。在使用到compositor中時,跟一般通過材質中fragmentprogram更改是不同的。需要在某個compositor的監聽函式中,更改引數。 參考ogre的compositor例子,新建監聽類並繼承自Ogre::C

Linux指令碼程式設計總結

使用者管理 新增使用者 useradd sxt01 所有的系統賬戶都是在home目錄下的 drwx------ 2 sxt01 sxt01 4096 Dec 10 06:38 sxt01 可以去home目錄下去進行查詢 對於兩個賬戶共享同樣的東西,可以通過建立組的形式,讓兩個

Linux系統配置指令碼程式開機啟動

$ vi /etc/rc.d/rc.local #!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # # It is highly advisable to create own systemd serv