C++学习(三一一)AttributeDispatchers和VertexAttribArrayDispatch关系

顶点属性的位置数据通过VertexAttribArrayDispatch来派发,逐点绑定的顶点属性通过VertexAttribArrayDispatch派发,全局绑定或逐图元绑定的顶点属性通过AttributeDispatchers派发。他们两个的工作过程参考C++学习(三零七)AttributeDispatchers详解C++学习(三零九)osg::VertexArrayState的作用

这样设计的目的是,VertexAttribArrayDispatch会派发比较多的顶点属性信息,调用glVertexAttribPointer比较合适,这里Array就意味着数据量比较大,AttributeDispatchers由于需要派发的顶点属性信息比较少(因为所有顶点或所有图元共享一样的信息),调用glVertexAttrib1fv之类的函数比较合适。

这两个派发器的关系也就是glVertexAttribPointer和glVertexAttrib1fv的关系。

和VertexAttribArrayDispatch并列的还有ColorArrayDispatch、FogCoordArrayDispatch、NormalArrayDispatch、SecondaryColorArrayDispatch、TexCoordArrayDispatch、VertexArrayDispatch,他们都是osg::VertexArrayState下的派发器。

osg/Geometry.cpp
void Geometry::drawVertexArraysImplementation(RenderInfo& renderInfo) const
{
    State& state = *renderInfo.getState();
    VertexArrayState* vas = state.getCurrentVertexArrayState();

    AttributeDispatchers& attributeDispatchers = state.getAttributeDispatchers();


    // activate or dispatch any attributes that are bound overall
    attributeDispatchers.activateNormalArray(_normalArray.get());
    attributeDispatchers.activateColorArray(_colorArray.get());
    attributeDispatchers.activateSecondaryColorArray(_secondaryColorArray.get());
    attributeDispatchers.activateFogCoordArray(_fogCoordArray.get());


    // set up arrays
    if( _vertexArray.valid() )
        vas->setVertexArray(state, _vertexArray.get());

    if (_normalArray.valid() && _normalArray->getBinding()==osg::Array::BIND_PER_VERTEX)
        vas->setNormalArray(state, _normalArray.get());

    if (_colorArray.valid() && _colorArray->getBinding()==osg::Array::BIND_PER_VERTEX)
        vas->setColorArray(state, _colorArray.get());

    if (_secondaryColorArray.valid() && _secondaryColorArray->getBinding()==osg::Array::BIND_PER_VERTEX)
        vas->setSecondaryColorArray(state, _secondaryColorArray.get());

    if (_fogCoordArray.valid() && _fogCoordArray->getBinding()==osg::Array::BIND_PER_VERTEX)
        vas->setFogCoordArray(state, _fogCoordArray.get());

    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值