将Shader嵌入Ogre

来源:互联网 发布:quicktime player mac 编辑:程序博客网 时间:2024/04/30 04:46

将Shader嵌入Ogre

引言:一般的,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,hlsl,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
            }
        }

......

 

通过上面几步(最简单的运用),把脚本载入程序使用即可.

原创粉丝点击