您的位置:首页 > 其它

整合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-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);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: