作用
数据类型也可以通过一些修饰符来改变自己的行为。
类型修饰符
attribute、uniform、varying、const 、in、out、inout、buffer、shared
以下详解:
attribute
一般用于每个顶点都各不相同的量,如:顶点位置,颜色等
作用:1.attribute限定符为属性限定符。
2.attribute修饰的变量用来 接收渲染管线 传递进 顶点着色器的 当前待处理定点的各种属性。这些属性值每个顶点各自拥有独立的副本,用于描述顶点的各项特征,如:顶点坐标、法向量、颜色、纹理坐标等。
3.attribute 只能用于顶点着色器中。
4.attribute只能来修饰浮点数 标量,浮点数向量,以及矩阵变量,不能用来修饰其他类型的变量。
案例:
attribute vec3 aPosition;//声明一个用attribute修饰的vec3类型的向量
uniform
作用:uniform为一致变量限定符
(一致变量指的是 对同一组顶点组成的单个3D物体中所有顶点都相同的量。)
1.uniform变量可以用在顶点着色器 或者 片元着色器中。
2.可以修饰所有的基本数据类,型
3.在顶点着色器 或者 片元着色器中 正确的使用方法 :
uniform mat4 uMVPMatrix; // 总变换矩阵
uniform mat4 uMMatrix; // 变换矩阵
uniform vec3 uLightLocation; // 光源位置
uniform vec3 uCamera; // 摄像机位置
4.怎么将一致变量的值从宿主语言(java语言)传递到渲染管线
// 总变化矩阵一致变量引用
int muMVPMatrixHandle;
// 获取着色器程序中总变换矩阵一致变量的引用
muMVPMartrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
// 通过一致变量引用将一致变量值传入渲染管线
GLES20.glUniformMatrix4fv(muMatrixHandle, 1, false, Triangle.getFianlMatrix(mMMatrix), 0);
好我们只用了三行代码 就将一致变量送入到渲染线管,
那这里的主要两个步骤:
1.获取着色器程序中一致变量的引用
2.调用glUniformMatrix4f()方法将一致变量送到渲染器
例子:(那接下来我们就写一个 NDK上 获取uniform变量的索引并且设置具体值的一个示例)
GLfloat timeValue;//程序运行时间
//【返回 着色器程序中uniform 变量 time对应的索引值(36页)】
GLint timeLoc =glGetUniformLocation(program,"time");
//设置与timeLoc索引位置对应的Uniform变量
glUniform1f(timeLoc,timeValue);
varying
作用:用于从顶点着色器传递到片元的量
(要想将顶点着色器的信息传道片元着色器中,则必须使用varying限定符。)
用varying限定符修饰的全局变量(又称为易变变量),易变变量是什么?易变变量我们可以看成是顶点着色器以及片元着色器之间的动态接口,它的作用就是:方便顶点着色器与片元着色器之间信息的专递
案例:
从这里大家也可以看出来,为什么GPU在图形处理上远远超过我们同时代、同档次CPU的原因 :因为CPU中没有这么多的并行硬件处理单元。
案例:
(在顶点着色器中声明varying易变变量)
verying vec4 ambient; //环境光易变变量
const
用const修饰的变量的值是不可变的,也就是我们说的常量,又叫编译时常量。
编译时常量,我们声明的时候必须要进行初始化。而且这些常量在着色器外部是完全不可见的。
(大家要知道一点,用const修饰的变量在编译时,编译器不需要给它分配任何运行时资源。
所以说在一定程度上 它提高了设备的运行速率,节约资源。)
1.如何在着色器中通过const声明常量
例如:
const float Pi=3.141592;
in
设置这个变量为着色器阶段的输入变量。
out
设置这个变量为着色器阶段的输出变量。
例如:
顶点作色器中输出变换后的齐次坐标,或者片元着色器中输出最终片元颜色
inout
用来修饰的参数为输出输入参数,具有输入输出两种参数功能