整合OGRE的地形和PSSM+LiSPSM阴影算法
2014-04-03 04:10
169 查看
OGRE版本1.7.1的Sample里包含了地形的示例,且用到了PSSM+LiSPSM。
今天尝试把Character的Sinbad模型摆到地形上,不过模型的材质本身不支持PSSM。
看了下地形示例的实现,发现它在给Shader传PSSM分界点数据时,用了把模板材质clone一份,再设置diffusemap和pssm分界点的方法,相当让人无语....
[cpp]
view plaincopyprint?
MaterialPtr ret = MaterialManager::getSingleton().getByName(matName);
MaterialPtr baseMat = MaterialManager::getSingleton().getByName("Ogre/shadow/depth/integrated/pssm");
ret = baseMat->clone(matName);
Pass* p = ret->getTechnique(0)->getPass(0);
p->getTextureUnitState("diffuse")->setTextureName(textureName);
Vector4 splitPoints;
const PSSMShadowCameraSetup::SplitPointList& splitPointList =
static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get())->getSplitPoints();
for (int i = 0; i < 3; ++i)
{
splitPoints[i] = splitPointList[i];
}
p->getFragmentProgramParameters()->setNamedConstant("pssmSplitPoints", splitPoints);
c++:
[cpp]
view plaincopyprint?
Vector4 splitPoints;
const PSSMShadowCameraSetup::SplitPointList& splitPointList =
static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get())->getSplitPoints();
for (int i = 0; i < 3; ++i)
{
splitPoints[i] = splitPointList[i];
}
GpuSharedParametersPtr p = GpuProgramManager::getSingleton().getSharedParameters("pssm_params");
p->setNamedConstant("pssmSplitPoints", splitPoints);
Vector4 splitPoints;
const PSSMShadowCameraSetup::SplitPointList& splitPointList =
static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get())->getSplitPoints();
for (int i = 0; i < 3; ++i)
{
splitPoints[i] = splitPointList[i];
}
GpuSharedParametersPtr p = GpuProgramManager::getSingleton().getSharedParameters("pssm_params");
p->setNamedConstant("pssmSplitPoints", splitPoints);
今天尝试把Character的Sinbad模型摆到地形上,不过模型的材质本身不支持PSSM。
看了下地形示例的实现,发现它在给Shader传PSSM分界点数据时,用了把模板材质clone一份,再设置diffusemap和pssm分界点的方法,相当让人无语....
[cpp]
view plaincopyprint?
MaterialPtr ret = MaterialManager::getSingleton().getByName(matName);
MaterialPtr baseMat = MaterialManager::getSingleton().getByName("Ogre/shadow/depth/integrated/pssm");
ret = baseMat->clone(matName);
Pass* p = ret->getTechnique(0)->getPass(0);
p->getTextureUnitState("diffuse")->setTextureName(textureName);
Vector4 splitPoints;
const PSSMShadowCameraSetup::SplitPointList& splitPointList =
static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get())->getSplitPoints();
for (int i = 0; i < 3; ++i)
{
splitPoints[i] = splitPointList[i];
}
p->getFragmentProgramParameters()->setNamedConstant("pssmSplitPoints", splitPoints);
[c-sharp] view plaincopyprint? shared_params pssm_params { shared_param_named pssmSplitPoints float4 } fragment_program Ogre/shadow/receiver/depth/pssm3/fp cg { source depthshadowobject.cg profiles ps_2_x arbfp1 entry_point main_fp compile_arguments -DSHADOWCASTER=0 -DDEPTH_SHADOWCASTER=0 -DDEPTH_SHADOWRECEIVER=1 default_params { param_named_auto materialAmbient derived_ambient_light_colour // shadow samplers are indexes 1/2/3 param_named_auto inverseShadowmapSize0 inverse_texture_size 1 param_named_auto inverseShadowmapSize1 inverse_texture_size 2 param_named_auto inverseShadowmapSize2 inverse_texture_size 3 //SET THIS MANUALLY! //param_named pssmSplitPoints 0 0 0 0 shared_params_ref pssm_params } } shared_params pssm_params { shared_param_named pssmSplitPoints float4 } fragment_program Ogre/shadow/receiver/depth/pssm3/fp cg { source depthshadowobject.cg profiles ps_2_x arbfp1 entry_point main_fp compile_arguments -DSHADOWCASTER=0 -DDEPTH_SHADOWCASTER=0 -DDEPTH_SHADOWRECEIVER=1 default_params { param_named_auto materialAmbient derived_ambient_light_colour // shadow samplers are indexes 1/2/3 param_named_auto inverseShadowmapSize0 inverse_texture_size 1 param_named_auto inverseShadowmapSize1 inverse_texture_size 2 param_named_auto inverseShadowmapSize2 inverse_texture_size 3 //SET THIS MANUALLY! //param_named pssmSplitPoints 0 0 0 0 shared_params_ref pssm_params } }
c++:
[cpp]
view plaincopyprint?
Vector4 splitPoints;
const PSSMShadowCameraSetup::SplitPointList& splitPointList =
static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get())->getSplitPoints();
for (int i = 0; i < 3; ++i)
{
splitPoints[i] = splitPointList[i];
}
GpuSharedParametersPtr p = GpuProgramManager::getSingleton().getSharedParameters("pssm_params");
p->setNamedConstant("pssmSplitPoints", splitPoints);
Vector4 splitPoints;
const PSSMShadowCameraSetup::SplitPointList& splitPointList =
static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get())->getSplitPoints();
for (int i = 0; i < 3; ++i)
{
splitPoints[i] = splitPointList[i];
}
GpuSharedParametersPtr p = GpuProgramManager::getSingleton().getSharedParameters("pssm_params");
p->setNamedConstant("pssmSplitPoints", splitPoints);
相关文章推荐
- 整合OGRE的地形和PSSM+LiSPSM阴影算法
- 整合OGRE的地形和PSSM+LiSPSM阴影算法
- OGRE - Terrain Shadow ,整合OGRE的地形和PSSM+LiSPSM阴影算法
- 整合OGRE和bullet的地形
- OGRE根据高度图创建Terrain地形流程分析
- Ogre实现简单地形
- CEGUI OGRE ISO中文显示输入整合,鼠标独占问题,窗口创建
- Ogre渲染优化心得(三) -- 优化天龙八部的地形
- 近期OGRE的一些研究---创建道路并且与让地形与道路对齐
- 修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
- 修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)
- Axiom3D:Ogre地形组件代码解析
- Ogre的分页大地形场景管理器PLSM2使用手记
- Ogre 天龙八部地形管理器(2) --- 地形和静态对象的加载
- Ogre的御用粒子系统插件ParticleUniverse的整合
- (转)OGRE根据高度图创建Terrain地形流程分析
- [Ogre][地形]OgreTerrain分析以及使用
- OGRE地形初步
- OGRE地形笔记
- 近期OGRE的一些研究---创建道路并且与让地形与道路对齐