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

Posted hankern

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++学习(三一一)AttributeDispatchers和VertexAttribArrayDispatch关系相关的知识,希望对你有一定的参考价值。

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

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

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

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());

    
}

以上是关于C++学习(三一一)AttributeDispatchers和VertexAttribArrayDispatch关系的主要内容,如果未能解决你的问题,请参考以下文章

C++学习(四三一)nostdlib作用

C++学习(三一二)glVertexAttribPointer和glVertexAttrib*的关系

C++学习(三一零)glEnableVertexAttribArray和glVertexAttribPointer的顺序关系

C++学习(三一三)EventQueue创建时机

C++学习(三一四)osg漫游器Manipulator例子

C++学习(三一七)ASCII码表