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++学习(三一二)glVertexAttribPointer和glVertexAttrib*的关系
C++学习(三一零)glEnableVertexAttribArray和glVertexAttribPointer的顺序关系