glsl是什么就不多说了。这里只介绍一下glsl中一些限定符。

  glsl中包含两类具有定义性质的符号,一类是和c++中定义变量的一样的符号,用来说明存放数据的类型,如float,int,bool。还有一类是的功能类似于c++中的private,protect,public,是用来说明变量被访问的方式,glsl中常用的限定符包含三个,uniform,attribute 以及 varying,称为限定符(还有一个const,就不多说了)。

uniform限定了该变量是随着图元变化而变化的,也就是说在一个图元被光栅化过程中是不会变的。

  attribute限定了该变量是随着顶点变化而变化的,如,一个三角形图元,三个顶点的都可以绑定不同的attribute属性,但是三个顶点只能使用一个uniform属性。

  其中,attribute只能在 vertex shader中使用,而不能在 fragment shader中使用。uniform能在两种类型的shader中使用。但是,着两种限定符修饰的变量都是只读,不可写的。

  varying变量比较特殊了,这个限定符号修饰的变量作用主要是在vertex shader 和 fragment shader 之间进行传输数据的,在vertex shader中是读写都没有问题,但是在fragment  shader中只读不可写。并且,在从vertex shader到 fragment shader之间,要被固定流水线进行插值(个人感觉是在光栅化阶段进行插值的),并且插值方式采用的是透视校正方式完成的(和透视纹理映射一样),而不是线性插值。所以,varying变量不但被vertex shader改变,而且被固定流水线改变。

可以看出来,三种限定符从图元角度来看是越来越精细的,uniform是对整个图元(面片)而言,attribute是对图元(面片)上的几个关键点而言,varying则精细到了图元(面片)中的任何一个点。同时,在glsl中也使用上述三种限定符定义了一些内置的变量,免去了很多麻烦。

这里提一下,在glsl中定义了两个gl_color变量,一个是attribute修饰,只在vertex shader中使用,只读。还有一个是varying修饰的,但是只在fragment shader中使用,所以不冲突,并且varying修饰的gl_color是由gl_frontColor 和gl_backColor自动转变的,而gl_frontColor 和gl_backColor又是由attribut gl_color自动转化的。(http://blog.sina.com.cn/s/blog_41630e7e01008uu6.html)

对于opengl和glsl的交互中,要设定uniform的值,要在调用gluseprogram以后才可以设定,但是在编译链接glsl程序以后就可以开始获得uniform类型变量的地址了。

 

struct gl_LightSourceParameters
{
vec4 ambient;
vec4 diffuse;
vec4 specular;
vec4 position;
...
}; uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];

上面时glsl中对光源的内置定义,其中,光源的方向是在摄像机坐标系下定义的,如果从世界坐标系到摄像机坐标系转化矩阵的左上角3x3矩阵是正交矩阵,例如使用glulookat设置,则光源的方向已经被opengl归一化了,否则还要手动归一化。

关于GLSL中语法和调用规则的一些记录的更多相关文章

  1. 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法

    一.前期基础储备笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器( ...

  2. Struts2中Action对象的set方法和get方法调用规则

    Struts的Action是采用的是多实例多线程设计,而不是像Servlet那样采用单实例多线程设计,因此在struts中,一个请求就对应一个Action对象,个对象之间的数据相互之间互不干扰.没接到 ...

  3. JavaScript中的尾调用优化

    文章来源自:http://www.zhufengpeixun.com/qianduanjishuziliao/javaScriptzhuanti/2017-08-08/768.html JavaScr ...

  4. C++中的默认参数规则

    C++中的默认参数规则 C++的默认参数规则其实是一个非常容易掉坑的规则,尤其是当一个函数拥有多个声明的时候,每个声明的默认参数可以各不相同,在调用时又可能与每个声明都不同:这篇博客稍微列举一下C++ ...

  5. 在C语言中函数及其调用过程

    目录 函数 C语言中的变参函数 函数的本质是什么 内存区域的区分技巧 函数的调用过程 栈帧的概念 调用过程细节 按照约定传参 函数 如果一个函数有声明没实现,那么就会出现链接错误: 以上代码会出现链接 ...

  6. JavaScript 中的尾调用

    尾调用(Tail Call) 尾调用是函数式编程里比较重要的一个概念,它的意思是在函数的执行过程中,如果最后一个动作是一个函数的调用,即这个调用的返回值被当前函数直接返回,则称为尾调用,如下所示: f ...

  7. java中包命名常见规则

    做java的都知道java的包.类.接口.枚举.方法.常量.变量等等模型都有一套约定的命名规则! 学习每一种语言都应该学习对应语法和命名规则,以保持一个良好的编码风格.一来显示自己的专业.二来方便阅读 ...

  8. 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)

    中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ...

  9. java 中使用ajax调用后台方法注意事项

    java 中使用ajax调用后台方法注意事项,后台方法一定要加@ResponseBody jQuery.validator.addMethod("checkRuleName",fu ...

随机推荐

  1. goaccess nginx日志分析工具简单使用

    goaccess 是一个比较方便的支持实时的日志分析工具,比较方便,同时安装&&配置简单 安装 centos yum yum install -y goaccess 运行 我的ngin ...

  2. deno学习二 基本代码

    deno 介绍是安全的ts 运行时 简单的代码 使用js(app.js) console.log("demoapp") 输出 dalongdemo 使用ts(app.ts) con ...

  3. 【python】 使用 setuptools

    不会安装python的egg文件,在网上搜索了一下,被“蟒蛇蛋”这个词雷到了,记录下. 随着对python的逐渐使用,发现一些python组件是用一个包管理器发布的,今天搞了快一个小时,终于搞定了,这 ...

  4. Cacti不出图

    http://os.51cto.com/art/201404/434915.htmhttp://os.51cto.com/art/201109/289306.htmhttp://freeloda.bl ...

  5. 02 - Unit03:注册功能实现

    注册功能实现 发送Ajax请求 服务器处理 Ajax回调处理 发送Ajax请求 绑定事件: "注册"按钮的单击事件 获取参数: 用户名/密码/昵称 请求地址: /user/regi ...

  6. Tomcat服务器学习和使用(二)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  7. app添加引导页

    1.设置guide.html 2.登陆或者主页面引用guide.html mui.plusReady(function() { //读取本地存储,检查是否为首次启动 决定是否显示引导页 var sho ...

  8. LR-IE录制设置

    ie浏览器去掉启用第三方浏览器扩展,路径. ie浏览器-工具-internet选项-高级,在列表中找到“启用第三方浏览器扩展” 把钩去掉 .   启动loadrunner11,按键盘F4,在brows ...

  9. Java之MD5加密

    一.Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.Riv ...

  10. PY安装模块

    Python安装失败原因 0环境 , pip版本一般为 7.x , 所以一般需要先升级pip版本 , 也就是执行 ```shellpython -m pip install --upgrade pip ...