osgEarth的Rex引擎原理分析(一一一)着色器上下文环境的准备过程

本文深入剖析osgEarth的Rex引擎中着色器上下文环境的创建与管理,包括着色器维护的osg::Shader:ShaderObjects列表,上下文环境osg::Shader::PerContextShader的生成,以及definestr的获取过程。通过对这些关键步骤的分析,揭示了Rex引擎在渲染过程中的核心机制。
摘要由CSDN通过智能技术生成

目标:(一一零)中的问题197

上下文环境负责着色器代码的编译过程。

每个着色器都维护一个osg::Shader:ShaderObjects列表,列表中每一项对应一个渲染窗口。上下文环境osg::Shader::PerContextShader是通过osg::Shader:ShaderObjects来创建和维护的。上下文环境通过definestr来区分,这个definestr又是根据当前状态机中的definemap和shader中的define综合来确定的。

1、着色器维护osg::Shader:ShaderObjects

osg/Shader.cpp
Shader::PerContextShader* Shader::getPCS(osg::State& state) const
{
    if( getType() == UNDEFINED )
    {
        OSG_WARN << "Shader type is UNDEFINED" << std::endl;
        return 0;
    }

    if (!state.supportsShaderRequirements(_shaderRequirements))
    {
        // OSG_NOTICE<<"Shader not supported "<<_shaderRequirements.size()<<std::endl;
        return 0;
    }

    unsigned int contextID = state.getContextID();
    if( ! _pcsList[contextID].valid() )
    {
        _pcsList[contextID] = new ShaderObjects( this, contextID );
    }

    const std::string defineStr = state.getDefineString(getShaderDefines());
    PerContextShader* pcs = _pcsList[contextID]->getPCS(defineStr);
    if (pcs) return pcs;

    if (state.supportsShaderRequirements(_shaderRequirements))
    {
        pcs = _pcsList[contextID]->createPerContextShader(defineStr);
    }

    return pcs;
}

2、着色器上下文创建过程

osg/Shader.cpp
Shader::PerContextShader* Shader::ShaderObjects::createPerContextShader(const std::string& defineStr)
{
    Shader::PerContextShader* pcs = new PerContextShader( _shader, _contextID );
    _perContextShaders.push_back( pcs );
    pcs->setDefineString(defineStr);
    // OSG_NOTICE<<"ShaderPtr = "<<_shader<<" FileName = '"<<_shader->getFileName()<<"' Creating PCS "<<pcs<<" DefineString = ["<<pcs->getDefineString()<<"]"<<std::endl;
    return pcs;
}

3、着色器上下文definestr的获取过程

osg/SHader.cpp
std::string State::getDefineString(const osg::ShaderDefines& shaderDefines)
{
    if (_defineMap.changed) _defineMap.updateCurrentDefines();

    const StateSet::DefineList& currentDefines = _defineMap.currentDefines;

    ShaderDefines::const_iterator sd_itr = shaderDefines.begin();
    StateSet::DefineList::const_iterator cd_itr = currentDefines.begin();

    std::string shaderDefineStr;

    while(sd_itr != shaderDefines.end() && cd_itr != currentDefines.end())
    {
        if ((*sd_itr) < cd_itr->first) ++sd_itr;
        else if (cd_itr->first < (*sd_itr)) ++cd_itr;
        else
        {
            const StateSet::DefinePair& dp = cd_itr->second;
            shaderDefineStr += "#define ";
            shaderDefineStr += cd_itr->first;
            if (!dp.first.empty())
            {
                if (dp.first[0]!='(') shaderDefineStr += " ";
                shaderDefineStr += dp.first;
            }
#ifdef WIN32
            shaderDefineStr += "\r\n";
#else
            shaderDefineStr += "\n";
#endif

            ++sd_itr;
            ++cd_itr;
        }
    }
    return shaderDefineStr;
}

待继续分析列表:

9、earth文件中都有哪些options((九)中问题)

10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)

11、rex地理信息引擎的四梁八柱((九)中问题)

12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值