zoukankan      html  css  js  c++  java
  • Ogre GpuProgram分析

      和前面讲解的Compositor一样,GpuProgram也对应一种资源文件,意思我们可以直接写一个文件来完成,不需要了解相关的类. 但是就和winform一样,直接拖控件能完成大部分工作,假如如果需要我们自己手工来定制相应控件,相应的类与属性还是需要了解的,不然我们看下Ogre里讲解延迟渲染的例子(DeferredShading),就会发现看不懂了.

      GpuProgram比较重要的是GpuProgramParameters对象,这个对象封装了着色器的参数设置。

      从着色器语言来说,参数主要区分高级着色器语言和汇编着色器语言.还有Ogre内部自行管理一部分常用的参数,如MVP矩阵.这部分参数也独立封装出来,以便Ogre内部自动更新.

    Ogre内部管理参数封装.

      AutoConstantDefinition:定义Ogre内置的一些参数定义,如word_matrix,view_matrix...等.

    acType:参数ID,可以指明参数在Ogre预定义所有索引中的位置.

    name:参数名字.如上面的word_matrix.

    elementCount:包含多个元素,如word_matrix是4*4的矩阵,就应该是16个元素.

    elementType:指明元素类型,如word_matrix中的元素应该都是float.好像大部分都是float,很少看到是int类型的.

    dataType:指明更新元素需要的额外参数的类型,有三种,None,Int,Real,如world_matrix不需要额外参数,就用None,然后是涉及灯光与纹理的属性如light_diffuse_colour,texture_size等都为int,因为这种一般有多个,int指明当前索引.而time,time_0_x需要额外的float参数指定周期,则类型为Real,可以参照Axiom3D:手动创建ManualObject与Mesh,以及如何使用Cg着色器语言.里的用法. 

      AutoConstantEntry:包含AutoConstantDefinition指定Ogre的参数设置,参数存入位置,参数个数,参数需要更新的额外数据.可见性.

    paramType:AutoConstantDefinition类型,指定参数定义.

    physicalIndex:非常重要,指定在定义数据在Ogre中存放的位置,后面仔细说.

    elementCount:当前包含多少个元素.

    data/fData:对应上面AutoConstantDefinition里的dataType,int类型对应data,Real对应fData.

    variability:对应当前元素所在范围.

    高级着色器语言参数封装.

      GpuConstantDefinition:上面AutoConstantDefinition与AutoConstantEntry指明是Ogre预定义的相应参数,不需要用户自己更新的,而用户如果要自己定义的参数,用这个表示.

    constType:数据类型,float,float4,Matrix4*4,sampler.

    physicalIndex:和AutoConstantEntry里的意义一样,指定数据在列表中的位置.

    logicalIndex:rendersystem与physicalIndex之间关联.

    elementSize:一个4个字节表示一个长度,如float,int为1,float4为4,如果是D3D开启SM1,则最短4个长度,意义float,float4,int,int4全是4,以4为最少长度对齐.计算请看getElementSize方法.

    variability:元素所在范围.

      GpuNamedConstants:GpuConstantDefinition与对应name的字典,对应float,int列表所有长度.

    汇编着色器语言参数封装

      GpuLogicalIndexUse:记录汇编着色器语言中定义的参数,对应高级着色器语言里的GpuConstantDefinition.

    phsicalIndex:指定数据在列表中的位置.

    currentSize:指定当前参数大小.

    variability:元素所在范围

      GpuLogicalIndexUseMap: logicalIndex逻辑位置与GpuLogicalIndexUse对应字典.

      GpuLogicalBufferStruct: GpuLogicalIndexUseMap对象与bufferSize(buffer长度),对应GpuNamedConstants.

    GpuProgramParameters说明

      GpuProgramParameters:封装所有参数,下面一些主要属性的说明.

    常用字段

      AutoConstantDictionary:AutoConstantDefinition静态数组,包含Ogre内置的所有参数定义.

      mAutoConstants:AutoConstantEntry的vector类型.对应所有Ogre自动管理的参数.

      mNamedConstants:GpuNamedConstants类型,对应所有高级着色器参数设置.

      mFloatLogicalToPhysical,mIntLogicalToPhysical: GpuLogicalBufferStruct类型,对应汇编着色器里参数的设置.

      mFloatConstants,mIntConstants:对应float,int的vector类型数组,不管是汇编还是高级,内置的参数数据都包含在这里面.

    方法

      _writeRawConstants:根据传入的实际位置,分别写入mFloatConstants与mIntConstants中.

      _getFloatConstantLogicalIndexUse:汇编着色器参数中根据实际位置找逻辑位置.

      _getFloatConstantPhysicalIndex:汇编着色器参数根据逻辑位置找实际位置.

      setConstant:更新汇编参数,要求传入逻辑位置与更新的数据,我们需要调用getFloatConstantPhysicalIndex把逻辑位置转化成实际位置,然后调用_writeRawConstants.

      setNamedConstant:更新高级着色器参数,根据传入名字,找到对应mNamedConstants里的对象,得到实际位置,调用_writeRawConstants.

      setAutoConstant:和上面setConstant不同的是,这个找到实际位置后,根据传入参数AutoConstantType,指明这个位置是由Ogre那个内部参数管理.注意,这个时候并没有更新对应的mFloatConstants等,而是放入mAutoConstants中.

      setNamedAutoConstant:和setAutoConstant一样,根据名字,找到对应位置,然后放入mAutoConstants中.

      _updateAutoParams:上面的setAutoConstant与setNamedAutoConstant并没更新数据,只是指明对应实际位置是由Ogre那个内部参数管理,而这个方法,才会更新对应数据,如同setConstant,setNamedConstant调用了_writeRawConstants.注意这个方法由Ogre每桢自动调用.

      此外GpuProgramParameters一般与GpuSharedParameters一起指定GpuSharedParametersUsage,因为我们有时有一些着色器代码有相同的参数设置,这样,可以把共同部分用GpuSharedParameters表示,对应GpuSharedParameters不需要针对这些参数重复更新.

    GpuProgram说明:

    常用字段

      GpuProgram对应一种资源文件,我们可以看到一些字段直接对应着资源里的定义.

      mType:指明着色器是什么类型,主要有顶点,几何,片断.

      mFilename:着色器代码存入的资源文件名.

      mSource:用户如果自已生成着色器代码,可以把相应着色器代码写入这个属性.

      mLoadFormFile:着色器代码是存入在资源文件里,还是用户自定义.

      mSyntaxCode:着色器要求的硬件设置.

      mDefaultParams:GpuProgramParameters的引用计算指针类型,管理这个着色器程序里的参数.

      mConstantDefs,mFloatLogicalToPhysical,mIntLogicalToPhysical:着色器参数设置,一般指向对应的mDefaultParams共享相同的参数.

    方法

      createParameters:创建GpuProgramParameters的引用计算指针.

      getDefaultParameters:返回mDefaultParams,如果是空,就调用createParameters.

      getLanguage:返回什么着色器语言,如hlsl,glsl,cg,asm.

      setManualNamedConstants:根据传入的GpuNamedConstants设置参数.

      loadFromSource:抽象方法.

    HighLevelGpuProgram说明

    常用字段

      mHighLevelLoaded:高级着色器代码是否已经加载.

      mAssemblerProgram:对应汇编着色器代码.

      mConstantDefsBuilt:着色器参数是否已经加载.

    方法

      loadHighLevel:加载高级着色器代码,统一高级着色器共同逻辑.

      loadHighLevelImpl:抽象方法,子类对象需要实例化这个方法.对应各高级着色器语言加载逻辑.

      createParameters:创建GpuProgramParameters引用指针共享对象.如果硬件支持,调用下面的buildConstantDefinitions.

      buildConstantDefinitions:抽象方法,得到高级着色器参数信息.主要是mConstantDefs,mFloatLogicalToPhysical,mIntLogicalToPhysical.

      getConstantDefinitions:得到高级着色器参数信息.如上这些.

      populateParameterNames:把buildConstantDefinitions得到的参数信息赋值给mDefaultParams.意思就是关联共享mDefaultParams与对应的GpuProgram的mConstantDefs,mFloatLogicalToPhysical,mIntLogicalToPhysical.

    Cg GpuProgram加载流程:

      结合上面类的说明,我们选一种高级着色语言,把上面的类所有元素结合一起看下加载流程,如下图是cg着色器文件加载流程:

  • 相关阅读:
    调用网易有道词典api
    函数设计
    参数2
    新浪微博API使用初步介绍——解决回调地址的问题
    参数关键点和return返回多个(伪多个)值问题
    函数基本理论
    一个值得思考的例子
    Beego基础学习(五)Golang原生sql操作Mysql数据库增删改查(基于Beego下测试)
    Golang利用select实现超时机制
    Golang利用select和普通函数分别实现斐波那契数列
  • 原文地址:https://www.cnblogs.com/zhouxin/p/4369537.html
Copyright © 2011-2022 走看看