在使用osg结合shader的时候,发现内建的变量无效,经过查看源码有以下发现:
- 内建变量是否有效需要调用函数:
void State::setUseModelViewAndProjectionUniforms(bool flag)
{
_useModelViewAndProjectionUniforms = flag;
}
- 此变量控制的内建变量有以下几个:
if (_useModelViewAndProjectionUniforms)
{
// replace ftransform as it only works with built-ins
State_Utils::replace(source, "ftransform()", "gl_ModelViewProjectionMatrix * gl_Vertex");
// replace built in uniform
State_Utils::replaceAndInsertDeclaration(source, declPos, "gl_ModelViewMatrix", "osg_ModelViewMatrix", "uniform ", "mat4 ");
State_Utils::replaceAndInsertDeclaration(source, declPos, "gl_ModelViewProjectionMatrix", "osg_ModelViewProjectionMatrix", "uniform ", "mat4 ");
State_Utils::replaceAndInsertDeclaration(source, declPos, "gl_ProjectionMatrix", "osg_ProjectionMatrix", "uniform ", "mat4 ");
State_Utils::replaceAndInsertDeclaration(source, declPos, "gl_NormalMatrix", "osg_NormalMatrix", "uniform ", "mat3 ");
}
- 另外的需要自己传递
class UniformVisitor : public osg::NodeVisitor
{
osg::Camera* _pCamera;
public:
UniformVisitor(osg::Camera*pCamera)
:osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _pCamera(pCamera),_previousFrameTime(0.0), _previousSimulationTime(0.0)
{}
void apply(osg::Geometry& geometry)
{
{
osg::Uniform* uniform = pStateSet_shader->getOrCreateUniform("osg_ViewMatrix", osg::Uniform::FLOAT_MAT4);
uniform->set(view);
}
{
osg::Uniform* uniform = pStateSet_shader->getOrCreateUniform("osg_ViewMatrixInverse", osg::Uniform::FLOAT_MAT4);
uniform->set(view_inv);
}
。。。。。
- 传递的地方:
void QtOsgView::paintGL()
{
_root->accept(*pUniformVisitor);
。。。。