osgEarth的Rex引擎原理分析(五十五)Rex引擎如何给shader文件中的uniform变量赋值

本文分析了Rex引擎如何为shader文件中的uniform变量oe_tile_elevationTex赋值。首先在RexTerrainEngineNode的setMap方法中创建RenderBindings并设置纹理单元,然后在渲染阶段通过一系列步骤,包括TerrainCuller、TerrainRenderData和DrawState的传递,最终在draw阶段完成uniform的赋值。文章详细梳理了这一过程涉及的各个组件和步骤。

目标:(五十四)中的问题128

有几个地方

 

RexEngine.SDK.vert.glsl中的

uniform sampler2D oe_tile_elevationTex;

osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::setupRenderBindings()
{
    SamplerBinding& elevation = _renderBindings[SamplerBinding::ELEVATION];
    elevation.usage()       = SamplerBinding::ELEVATION;
    elevation.samplerName() = "oe_tile_elevationTex";
    elevation.matrixName()  = "oe_tile_elevationTexMatrix";
    if (this->elevationTexturesRequired())
        getResources()->reserveTextureImageUnit( elevation.unit(), "Terrain Elevation" );
}

找不到这个uniform变量是如何赋值又是如何使用的!

这个变量出现在了RenderBindings渲染绑定中,它是怎么进入到渲染绑定中的?(见下面分析)

具体步骤如下:

1、RexTerrainEngineNode在setMap时会创建RenderBindings,这时会将oe_tile_elevationTex硬写入高程渲染的绑定,并且为其分配对应的纹理单元号。紧接着RexTerrainEngineNode将这个RenderBindings交给渲染上下文EngineContext(负责管理Rex引擎的各类信息)。

osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::setMap(const Map* map, const TerrainOptions& options)
{
    setupRenderBindings();
    _engineContext = new EngineContext(
        getMap(),
        this, // engine
        _geometryPool.get(),
        _loader.get(),
        _unloader.get(),
        _rasterizer,
        _liveTiles.get(),
        _renderBindings,
        _terrainOptions,
        _selectionInfo,
        _modifyBBoxCallback.get());
}
void
RexTerrainEngineNode::setupRenderBindings()
{
    SamplerBinding& elevation = _renderBindings[SamplerBinding::ELEVATION];
    elevation.usage()       = SamplerBinding::ELEVATION;
    elevation.samplerName() = "oe_tile_elevationTex";
    elevation.matrixName()  = "oe_tile_elevationTexMatrix";
    if (this->elevationTexturesRequired())
        getResources()->reserveTextureImageUnit( elevation.unit(), "Terrain Elevation" );
}

2、RexTerrainEngineNode在Traverse遍历时,从渲染上下文EngineContext中取出RenderBindings

osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
void
RexTerrainEngineNode::traverse(osg::NodeVisitor& nv)
{
    TerrainCuller culler(cv, this->getEngineContext());
    culler.setup(_mapFrame, _cachedLayerExtents,    this->getEngineContext()->getRenderBindings());
}

3、通过TerrainCuller的setup将RenderBindings转给TerrainRenderData

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值