关于GLSL中语法和调用规则的一些记录
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中语法和调用规则的一些记录的更多相关文章
- 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法
一.前期基础储备笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器( ...
- Struts2中Action对象的set方法和get方法调用规则
Struts的Action是采用的是多实例多线程设计,而不是像Servlet那样采用单实例多线程设计,因此在struts中,一个请求就对应一个Action对象,个对象之间的数据相互之间互不干扰.没接到 ...
- JavaScript中的尾调用优化
文章来源自:http://www.zhufengpeixun.com/qianduanjishuziliao/javaScriptzhuanti/2017-08-08/768.html JavaScr ...
- C++中的默认参数规则
C++中的默认参数规则 C++的默认参数规则其实是一个非常容易掉坑的规则,尤其是当一个函数拥有多个声明的时候,每个声明的默认参数可以各不相同,在调用时又可能与每个声明都不同:这篇博客稍微列举一下C++ ...
- 在C语言中函数及其调用过程
目录 函数 C语言中的变参函数 函数的本质是什么 内存区域的区分技巧 函数的调用过程 栈帧的概念 调用过程细节 按照约定传参 函数 如果一个函数有声明没实现,那么就会出现链接错误: 以上代码会出现链接 ...
- JavaScript 中的尾调用
尾调用(Tail Call) 尾调用是函数式编程里比较重要的一个概念,它的意思是在函数的执行过程中,如果最后一个动作是一个函数的调用,即这个调用的返回值被当前函数直接返回,则称为尾调用,如下所示: f ...
- java中包命名常见规则
做java的都知道java的包.类.接口.枚举.方法.常量.变量等等模型都有一套约定的命名规则! 学习每一种语言都应该学习对应语法和命名规则,以保持一个良好的编码风格.一来显示自己的专业.二来方便阅读 ...
- 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ...
- java 中使用ajax调用后台方法注意事项
java 中使用ajax调用后台方法注意事项,后台方法一定要加@ResponseBody jQuery.validator.addMethod("checkRuleName",fu ...
随机推荐
- stacks and queues--codility
lesson 7: stacks and queues 1. Nesting 2. StoneWall 3. Brackets 4. Finsh lesson 7: stacks and queues ...
- python2用pip进行安装时报错Fatal error in launcher: Unable to create process using '"'
win7下python3和python2共存环境 用pip安装一个包执行pip2 install xxx的时候报错Fatal error in launcher: Unable to create p ...
- SpringCloud初体验:前言
体验了一天 SpringCloud 后发现,人们所讲的微服务架构不是一门技术,而是一种风格. 感觉确实可以这么认同,因为一套 SpringCloud 玩下来(未深入.未完整「链路追踪.动态刷新配置…… ...
- Python download a image (or a file)
http://stackoverflow.com/questions/13137817/how-to-download-image-using-requests import shutil impor ...
- node使用JsonWebToken 生成token,完成用户登录、登录检测
最近在用node做后台的登录,检测登录功能.在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因.原来,自己项目是前后端分离的,前端调 ...
- yaml语言教程
大家直接去看阮一峰的教程. http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt 简介 基本语法规则: 大小写敏感 使用缩进表示层级关系 缩进时不 ...
- Air test 基于屏幕比例实现滑动的方法
# -*- encoding=utf8 -*- __author__ = "chenshanju" __docs__ = "基于iOS类实现滑动" from a ...
- Appium使用ID进行定位
1 使用uiautomatorviewer地获取元素ID 路径:sdk\tools\uiautomatorviewer.bat 2 脚本中增加点击事件 driver.find_element_by ...
- pythonNetday06
进程 Process(target,name,args,kwargs) p.pid : 创建的新的进程的PID号 p.is_alive() 判断进程是否处于alive状态 p.daemon = Tru ...
- 八.jQuery源码解析之get()
理论上get是用来返回jQuery对象中部分或全部元素为数组的,但是转换为数组后, 数组中的单个元素又是一个一个dom元素.所以get还有另外一个功效,就是将jQuery对象转换成dom对象. 如果g ...