5.opengl-变量修饰符
3.00上支持的存储变量修饰符
变量名称
|
作用
|
示例
|
const
|
编译过程常量,或者函数的只读参数
|
const vec3 zAxis = vec3 (0.0, 0.0, 1.0);
|
in
|
用于连接 shader 的上一阶段;
centroid 为质心采样关键字,用于避免伪像,不可用于顶点着色器;
顶点着色器中的 out 和片段着色器中的 in 名称相同时构成接口,必须具有相同的类型和精度;
|
in vec4 position;
centroid in vec2 TexCoord;
flat in vec3 myColor;
|
out
|
用于连接 shader 的下一阶段;
centroid 为质心采样关键字,用于避免伪像 ,不可用于顶点着色器;
顶点着色器中的 out 和片段着色器中的 in 名称相同时构成接口,必须具有相同的类型和精度;
|
out vec3 normal;
centroid out vec2 TexCoord;
invariant centroid out vec4 Color;
flat out vec3 myColor;
|
uniform
|
通过外部application程序传递给(vertex和fragment)shader的变量。
它通过application调用函数glUniform()函数赋值的。
uniform是全局的(Global),全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。
它不能被shader程序修改.(shader只能用,不能改,只能等外部程序重新重置或更新。)
uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。
|
uniform sampler2D tex; |
老版本中支持的存储变量修饰符
变量名称
|
作用
|
示例
|
const
|
编译过程常量,或者函数的只读参数
|
const vec3 zAxis = vec3 (0.0, 0.0, 1.0);
|
attribute(等于3.0版本后的in)
|
只能从客户端把数据传递到顶点着色器,也只能在顶点着色器里面使用(它不能在fragment shader中声明attribute变量,也不能被fragment shader中使用)。
一般用来修饰顶点数据、纹理坐标、颜色、法线,即一切和坐标、和颜色有关的数据。
在application中,一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数glVertexAttribPointer()为每个attribute变量赋值。
|
attribute vec4 position;
|
varying(3.0版本后,使用的是in和out代替,在顶点着色器声明out.在片段着色器中声明in,来实现传递)
|
用于连接顶点着色器和片段着色器,从顶点着色器向片段着色器传递变量。
一般vertex shader修改varying变量的值,然后fragment shader使用该varying变量的值。
因此varying变量在vertex和fragment shader二者之间的声明必须是一致的
(application不能使用此变量,该变量是可变化的)
|
varying vec3 normal;
|
uniform
|
通过外部application程序传递给(vertex和fragment)shader的变量。
它通过application调用函数glUniform()函数赋值的。
uniform是全局的(Global),全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。
它不能被shader程序修改.(shader只能用,不能改,只能等外部程序重新重置或更新。)
uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。
|
uniform sampler2D tex; |
变量gl_Position
它并没有类型in、out或是uniform的声明,而是直接使用,且在后面的程序中也未被引用。原来它是默认是归一化的裁剪空间坐标,xyz各个维度的范围为-1到1,仅能在顶点着色器中使用,既是输入也是输出。gl_Position赋值范围就是float的取值范围(32位),只不过只有[-1,1]区间的片元被绘制。它是vec4类型的,不能重声明为dvec4等类型。
变量gl_FragColor
控制输出的颜色(rgba),(在片段着色器中通过out的方式,在3.3版本之前,默认不需要out),如果你在片段着色器中没有定义输出颜色,OpenGL会把你的物体渲染为黑色(或白色)。
人间有真情,人间有真爱。