Ogre Scene Renderer - 如何将一个可渲染对象加进渲染队列
2011-08-31 17:31
483 查看
判断对象是否半透明实体
view plain
//-----------------------------------------------------------------------
bool Pass::isTransparent(void) const
{
// Transparent if any of the destination colour is taken into account
if (mDestBlendFactor == SBF_ZERO &&
mSourceBlendFactor != SBF_DEST_COLOUR &&
mSourceBlendFactor != SBF_ONE_MINUS_DEST_COLOUR &&
mSourceBlendFactor != SBF_DEST_ALPHA &&
mSourceBlendFactor != SBF_ONE_MINUS_DEST_ALPHA)
{
return false;
}
else
{
return true;
}
}
view plain
//-----------------------------------------------------------------------
void RenderPriorityGroup::addRenderable(Renderable* rend, Technique* pTech)
{
// Transparent and depth/colour settings mean depth sorting is required?
// Note: colour write disabled with depth check/write enabled means
// setup depth buffer for other passes use.
view plain
// <strong>这个很长的if决定对象是否半透明实体</strong>
if (pTech->isTransparentSortingForced() ||
(pTech->isTransparent() &&
(!pTech->isDepthWriteEnabled() ||
!pTech->isDepthCheckEnabled() ||
pTech->hasColourWriteDisabled())))
{
if (pTech->isTransparentSortingEnabled())
addTransparentRenderable(pTech, rend);
else
addUnsortedTransparentRenderable(pTech, rend);
}
else
{
if (mSplitNoShadowPasses &&
mParent->getShadowsEnabled() &&
(!pTech->getParent()->getReceiveShadows() ||
rend->getCastsShadows() && mShadowCastersNotReceivers))
{
// Add solid renderable and add passes to no-shadow group
addSolidRenderable(pTech, rend, true);
}
else
{
if (mSplitPassesByLightingType && mParent->getShadowsEnabled())
{
addSolidRenderableSplitByLightType(pTech, rend);
}
else
{
addSolidRenderable(pTech, rend, false);
}
}
}
}
每一个RenderPriorityGroup由6个队列组成
+ mSolidsBasic {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mSolidsDiffuseSpecular {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mSolidsDecal {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mSolidsNoShadowReceive {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mTransparentsUnsorted {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mTransparents {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
view plain
//-----------------------------------------------------------------------
bool Pass::isTransparent(void) const
{
// Transparent if any of the destination colour is taken into account
if (mDestBlendFactor == SBF_ZERO &&
mSourceBlendFactor != SBF_DEST_COLOUR &&
mSourceBlendFactor != SBF_ONE_MINUS_DEST_COLOUR &&
mSourceBlendFactor != SBF_DEST_ALPHA &&
mSourceBlendFactor != SBF_ONE_MINUS_DEST_ALPHA)
{
return false;
}
else
{
return true;
}
}
view plain
//-----------------------------------------------------------------------
void RenderPriorityGroup::addRenderable(Renderable* rend, Technique* pTech)
{
// Transparent and depth/colour settings mean depth sorting is required?
// Note: colour write disabled with depth check/write enabled means
// setup depth buffer for other passes use.
view plain
// <strong>这个很长的if决定对象是否半透明实体</strong>
if (pTech->isTransparentSortingForced() ||
(pTech->isTransparent() &&
(!pTech->isDepthWriteEnabled() ||
!pTech->isDepthCheckEnabled() ||
pTech->hasColourWriteDisabled())))
{
if (pTech->isTransparentSortingEnabled())
addTransparentRenderable(pTech, rend);
else
addUnsortedTransparentRenderable(pTech, rend);
}
else
{
if (mSplitNoShadowPasses &&
mParent->getShadowsEnabled() &&
(!pTech->getParent()->getReceiveShadows() ||
rend->getCastsShadows() && mShadowCastersNotReceivers))
{
// Add solid renderable and add passes to no-shadow group
addSolidRenderable(pTech, rend, true);
}
else
{
if (mSplitPassesByLightingType && mParent->getShadowsEnabled())
{
addSolidRenderableSplitByLightType(pTech, rend);
}
else
{
addSolidRenderable(pTech, rend, false);
}
}
}
}
每一个RenderPriorityGroup由6个队列组成
+ mSolidsBasic {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mSolidsDiffuseSpecular {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mSolidsDecal {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mSolidsNoShadowReceive {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mTransparentsUnsorted {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
+ mTransparents {msRadixSorter1={...} msRadixSorter2={...} mOrganisationMode='' ...} Ogre::QueuedRenderableCollection
相关文章推荐
- Ogre的渲染流程,在渲染时材质是如何起作用的,材质加载和解析
- JSP如何在servlet将一个数据模型对象传递给jsp页面
- 关于unity动态添加游戏对象问题,如何动态添加一个菜单【一】
- 如何在指定的内存区域 new 一个对象
- 关于unity动态添加游戏对象问题,如何动态添加一个菜单【二】
- 如何在一个for语句中迭代多个可迭代对象
- JVM是如何判断一个对象的存活?
- java如何获取一个对象的大小
- Oracle 中如何删除一个用户拥有的所有对象
- 原!!如何将多个复杂查询整合成一个查询,并作为一个对象的各个字段输出
- 如何在一个开启了ARC的工程里使用不支持ARC的对象
- jQuery如何返回一个类数组对象,js让一个对象的行为像一个数组一样
- 如何停止一个正在队列或正在运行的runable和message
- 如何js中判断一个对象是否存在
- Java中如何序列化一个对象
- C#.NET 如何快速输入一个对象事件对应的方法
- 如何定义一个只能在堆上(栈上)生成对象的类?
- 如何在一个事务中插入一对多关系的多个EO对象?
- Java 中如何序列化一个对象
- js 的对象--如何定义一个对象