名称
glUniform - 指定当前程序对象的统一变量的值
C规范
void glUniform1f( GLint location, GLfloat v0);
void glUniform2f( GLint location, GLfloat v0, GLfloat v1);
void glUniform3f( GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
void glUniform4f( GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
void glUniform1i( GLint location, GLint v0);
void glUniform2i( GLint location,GLint v0,GLint v1);
void glUniform3i( GLint location,GLint v0,GLint v1,GLint v2);
void glUniform4i( GLint location,GLint v0,GLint v1,GLint v2,GLint v3);
void glUniform1fv( GLint location,GLsizei count,const GLfloat *value);
void glUniform2fv( GLint location,GLsizei count,const GLfloat *value);
void glUniform3fv( GLint location,GLsizei count,const GLfloat *value);
void glUniform4fv( GLint location,GLsizei count,const GLfloat *value);
void glUniform1iv( GLint location,GLsizei count,const GLint *value);
void glUniform2iv( GLint location,GLsizei count,const GLint *value);
void glUniform3iv( GLint location, GLsizei count, const GLint *value);
void glUniform4iv( GLint location, GLsizei count, const GLint *value);
void glUniformMatrix2fv( GLint location,GLsizei countM,GLboolean transpose,const GLfloat *valueM);
void glUniformMatrix3fv( GLint location,GLsizei countM,GLboolean transpose,const GLfloat *valueM);
void glUniformMatrix4fv( GLint location,GLsizei countM,GLboolean transpose, const GLfloat *valueM);
参数
location
指定要修改的统一变量的位置。
v0,v1,v2,v3
指定要用于指定统一变量的新值。
count
指定要修改的元素数。 如果目标统一变量不是数组,则此值应为1;如果是数组,则应为1或更大。
value
指定指向将用于更新指定统一变量的count值数组的指针。
countM
指定要修改的矩阵数。 如果目标统一变量不是矩阵数组,则该值应为1;如果是矩阵数组,则应为1或更大。
transpose
指定在将值加载到统一变量时是否转置矩阵。 必须是GL_FALSE。
valueM
指定指向将用于更新指定统一变量的countM值数组的指针。
描述
glUniform修改统一变量或统一变量数组的值。要被修改值的location是由glGetUniformLocation返回的值。glUniform通过调用glUseProgram对程序对象进行操作,该程序对象是当前状态的一部分。
命令glUniform {1 | 2 | 3 | 4} {f | i}用于使用作为参数传递的值来更改由location指定的统一变量的值。命令中指定的数字应该与指定的统一变量的数据类型中的组件数相匹配(例如,1表示float,int,bool; 2表示vec2,ivec2,bvec2等)。后缀f表示正在传递浮点值;后缀i表示正在传递整数值,并且此类型还应与指定的统一变量的数据类型匹配。应使用此函数的i变体为定义为int,ivec2,ivec3,ivec4或这些变量的数组提供统一变量的值。f变量应该用于为float,vec2,vec3,vec4或这些类型的数组的统一变量提供值。 i或f变体可用于为bool,bvec2,bvec3,bvec4或这些的数组的均匀变量提供值。如果输入值为0或0.0f,则uniform变量将设置为false,否则将设置为true。
程序对象成功链接时,程序对象中定义的所有活动统一变量都初始化为0。它们保留通过调用glUniform分配给它们的值,直到程序对象上的下一个成功链接操作再次初始化为0时为止。
命令glUniform {1 | 2 | 3 | 4} {f | i} v可用于修改单个统一变量或统一变量数组。这些命令将个数和指针传递给要加载到统一变量或统一变量数组中的值。如果修改单个统一变量的值,则应使用1的计数,并且可以使用1或更大的计数来修改整个数组或数组的一部分。当从均匀变量数组中的任意位置m开始加载n个元素时,数组中的元素m + n-1将被替换为新值。如果m + n - 1大于统一变量数组的大小,则将忽略超出数组末尾的所有数组元素的值。命令名称中指定的数字表示每个元素的值的组件数,它应该与指定的统一变量的数据类型中的组件数相匹配(例如,1表示float,int,bool; 2表示vec2,ivec2,bvec2等)。命令名称中指定的数据类型必须与指定的统一变量的数据类型匹配,如前面对glUniform {1 | 2 | 3 | 4} {f | i}所述。
对于统一变量数组,数组的每个元素都被认为是命令名称中指示的类型(例如,glUniform3f或glUniform3fv可用于加载vec3类型的统一变量数组)。要修改的统一变量数组的元素数由count指定
命令glUniformMatrix {2 | 3 | 4} fv用于修改矩阵或矩阵数组。命令名称中的数字被解释为矩阵的维度。数字2表示2×2矩阵(即4个值),数字3表示3×3矩阵(即9个值),数字4表示4×4矩阵(即16个值)。假设每个矩阵按列主要顺序提供。 countM参数表示要传递的矩阵数。如果修改单个矩阵的值,则应使用计数1,并且可以使用大于1的计数来修改矩阵数组.
注意
glUniform1i和glUniform1iv是唯一可用于加载定义为采样器类型的统一变量的两个函数。使用任何其他函数加载采样器将导致GL_INVALID_OPERATION错误。
如果count\countM大于1且指示的统一变量不是数组,则会生成GL_INVALID_OPERATION错误,并且指定的统一变量将保持不变。
除了前面的异常之外,如果着色器中定义的统一变量的类型和大小与用于加载其值的命令名称中指定的类型和大小不匹配,则将生成GL_INVALID_OPERATION错误并生成指定的统一变量将保持不变。
如果location是一个非-1的值,并且它不表示当前程序对象中的有效统一变量位置,则将生成错误,并且不会对当前程序对象的统一变量存储进行任何更改。如果location等于-1,则将默认忽略传入的数据,并且不会更改指定的统一变量。
错误
GL_INVALID_OPERATION:没有当前程序对象
GL_INVALID_OPERATION:着色器中声明的统一变量的大小与glUniform命令指示的大小不匹配
GL_INVALID_OPERATION :如果此函数的整数变量之一用于加载float,vec2,vec3,vec4或其数组的统一变量,或者如果使用此函数的某个浮点变量来加载统一int,ivec2,ivec3或ivec4类型的变量,或者这些变量的数组。
GL_INVALID_VALUE:count<0
GL_INVALID_VALUE:transpose不是GL_FALSE
GL_INVALID_OPERATION:count大于1且指示的统一变量不是数组变量
GL_INVALID_OPERATION:使用glUniform1i和glUniform1iv之外的命令加载采样器
相关Gets
glGet 参数GL_CURRENT_PROGRAM
glGetActiveUniform 带有程序对象的句柄和活动的统一变量的索引
glGetUniform 程序对象的句柄和统一变量的位置
glGetUniformLocation 包含程序对象的句柄和统一变量的名称
另见
版权
https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glUniform.xml
https://blog.csdn.net/flycatdeng
Copyright © 1991-2006 Silicon Graphics, Inc.本文档的许可是根据SGI Free Software B License.详见http://oss.sgi.com/projects/FreeB/.