ogre-next 学习笔记 - Day 7
通过之前的分析,知晓 hlms 的重要性。对hlms做一个详细的分析
hlms文件结构以及对象
从图中看出,hlms的文件不多,对象也不多,关系简单。
类图
能看懂就行,不求格式
对象大概能分为几类
- Hlms
- HlmsProperty
- HlmsDatablock
- StaticBlock
- HlmsJson
- 其他
每一种 hlms都有一个对应的property,这些property由一些const idString 标识它支持的属性。
例如
struct _OgreHlmsUnlitMobileExport UnlitMobileProp{static const IdString TexMatrixCount;static const IdString TexMatrixCount0;static const IdString TexMatrixCount1;static const IdString TexMatrixCount2;static const IdString TexMatrixCount3;static const IdString TexMatrixCount4;static const IdString TexMatrixCount5;static const IdString TexMatrixCount6;static const IdString TexMatrixCount7;}const IdString UnlitMobileProp::TexMatrixCount = IdString( "hlms_texture_matrix_count" );const IdString UnlitMobileProp::TexMatrixCount0 = IdString( "hlms_texture_matrix_count0" );const IdString UnlitMobileProp::TexMatrixCount1 = IdString( "hlms_texture_matrix_count1" );const IdString UnlitMobileProp::TexMatrixCount2 = IdString( "hlms_texture_matrix_count2" );const IdString UnlitMobileProp::TexMatrixCount3 = IdString( "hlms_texture_matrix_count3" );const IdString UnlitMobileProp::TexMatrixCount4 = IdString( "hlms_texture_matrix_count4" );const IdString UnlitMobileProp::TexMatrixCount5 = IdString( "hlms_texture_matrix_count5" );const IdString UnlitMobileProp::TexMatrixCount6 = IdString( "hlms_texture_matrix_count6" );const IdString UnlitMobileProp::TexMatrixCount7 = IdString( "hlms_texture_matrix_count7" );
每个hlms 都有一个 datablock
例如
class HlmsUnlitMobileDatablock : public HlmsDatablock
{
}
这里通过注释的方式,把每个支持的数据都标出来了。通过之前的学习知道,这些数据可以来自script,也可以通过代码设置。
datablock里的数据与property里的是一一对应的,renderable持有了一个datablock,最终会把 datablock里的数据设置到property里。
void HlmsPbs::calculateHashForPreCreate( Renderable *renderable, PiecesMap *inOutPieces )
{assert( dynamic_cast<HlmsPbsDatablock*>( renderable->getDatablock() ) );HlmsPbsDatablock *datablock &#61; static_cast<HlmsPbsDatablock*>(renderable->getDatablock() );const bool metallicWorkflow &#61; datablock->getWorkflow() &#61;&#61; HlmsPbsDatablock::MetallicWorkflow;const bool fresnelWorkflow &#61; datablock->getWorkflow() &#61;&#61;HlmsPbsDatablock::SpecularAsFresnelWorkflow;setProperty( PbsProperty::FresnelScalar, datablock->hasSeparateFresnel() || metallicWorkflow );setProperty( PbsProperty::FresnelWorkflow, fresnelWorkflow );setProperty( PbsProperty::MetallicWorkflow, metallicWorkflow );
}
已知的是&#xff0c;创建的时候是通过item->setDatablock(…)
void Item::setDatablock( HlmsDatablock *datablock ){SubItemVec::iterator itor &#61; mSubItems.begin();SubItemVec::iterator end &#61; mSubItems.end();while( itor !&#61; end ){itor->setDatablock( datablock );&#43;&#43;itor;}}
内部会调用 subItem->setDatablock(…)
void Renderable::setDatablock( HlmsDatablock *datablock )
{
}
class _OgreExport SubItem : public RenderableAnimated
class _OgreExport RenderableAnimated : public Renderable
SubItem 是 Renderable。
从material 到 hlms property&#xff0c;hlms 算走通了一半。设置完属性后&#xff0c;就应该设置往shader送数据了。
还有 hlms的几个cache没有涉及到
to be continue…