您的位置:首页 > 移动开发 > Objective-C

将Shader嵌入Ogre

2012-07-16 11:49 232 查看


将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

            }

        }

......

 

通过上面几步(最简单的运用),把脚本载入程序使用即可.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息