注:参考自bilibili系列视频,OpenGL 从入门到成魔-第6章- Uniform 变量的使用https://www.bilibili.com/video/BV1Mz411i7HQ
Uniform变量的作用
用于从cpu端,向顶点着色器和片段着色器转递变量。在cpu端,通过glUniform**()函数赋值。在shader内部,uniform就像常量,不能被shader修改。
如果uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用。(相当于一个被vertex和fragment shader共享的全局变量)
uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。
eg:
uniform mat4 viewProjMatrix; //投影+视图矩阵
uniform mat4 viewMatrix; //视图矩阵
uniform vec3 lightPosition; //光源位置
uniform float lumaThreshold;
uniform sampler2D SamplerY;
glUniform**() 函数
根据传递变量的类型及个数,该函数有不同的名字,如果传1个int类型,就调用glUniform1i(), 如果传2个float类型,就调用glUniform2f()。还可以传向量,矩阵等。
glUniform1i(glGetUniformLocation(program, name), value);
第一个参数是location,即变量的地址。用glGetUniformLocation来获取,第一个参数program(由多个shader组成),第二个参数,变量名
第二个参数要赋的值。
使用方法
- 在shader中声明uniform变量,并使用。
uniform float num;
void main()
{
gl_Position = vec4(num,num,num, 1.0);
}
- 在渲染前,给uniform变量赋值。
glUniform1f(glGetUniformLocation(program, "num"), 0.01);
延申 attribute变量和varying变量
attribute变量是只能在vertex shader中使用的变量。一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。
varying变量是vertex和fragment shader之间做数据传递用的。一般vertex shader修改varying变量的值,然后fragment shader使用该varying变量的值。因此varying变量在vertex和fragment shader二者之间的声明必须是一致的。
网友评论