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着色器文件加载流程:

原文地址:https://www.cnblogs.com/zhouxin/p/4369537.html