和前面讲解的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着色器文件加载流程: