目标:(五十四)中的问题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

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

被折叠的 条评论
为什么被折叠?



