限定符赋给变量特殊的含义:
const-- 用于声明非可写的编译时常量变量
attribute-- 用于经常更改的信息,只可以在顶点着色器中使用
uniform-- 用于不经常更改的信息,用于顶点着色器和片元着色器
varying-- 用于从顶点着色器传递到片元着色器的插值信息
GLSL内建变量
Vertex Shader的输出数据时使用的内置变量:
vec4 gl_posotion; 用来设置顶点转换到屏幕坐标的位置,Vertex Shader一定要去更新这个数值
float gl_pointSize; 是启动PointSprite功能时,用来设置矩形大小的数值
vec4 gl_ClipVertex; 如果启用了Clip Plane功能,gl_ClipVertex可以放入用来与Clip Plane平面做测试用的位置
Fragment Shader的内置输出变量:
vec4 gl_FragColor; 代表画面所要填入的颜色
vec4 gl_FragData[gl_MaxDrawBuffers]; 用来填入画面的颜色,用在启用多个FrameBuffer时,调用gl_FragData填入画面颜色
vec4 gl_FrData填入画面颜色
vec4 gl_FragDepth; 用来指定Z Buffer测试时所使用的Z值,这样就可以不通过顶点内插得到的Z值
GLSL
GLSL是严格的类型匹配,int和float不会默认互转;
着色语言定了三种级别的精度:lowp, mediump, highp。我们可以在 glsl 脚本文件的开头定义默认的精度。
precision mediump float;
注意,在片着色器,不会有默认的精度,所以如果没有上面这一句,会有编译错误哦;
OpenGL
写 OpenGL 代码时从前到后的顺序依次是:设定 viewport(视口变换),设定投影变换,设定视图变换,设定模型变换,在本地坐标空间描绘物体。而在前面为了便于理解做介绍时,说的顺序是OpenGL 中物体最初是在本地坐标空间中,然后转换到世界坐标空间,再到 camera 视图空间,再到投影空间。由于模型变换包括了本地空间变换到世界坐标空间,所以我们理解3D 变换是一个顺序,而真正写代码时则是以相反的顺序进行的,如果从左乘矩阵这点上去理解就很容易明白为什么会是反序的。
用数组表示 Matrix 又分为两种形式:行主序和列主序,它们在本质上是等价的,只不过是一个是右乘(行主序,矩阵放右边)和一个是左乘(列主序,矩阵放左边)。OpenGL 使用列主序矩阵,即列矩阵,因此我们总是倒过来算的(左乘矩阵,变换效果是按从右向左的顺序进行): 投影矩阵 × 视图矩阵 × 模型矩阵 × 3D位置。
glUniform2fv 参数的count 是glsl里面vec2 vecArr[3]的vecArr数组个数,不是vec2的数组个数。
1,glUniform4fv和glUniform4f的区别?
带v表示是vec,赋值的是基础是向量;
2,glUniform 无效?
先调用glUseProgram(myprogram),再调用glUniform;
对于没有调用过的变量,glGetUniformLocation返回值-1;(编译器优化)
学习的博客