引言:一般的,ogre是使用固定渲染管線,嵌入可程式設計管線,可借助GPU,提供更多更豐富的效果。

//-----------------使用腳本加入shader(.material或者.programe使用.hlsl etc)----------
1、聲明(不是寫shader程式)
這兒聲明的意思:不是寫Shader程式(這個着色程式一般在.hlsl/.glsl/.cg字尾的檔案裡面),而是用于設定ogre與Shaer的橋梁,内容就是shader檔案源和一些傳遞參數等。
程式定義可以被嵌套在.material腳本内(在這種情況下,它必須位于任何對它的引用之前,即必須先定義後引用)或者如果你希望跨多個.material腳本使用同一個程式,你可以在一個外部的.program腳本中定義。程式定義的方式與在.program或者.material腳本中一樣,唯一的差別是所有.program腳本都肯定會在.material腳本之前被處理,是以確定你的程式肯定在任何.material腳本之前被定義。正像.material腳本一樣,.program腳本可以從你指定的資源路徑上的任意位置讀取,并且你可以在一個腳本中定義多個程式。(可以打開Examples.material和Example.programe看看)
示例:
//ogre使用的片段程式定義
vertex_program Ogre/CelShadingVP cg //vertex_program這個表示頂點程式,片段程式相應為fragment_program ,
//名字( Ogre/CelShadingVP)後面說明是什麼shader語言(cg,hlgl,glsl最常用)
{
source Example_CelShading.cg //指定頂點程式的源(也就是shader程式,可以在ogreSDK的programs檔案夾下找到)
entry_point main_vp //cg程式和Hlsl程式有程式入口,但GLSL沒有程式入口(相當于C語言中的main)
profiles vs_1_1 arbvp1 //使用的文法規則,目前不咋管(可參考ogre.chm.3.1.4節)
//預設參數塊開始,後面再詳細說傳給shader的參數
default_params
{
param_named_auto lightPosition light_position_object_space 0
param_named_auto eyePosition camera_position_object_space
param_named_auto worldViewProj worldviewproj_matrix
param_named shininess float 10
}
//預設參數塊結束
}
2、傳遞參數
一共有四種類型的參數傳遞:
param_indexed
param_indexed_auto
param_named
param_named_auto
前面兩個隻能用于“編譯程式(如:asm)”,是以先不用管。
後面兩種用于進階程式(HLSL,GLSL,Cg)下面細講
param_named
格式: param_named <name> <type> <value>
示例:param_named shininess float4 10.0 0 0 0
param_named_auto
格式:param_named_auto <name> <value_code> <extra_params>
示例:param_named_auto worldViewProj WORLDVIEWPROJ_MATRIX
參考:
<type>的值可以是float4,matrix4x4,float<n>,int4,int<n>。注意'int'參數隻可用于某些更為進階的程式文法中,細節請檢查D3D或者GL頂點/片斷程式有關文檔。一般最有用的是float4和matrix4x4。注意如果你使用了一個不是4的倍數的類型,那麼剩餘的值會被填充為0(因為GPU總是使用4個浮點數一組表示常量,盡管隻用了其中的一個)。
<value>簡單地是由空格或者tab制表符分割的數值清單,這些數值可以被轉換成你指定過的類型。
<value_code>這個參考Ogre.chm.3.19節(貼不上來,太長了,超過文章字數限制
)
3、在材質通道中使用定義好的頂點程式和片段程式
//--------------------------------先聲明頂點和片段程式------------------------------
vertex_program GLSL/TestVS glsl //使用glsl程式
{
source TwoTexture.vert //這個是glsl的頂點程式(字尾名自己定義亦可),這是我用RenderMonkey導出來的
default_params
{
}
}
fragment_program GLSL/TestFS glsl //片段程式
{
source TwoTexture.frag
default_params
{
param_named baseMap int 0 //向紋理取樣器傳遞紋理單元( texture_unit)的索引,0表示第一個紋理單元
param_named baseMap1 int 1
}
}
//-------------------------材質中使用頂點和片段程式()--------------------------------
....
pass
{
vertex_program_ref GLSL/TestVS //通道中引用申明好的程式(vertex_program_ref,注意引用辨別)
{
//這兒也可提供自己專屬的傳入參數,寫法和申明頂點程式時寫的一樣,如 param_named baseMap int 0
}
fragment_program_ref GLSL/TestFS
{
}
texture_unit //紋理單元0
{
texture T1.jpg
}
texture_unit //紋理單元10
{
texture T2.jpg
}
}
......
通過上面幾步(最簡單的運用),把腳本載入程式使用即可(腳本就是這麼友善
)
可以嘗試把ogre自帶嵌入了頂點(片段)程式的腳本導入程式中,我開始用的是材質腳本Examples/BumpMapping/MultiLight,凸凹貼圖,還蠻好用的...