天天看點

将Shader嵌入Ogre(固定渲染管線到可程式設計渲染管線)

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

将Shader嵌入Ogre(固定渲染管線到可程式設計渲染管線)

//-----------------使用腳本加入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節(貼不上來,太長了,超過文章字數限制

将Shader嵌入Ogre(固定渲染管線到可程式設計渲染管線)

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

            }

        }

......

通過上面幾步(最簡單的運用),把腳本載入程式使用即可(腳本就是這麼友善

将Shader嵌入Ogre(固定渲染管線到可程式設計渲染管線)

)

可以嘗試把ogre自帶嵌入了頂點(片段)程式的腳本導入程式中,我開始用的是材質腳本Examples/BumpMapping/MultiLight,凸凹貼圖,還蠻好用的...

繼續閱讀