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变量的更多相关文章

  1. Unity 内置Shader变量、辅助函数等

    一:标准库里的常用.cginc文件 HLSLSupport.cginc - (automatically included) Helper macros and definitions for cro ...

  2. CESIUM内置shader变量和函数[转]

    cesium中内置了一些常量.变量和函数,在vs和fs中可直接使用. 内置uniform 内置uniform主要置于AutomaticUniforms类里面,该类私有未开放文档. czm_backgr ...

  3. GLSL语言内置的变量详解

    GLSL语言内置的变量,包括内置的顶点属性(attribute).一致变量(uniform).易变变量(varying)以及常量(const),一方面加深印象,另一方面今天的文章可以为以后的编程做查询 ...

  4. Flask内置URL变量转换器

    Flask内置URL变量转换器: 转换器通过特定的规则执行,”<转换器: 变量名>”.<int: year>把year的值转换为证书,因此我们可以在视图函数中直接对year变量 ...

  5. unity, 查看内置shader源码

    1,建一个球体. 2,建一个材质,将材质拖到球体上. 3,在材质的shader下拉列表中选择想查看的内置shader,点材质栏右上设置按钮->Select Shader 进入shader面板. ...

  6. shell里的IFS内置环境变量

    IFS 的全称是 Interal Field Separator ,即“内部区域分隔符”,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space character),制表 ...

  7. unity 内置shader

    几个有用的Unity 内置shader: (一)Standard RenderingMode:Opaque为实体渲染,更改Color的透明通道不会有影响:Cutout会把图片的透明通道显示出来,非严格 ...

  8. Unity内置shader 下载

    Unity内置shader  4.3.1 版本的  其他版本可以自己修改名称 下载地址 http://download.unity3d.com/download_unity/builtin_shade ...

  9. Jenkins内置环境变量的使用

    一.查看Jenkins有哪些环境变量 1.新建任意一个job 2.增加构建步骤:Execute shell 或 Execute Windows batch command 3.点击输入框下方的“可用环 ...

随机推荐

  1. 关于在ubuntu下配置AMD显卡驱动的总结

    同样先卸载先前版本 代码: sudo sh /usr/share/ati/fglrx-uninstall.sh 代码: sudo apt-get remove --purge fglrx fglrx_ ...

  2. 【转】Android下使用Properties文件保存程序设置

    原文:http://jerrysun.blog.51cto.com/745955/804789 废话不说,直接上代码.    读取.properties文件中的配置:  String strValue ...

  3. linux系统下的缺失 libstdc++.so.6: version’GLIBCXX_3.4.20’的问题:

    在linux下遇到了一个这样的问题,使用anaconda时,它的安装库里的文件被提示:缺失 libstdc++.so.6: version’GLIBCXX_3.4.20’.后来经过查看资料知道了原来是 ...

  4. 第三百二十六节,web爬虫,scrapy模块,解决重复ur——自动递归url

    第三百二十六节,web爬虫,scrapy模块,解决重复url——自动递归url 一般抓取过的url不重复抓取,那么就需要记录url,判断当前URL如果在记录里说明已经抓取过了,如果不存在说明没抓取过 ...

  5. IDEA VS 快捷键 大全

    [参考]IntelliJ IDEA 常用 黄金 快捷键  总结 不断更新     一.VS常用快捷键 (01).快速插入foreach.try等循环:Tab + Tab; (02).回到光标前一位置: ...

  6. centos 离线安装Ambari

    1.首先要下载它们的安装包,别尝试着在yum来下,特别慢,最好的方式是通过建立本地资源的方式来安装. http://public-repo-1.hortonworks.com/HDP/centos6/ ...

  7. Winform窗体控件自适应大小

    自己写的winform窗体自适应大小代码,代码比较独立,很适合贴来贴去不会对原有程序造成影响,可以直接继承此类或者把代码复制到自己的代码里面直接使用 借鉴了网上的一些资料,最后采用重写WndProc方 ...

  8. windows下用php实现svn代码更新

    windows下的服务器 没有登录权限,如何从svn更新代码 用php页面,实现更新代码 $cmd = '"C:\Program Files\TortoiseSVN\bin\Tortoise ...

  9. 代码记录——phase16,block32

    HRESULT RotateZoom(PBYTE pbSrc,int iWidth,int iHeight,double dbRotate,double dbZoom,PBYTE pbTag) { / ...

  10. YII创建应用

    创建第一个应用 打开cmd,切换到appserv的www目录下,输入: D:\AppServ\www>yii6\framework\yiic webapp D:wamp\www\mydemos