OSG 中 常用的 Uniforms
来源:互联网 发布:dnf不停的网络连接中断 编辑:程序博客网 时间:2024/05/10 14:17
osg中的 Uniforms主要存在两个地方,一个是SceneView中,void SceneView::updateUniforms()
void SceneView::updateUniforms(){ if (!_localStateSet) { _localStateSet = new osg::StateSet; } if (!_localStateSet) return; if ((_activeUniforms & FRAME_NUMBER_UNIFORM) && _frameStamp.valid()) { osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_FrameNumber",osg::Uniform::UNSIGNED_INT); uniform->set(_frameStamp->getFrameNumber()); } if ((_activeUniforms & FRAME_TIME_UNIFORM) && _frameStamp.valid()) { osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_FrameTime",osg::Uniform::FLOAT); uniform->set(static_cast<float>(_frameStamp->getReferenceTime())); } if ((_activeUniforms & DELTA_FRAME_TIME_UNIFORM) && _frameStamp.valid()) { float delta_frame_time = (_previousFrameTime != 0.0) ? static_cast<float>(_frameStamp->getReferenceTime()-_previousFrameTime) : 0.0f; _previousFrameTime = _frameStamp->getReferenceTime(); osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_DeltaFrameTime",osg::Uniform::FLOAT); uniform->set(delta_frame_time); } if ((_activeUniforms & SIMULATION_TIME_UNIFORM) && _frameStamp.valid()) { osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_SimulationTime",osg::Uniform::FLOAT); uniform->set(static_cast<float>(_frameStamp->getSimulationTime())); } if ((_activeUniforms & DELTA_SIMULATION_TIME_UNIFORM) && _frameStamp.valid()) { float delta_simulation_time = (_previousSimulationTime != 0.0) ? static_cast<float>(_frameStamp->getSimulationTime()-_previousSimulationTime) : 0.0f; _previousSimulationTime = _frameStamp->getSimulationTime(); osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_DeltaSimulationTime",osg::Uniform::FLOAT); uniform->set(delta_simulation_time); } if (_activeUniforms & VIEW_MATRIX_UNIFORM) { osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_ViewMatrix",osg::Uniform::FLOAT_MAT4); uniform->set(getViewMatrix()); } if (_activeUniforms & VIEW_MATRIX_INVERSE_UNIFORM) { osg::Uniform* uniform = _localStateSet->getOrCreateUniform("osg_ViewMatrixInverse",osg::Uniform::FLOAT_MAT4); uniform->set(osg::Matrix::inverse(getViewMatrix())); }}
不过默认的是: DEFAULT_UNIFORMS
enum ActiveUniforms { FRAME_NUMBER_UNIFORM = 1, FRAME_TIME_UNIFORM = 2, DELTA_FRAME_TIME_UNIFORM = 4, SIMULATION_TIME_UNIFORM = 8, DELTA_SIMULATION_TIME_UNIFORM = 16, VIEW_MATRIX_UNIFORM = 32, VIEW_MATRIX_INVERSE_UNIFORM = 64, DEFAULT_UNIFORMS = FRAME_NUMBER_UNIFORM | FRAME_TIME_UNIFORM | DELTA_FRAME_TIME_UNIFORM | SIMULATION_TIME_UNIFORM | DELTA_SIMULATION_TIME_UNIFORM | VIEW_MATRIX_UNIFORM | VIEW_MATRIX_INVERSE_UNIFORM, ALL_UNIFORMS = 0x7FFFFFFF };
另一个是在osg::State中,
_modelViewMatrixUniform = new Uniform(Uniform::FLOAT_MAT4,"osg_ModelViewMatrix"); _projectionMatrixUniform = new Uniform(Uniform::FLOAT_MAT4,"osg_ProjectionMatrix"); _modelViewProjectionMatrixUniform = new Uniform(Uniform::FLOAT_MAT4,"osg_ModelViewProjectionMatrix"); _normalMatrixUniform = new Uniform(Uniform::FLOAT_MAT3,"osg_NormalMatrix");
要使用这些Uniforms,需要:
viewer->realize();osg::State* state = viewer->getCamera()->getGraphicsContext()->getState();state->setUseModelViewAndProjectionUniforms(true);
0 0
- OSG 中 常用的 Uniforms
- [OSG]OSG中字体的排版
- OSG中圆锥的使用
- OSG中LOD的使用
- OSG中添加多个物体, OSG::Group的使用
- OSG学习笔记15-OSG中对事件的处理
- OSG学习:使用OSG中预定义的几何体
- [osg]OSG的分格化
- OSG中与时间相关的类osg::FrameStamp,osg::Timer源码剖析
- OSG中获取视点的世界坐标
- OSG在VS2010中使用的问题
- OSG中相机参数的更改
- osg中智能指针的使用
- OSG中文字的使用,osgText
- 4.osg中HUD的实现
- 6.osg中光照的使用
- 关于OSG中各种变换的理解
- Qt中嵌入OSG控件的方法
- android 反编译和代码解读
- 本人的博客模版
- How to login as Root In ubuntu
- ACRA用法详解
- 如何判断iOS app是通过哪种途径启动的
- OSG 中 常用的 Uniforms
- 使用virtualbox安装centos6的内置无线网卡桥接设置
- CentOs虚拟机可以互相ping通,但无法访问虚拟机Web服务
- [leetcode][array] Majority Element
- linux 网络命令ifconfig
- 实现线程的第二种方法
- 继承练习
- win7下U盘安装Ubuntu
- 关于64位win7、win8.1下keil V3不能破解的解决办法