• ogre3D学习基础2 -- 顶点程序与片断程序


    三、顶点程序与片断程序

      顶点或者片断程序定义可以被多个材质使用,唯一的前提条件是必须在引用它之前在材质的渲染通路部分中定义。

      一个低级顶点程序示例如下:

    1 vertex_program myVertexProgram asm
    2 {
    3     source myVertexProgram.asm //资源
    4     syntax vs_1_1             //语法规则
    5 }    

      定义一个片断程序,与此相同,只是将vertex_program换成fragment_program。

      默认的程序参数 --- 定义默认参数可以避免重复绑定公用的参数

    vertex_program Ogre/CelShadingVP cg
    {
        source Example_CelShading.cg  //资源
        entry_point main_vp      //入口
        profiles vs_1_1 arbvp1    //语法规则
          //默认参数块开始
        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 
        }
          //默认参数块结束
    }

    1、顶点程序中的关键技术

      顶点程序中的骨骼动画的实现

      在程序定义时增加如下属性:includes_skeletal_animation true 

      顶点程序中的变形动画的实现

      在程序定义时增加如下属性:includes_morph_animation true

      顶点程序中的姿势动画的实现

      在程序定义时增加如下属性:includes_pose_animation 4

      顶点程序中的顶点纹理拾取的实现

      在程序定义时增加如下属性:uses_vertex_texture_fetch true

    2、Cg程序

      为了定义Cg程序,你需要在开始时装载Plugin_CgProgramManager.so/.dll,方式可以通过plugins.cfg也可以通过自己的插件装载代码。代码如下:

    1 fragment_program myCgFragmentProgram cg
    2 {
    3     source myCgFragmentProgram.cg//资源
    4     entry_point main        //入口
    5     profiles ps_2_0 arbfp1    //规则
    6 }

    3、DirectX9 HLSL

       语法与Cg类似,唯一超过Cg的优势就是它只需要DirectX渲染系统插件,不需要其他插件。

    1 vertex_program myHLSLVertexProgram hlsl
    2 {
    3     source myHLSLVertexProgram.txt//资源
    4     entry_point main        //入口
    5     target vs_2_0          //目标定义
    6 }

    4、OpenGL GLSL

      语法比Cg简单好多,比Cg好在只需要OpenGL渲染系统插件,不需其他额外的插件。

    1 vertex_program myGLSLVertexProgram glsl
    2 {
    3     source myGLSLVertexProgram.txt//资源
    4 }

    5、顶点程序与片段程序的连接

    1 vertex_program_ref myVertexProgram
    2 {
    3     param_indexed_auto 0 worldviewproj_matrix//自动参数
    4     param_indexed      4 float4  10.0 0 0 0 //浮点数组合
    5 }
    参数解析:
    param_indexed----此命令设置索引参数的数值。 
      格式:param_indexed <index> <type> <value>
      示例:param_indexed 0 float4 10.0 0 0 0
    param_indexed_auto---此命令告诉Ogre用源数值自动更新给定的参数。
      格式:param_indexed_auto <index> <value_code> <extra_params>
      示例:param_indexed_auto 0 worldviewproj_matrix
    param_named----此命令设置索引参数的数值。   
      格式: param_named <name> <type> <value>
      示例:param_named shininess float4 10.0 0 0 0
    param_named_auto---此命令告诉Ogre用源数值自动更新给定的参数。
      格式:param_named_auto <name> <value_code> <extra_params>
      示例:param_named_auto worldViewProj WORLDVIEWPROJ_MATRI

    6、材质拷贝  

    当新创建的材质脚本与另一个材质脚本仅有微小差别时,就需要用到材质拷贝技术,其实和继承一个道理。

      格式: material <NewUniqueChildName> : <ReferanceParentMaterial>

    7、目标通路(Target Passes)

      格式1: target <Name> { }//可以有多个

      格式2: target_output { } //唯一

      input---设置目标的输入模式,告诉目标通路在它的任何通路被渲染以前输入什么。

      格式: input (none | previous)

      默认: input none

      only_initial----如果设置为打开,那么这个目标通路只会在效果已经打开后初始化地执行一次。这可能对只执行一次的渲染是有用的,此后的静态内容可以被剩  余的合成器使用。

      格式: only_initial (on | off)

      默认: only_initial off

      visibility_mask----为这个目标通路中的任意render_scene设置可视掩码。这是一个位掩码(尽管它必须被指定为十进制数,而不是十六进制数)并映射到   SceneManager::setVisibilityMask。

      格式: visibility_mask <mask>

      默认: visibility_mask 4294967295

      lod_bias----为这个目标通路中的任意render_scene设置场景LOD偏向。默认是1.0,所有比1.0低的值意味着更低的质量,越高意味着质量越高。

      格式: lod_bias <lodbias>

      默认: lod_bias 1.0

      material_scheme----为这个目标通路中的任意render_scene设置材质方案。材质方案允许你为场景里所有物体选择渲染路径。

      格式: material_scheme <Name>

      默认: material_scheme Default 

    8、合成器通路(Compositor Passes)

      格式: 'pass' (render_quad | clear | stencil | render_scene) { }

      总共有四类:

    clear
      这类通路将目标内一个或多个缓冲器的内容设置为固定的值。这样就能清空颜色缓冲器为固定的颜色,设置深度缓冲器为特定的一类内容,将一个值填到模板缓冲器中,或者是上述三者的任意组合。
    stencil
      这类通路为子通路配置模板操作。它可以为你设置模板函数,操作和引用值来表现你所要的模板效果。
    render_scene
      这类通路用于表现常规场景渲染。它会用到来自父目标通路的visibility_mask,lod_bias,和material_scheme。
    render_quad
      这类通路使用一个给定的材质渲染一片覆盖整个渲染目标的区域。毫无疑问,你会想要将其它目标通路的结果输入进这个操作里,以表现全屏效果。 

    可用的通路属性

      材质material----格式: material <Name> 

      输入input----格式: input <sampler> <Name> 

      标识符identifier----格式: identifier <number> 

      首渲染队列first_render_queue-----格式: first_render_queue <id> 

      末渲染队列last_render_queue----格式: last_render_queue <id> 

      清空clear----格式: clear {缓冲区buffers /颜色值colour_value /深度值depth_value /模板值stencil_value

      模板stencil----格式: stencil {模板检测check /比较函数comp_func /引用值ref_value /掩码mask /失败操作fail_op /depth_fail_op /pass_op/two_sided} 

  • 相关阅读:
    数组作为函数参数传递时
    Tree 笨方法实现
    双向链表
    带头节点的循环链表及两个循环链表的合并
    josephus问题->不带头节点的循环链表
    数组形式链表
    检测qq是否在线
    Python-requests模块
    Python面向对象练习——基于面向对象设计一个对战游戏
    Python-面向对象
  • 原文地址:https://www.cnblogs.com/songliquan/p/3289351.html
Copyright © 2020-2023  润新知