顶点属性的位置数据通过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());
}