本篇文章主要梳理下OpenGL几种变量的区别。
下面是一段顶点、片段着色器代码:
1 | private final String vertexShaderCode = |
统一变量uniform
统一变量相当于应用程序传递给着色器(vertex、fragment)的只读值,即常量。
uniform一般用来表示变换矩阵、照明参数、颜色等,比如
1 | uniform mat4 viewProjMatrix; // 投影观察矩阵 |
统一变量的命名空间在顶点着色器和片段着色器中是共享的。也就是说,如果顶点和片段着色器一起链接到一个程序对象,它们就会共享同一组统一变量,前提是要求uniform变量在vertex和fragment两者之间声明方式完全一样。
程序中一般通过glUniform*()给统一变量赋值。比如开头示例代码中,顶点着色器的vMatrix:
1 | // 找到变量索引 |
属性attribute
attribute变量只能用在顶点着色器中,不能再片段着色器中声明或使用。
attribute一般用来表示顶点相关的数据,比如顶点坐标、顶点法线、纹理坐标、顶点颜色等。
程序中一般用glGetAttribLocation、glBindAttribLocation等获取attribute变量的索引,再用glVertexAttribPointer给变量赋值。比如开头示例中顶点着色器中的vPosition:
1 | // 获取变量索引 |
变量varying
varying变量一般用于顶点着色器和片段着色器之间数据传递。一般在顶点着色器中对varying变量赋值,片段着色器中使用该变量。
varying变量的声明在顶点着色器和片段着色器中必须一致。且varying变量的赋值一般是通过一个attribute变量对齐赋值,比如示例代码中的vColor。
1 | "varying vec4 vColor;"+ |