osg内置shader变量
- uniform int osg_FrameNumber:当前OSG程序运行的帧数;
- uniform float osg_FrameTime:当前OSG程序的运行总时间;
- uniform float osg_DeltaFrameTime:当前OSG程序运行每帧的间隔时间;
- uniform mat4 osg_ViewMatrix:当前OSG摄像机的观察矩阵;
- uniform mat4 osg_ViewMatrixInverse:当前OSG摄像机观察矩阵的逆矩阵。
- uniform mat4 osg_ModelViewMatrix:内置gl_ModelViewMatrix
- uniform mat4 osg_ModelViewProjectionMatrix:内置gl_ModelViewProjectionMatrix
- uniform mat4 osg_ProjectionMatrix:内置gl_ProjectionMatrix
- uniform mat3 osg_NormalMatrix:内置gl_NormalMatrix
- attribute:应用程序与顶点着色器的接口,使用顶点属性定义函数进行定义;
- uniform:应用程序与所有着色器的接口,定义不随顶点变化的“一致变量”;
- varying:着色器之间的“易变变量”接口,用于传递插值得到的顶点数据;
- const:用于声明常量数据;
- in:作为函数形参进行传递,函数返回时不保留改变,只保留传入值;
- out:作为函数形参进行传递,本身未定义,函数返回时保留改变值;
- inout:作为函数形参进行传递,可以定义传入值,也会保留返回时的改变值。
- uniform mat4 gl_NormalMatrix:法线变换矩阵;
- uniform mat4 gl_ModelViewMatrix:模型视点变换矩阵;
- attribute vec4 gl_Vertex:顶点坐标属性;
- attribute vec4 gl_MultiTexCoord0:纹理单元0的纹理坐标属性;
- varying vec4 gl_TexCoord[0]:纹理单元0的实际纹理坐标。
- 实现片元着色器的一段示例代码如下:
- uniform sampler2D texture;
- varying vec3 tangent;
- void main( void )
- {
- gl_FragColor = texture2D( texture, gl_TexCoord[] );
- }
着色器一致变量的接口类。对于OpenGL着色语言而言,一致变量(uniform)是用户应用程序与着色器的主要交互接口。Uniform类支持绑定多种类型的一致变量,并使用set()和setArray()更新变量或变量数组的值。而为了实现一致变量的每帧变化,进而达到顶点和片元的各种动画特效,Uniform类还提供了相应的回调工具:使用setUpdateCallback设置自定义的回调类,并在其中更新这个一致变量的值,以实现所需的效果。
- 实现片元着色器的一段示例代码如下:
- #include <osgViewer/Viewer>
- #include <osg/ShapeDrawable>
- #include <osg/Geode>
- #include <osg/Vec3>
- #include <osg/Program>
- #include <osg/Shader>
- #include <osg/Uniform>
- using namespace osg;
- ///////////////////////////////////////////////////////////////////////////
- // in-line GLSL source code
- static const char *blockyVertSource = {
- "// blocky.vert - an GLSL vertex shader with animation\n"
- "// the App updates uniforms \"slowly\" (eg once per frame) for animation.\n"
- "uniform float Sine;\n"
- "const vec3 LightPosition = vec3(0.0, 0.0, 4.0);\n"
- "const float BlockScale = 0.30;\n"
- "// varyings are written by vert shader, interpolated, and read by frag shader.\n"
- "varying float LightIntensity;\n"
- "varying vec2 BlockPosition;\n"
- "void main(void)\n"
- "{\n"
- " // per-vertex diffuse lighting\n"
- " vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;\n"
- " vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);\n"
- " vec3 lightVec = normalize(LightPosition - vec3 (ecPosition));\n"
- " LightIntensity = max(dot(lightVec, tnorm), 0.0);\n"
- " // blocks will be determined by fragment's position on the XZ plane.\n"
- " BlockPosition = gl_Vertex.xz / BlockScale;\n"
- " // scale the geometry based on an animation variable.\n"
- " vec4 vertex = gl_Vertex;\n"
- " vertex.w = 1.0 + 0.4 * (Sine + 1.0);\n"
- " gl_Position = gl_ModelViewProjectionMatrix * vertex;\n"
- "}\n"
- };
- static const char *blockyFragSource = {
- "// blocky.frag - an GLSL fragment shader with animation\n"
- "// the App updates uniforms \"slowly\" (eg once per frame) for animation.\n"
- "uniform float Sine;\n"
- "const vec3 Color1 = vec3(1.0, 1.0, 1.0);\n"
- "const vec3 Color2 = vec3(0.0, 0.0, 0.0);\n"
- "// varyings are written by vert shader, interpolated, and read by frag shader.\n"
- "varying vec2 BlockPosition;\n"
- "varying float LightIntensity;\n"
- "void main(void)\n"
- "{\n"
- " vec3 color;\n"
- " float ss, tt, w, h;\n"
- " ss = BlockPosition.x;\n"
- " tt = BlockPosition.y;\n"
- " if (fract(tt * 0.5) > 0.5)\n"
- " ss += 0.5;\n"
- " ss = fract(ss);\n"
- " tt = fract(tt);\n"
- " // animate the proportion of block to mortar\n"
- " float blockFract = (Sine + 1.1) * 0.4;\n"
- " w = step(ss, blockFract);\n"
- " h = step(tt, blockFract);\n"
- " color = mix(Color2, Color1, w * h) * LightIntensity;\n"
- " gl_FragColor = vec4 (color, 1.0);\n"
- "}\n"
- };
- ///////////////////////////////////////////////////////////////////////////
- // callback for animating various Uniforms (currently only the SIN uniform)
- class AnimateCallback : public osg::UniformCallback
- {
- public:
- enum Operation { SIN };
- AnimateCallback(Operation op) : _operation(op) {}
- virtual void operator() (osg::Uniform* uniform, osg::NodeVisitor* nv)
- {
- float angle = 2.0 * nv->getFrameStamp()->getSimulationTime();
- float sine = sinf(angle); // -1 -> 1
- switch (_operation) {
- case SIN: uniform->set(sine); break;
- }
- }
- private:
- Operation _operation;
- };
- int main(int, char **)
- {
- // construct the viewer.
- osgViewer::Viewer viewer;
- // use a geode with a Box ShapeDrawable
- osg::Geode* basicModel = new osg::Geode();
- basicModel->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f)));
- // create the "blocky" shader, a simple animation test
- osg::StateSet *ss = basicModel->getOrCreateStateSet();
- osg::Program* program = new osg::Program;
- program->setName("blocky");
- //program->addShader(new osg::Shader(osg::Shader::VERTEX, blockyVertSource));
- //program->addShader(new osg::Shader(osg::Shader::FRAGMENT, blockyFragSource));
- program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, "blocky.vert"));
- program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, "blocky.frag"));
- ss->setAttributeAndModes(program, osg::StateAttribute::ON);
- // attach some animated Uniform variable to the state set
- osg::Uniform* SineUniform = new osg::Uniform("Sine", 0.0f);
- ss->addUniform(SineUniform);
- SineUniform->setUpdateCallback(new AnimateCallback(AnimateCallback::SIN));
- // run the osg::Viewer using our model
- viewer.setSceneData(basicModel);
- return viewer.run();
- }
- /*EOF*/
osg内置shader变量的更多相关文章
- Unity 内置Shader变量、辅助函数等
一:标准库里的常用.cginc文件 HLSLSupport.cginc - (automatically included) Helper macros and definitions for cro ...
- CESIUM内置shader变量和函数[转]
cesium中内置了一些常量.变量和函数,在vs和fs中可直接使用. 内置uniform 内置uniform主要置于AutomaticUniforms类里面,该类私有未开放文档. czm_backgr ...
- GLSL语言内置的变量详解
GLSL语言内置的变量,包括内置的顶点属性(attribute).一致变量(uniform).易变变量(varying)以及常量(const),一方面加深印象,另一方面今天的文章可以为以后的编程做查询 ...
- Flask内置URL变量转换器
Flask内置URL变量转换器: 转换器通过特定的规则执行,”<转换器: 变量名>”.<int: year>把year的值转换为证书,因此我们可以在视图函数中直接对year变量 ...
- unity, 查看内置shader源码
1,建一个球体. 2,建一个材质,将材质拖到球体上. 3,在材质的shader下拉列表中选择想查看的内置shader,点材质栏右上设置按钮->Select Shader 进入shader面板. ...
- shell里的IFS内置环境变量
IFS 的全称是 Interal Field Separator ,即“内部区域分隔符”,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space character),制表 ...
- unity 内置shader
几个有用的Unity 内置shader: (一)Standard RenderingMode:Opaque为实体渲染,更改Color的透明通道不会有影响:Cutout会把图片的透明通道显示出来,非严格 ...
- Unity内置shader 下载
Unity内置shader 4.3.1 版本的 其他版本可以自己修改名称 下载地址 http://download.unity3d.com/download_unity/builtin_shade ...
- Jenkins内置环境变量的使用
一.查看Jenkins有哪些环境变量 1.新建任意一个job 2.增加构建步骤:Execute shell 或 Execute Windows batch command 3.点击输入框下方的“可用环 ...
随机推荐
- Python 字典的操作
#-*- coding:utf-8 -*- people = {"name":"jack","age":18,"addr" ...
- 自然语言交流系统 phxnet团队 创新实训 个人博客 (十一)
名思义是 给游戏场景 添加一个 天空背景 让游戏更加精美,更具有魅力 添加天空盒 有两种方式 1 : 在当前相机上添加skybox 2 : 在当前场景上添加skybox 上面的两种方式的结果是一 ...
- 使用 pv 命令监控 linux 命令的执行进度
如果你是一个 linux 系统管理员,那么毫无疑问你必须花费大量的工作时间在命令行上:安装和卸载软件,监视系统状态,复制.移动.删除文件,查错,等等.很多时候都是你输入一个命令,然后等待很长时间直到执 ...
- 你对linux了解多少,Linux 系统结构详解!
最近一直有人在请教老K关于Linux系统相关问题,这里我就该问题做个详解,Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序. 内核.shell和文件系统一起形成了基本的操作系统结 ...
- Apple iOS MDM service 简介
Apple iOS MDM service 簡介 藉由MDM服務,企業可以用來控管配發給員工的iOS Device.可以採用Apple官方推出的工具,也可以採用第三方開發的服務. MDM server ...
- hdu 2771(uva 12171) Sculpture bfs+离散化
题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处 ...
- C# 从类库中获取资源图片,把图片资源保存到类库中
/// <summary> /// 获取资源图片 /// </summary> public class AssemblyHelper { #region 常量 /// < ...
- 面向切面编程(AOP)简介
在软件中,有些行为对于大多数应用都是通用的.日志,安全和事务管理几乎是所有软件都需要的.他们是否可以主动的参与呢,如果让应用程序只关注与自己所针对的业务领域问题,而其他的问题有其他应用对象来处理.是否 ...
- Java多线程——可阻塞的队列BlockingQueue
阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量. ArrayBlockingQueue 只有put方法和ta ...
- 史上最全的 Sublime Text 汉化、插件安装合集
0.前言 本文用于给新手小白用户指明前进方向.不用做商业推广. 其次,鼓舞购买正版.拒绝盗版. 好了.口号喊完,接下来就直接開始正文. 1. Sublime Text 介绍 首先在開始前,先来介绍一下 ...