osg内建shader变量的使用问题

在使用osg结合shader的时候,发现内建的变量无效,经过查看源码有以下发现:

  1. 内建变量是否有效需要调用函数:
void State::setUseModelViewAndProjectionUniforms(bool flag)
{
    _useModelViewAndProjectionUniforms = flag;
}
  1. 此变量控制的内建变量有以下几个:
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 ");
}
  1. 另外的需要自己传递
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);
        }
        。。。。。
  1. 传递的地方:

void QtOsgView::paintGL()
{
    _root->accept(*pUniformVisitor);
    。。。。
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值