GLES2.0中文API-glUniform

本文深入解析OpenGL中的统一变量,包括glUniform系列函数的使用方法,参数说明,以及注意事项。了解如何通过这些函数修改统一变量或统一变量数组的值,掌握OpenGL着色器编程的关键技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

名称

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}所述。

对于统一变量数组,数组的每个元素都被认为是命令名称中指示的类型(例如,glUniform3fglUniform3fv可用于加载vec3类型的统一变量数组)。要修改的统一变量数组的元素数由count指定

命令glUniformMatrix {2 | 3 | 4} fv用于修改矩阵或矩阵数组。命令名称中的数字被解释为矩阵的维度。数字2表示2×2矩阵(即4个值),数字3表示3×3矩阵(即9个值),数字4表示4×4矩阵(即16个值)。假设每个矩阵按列主要顺序提供。 countM参数表示要传递的矩阵数。如果修改单个矩阵的值,则应使用计数1,并且可以使用大于1的计数来修改矩阵数组.

注意

glUniform1iglUniform1iv是唯一可用于加载定义为采样器类型的统一变量的两个函数。使用任何其他函数加载采样器将导致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_VALUEcount<0

GL_INVALID_VALUEtranspose不是GL_FALSE

GL_INVALID_OPERATION:count大于1且指示的统一变量不是数组变量

GL_INVALID_OPERATION:使用glUniform1iglUniform1iv之外的命令加载采样器

相关Gets

glGet 参数GL_CURRENT_PROGRAM

glGetActiveUniform 带有程序对象的句柄和活动的统一变量的索引

glGetUniform 程序对象的句柄和统一变量的位置

glGetUniformLocation 包含程序对象的句柄和统一变量的名称

另见

glLinkProgramglUseProgram

版权

https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glUniform.xml

https://blog.youkuaiyun.com/flycatdeng

Copyright © 1991-2006 Silicon Graphics, Inc.本文档的许可是根据SGI Free Software B License.详见http://oss.sgi.com/projects/FreeB/.

Android,OpenGL ES,图形学
### 如何在 OpenGL 中使用 `glUniform` 函数传递 vec3 类型的数据 为了向着色器程序中的 uniform 变量传递 vec3 数据,在 C++ 或其他支持的语言中通常会按照如下方式操作: #### 设置 Uniform 变量的位置 首先,需要获得uniform变量位置。这一步骤一般是在初始化阶段完成。 ```cpp // 假设 shaderProgram 是已编译链接好的着色器程序对象 GLuint programId = shaderProgram; GLint location = glGetUniformLocation(programId, "myVec3Variable"); ``` 此处 `"myVec3Variable"` 应替换为实际的 uniform 名称[^1]。 #### 定义并设置 vec3 的值 接着定义要传入的具体数值,并调用适当版本的 glUniform* 方法来更新该 uniform 变量。 ```cpp GLfloat myVector[] = { 0.5f, 0.75f, 1.0f }; // 创建一个代表RGB颜色或空间坐标的vec3数组 glUseProgram(programId); // 使用指定的着色器程序 glUniform3fv(location, 1, myVector); // 将vec3数据发送给GPU上的uniform变量 ``` 这里使用的是 `glUniform3fv()` 函数,它接受三个参数:第一个是要修改的 uniform 变量的位置;第二个是指定有多少个这样的矢量(对于单个 vec3 来说总是 1);第三个则是指向包含这些浮点数的实际指针[^2]。 注意,当处理不同的数据类型时,应该选用合适的 glUniform 版本,比如 `glUniform3i` 对于整数类型的 vec3,而 `glUniform3ui` 则适用于无符号整数类型的 vec3。 此外,如果希望直接从 glm 库或其他数学库创建的对象中读取数据,则可以直接将它们转换成适合的形式再传递过去。 #### 示例代码片段 下面给出一段完整的示例代码展示如何在一个简单的场景里应用上述过程: ```cpp #include <glm/glm.hpp> ... void setupShaderVariables(GLuint programId){ GLint loc_myVec3Var = glGetUniformLocation(programId, "myVec3Variable"); glm::vec3 color(0.8f, 0.9f, 0.6f); glUseProgram(programId); glUniform3fv(loc_myVec3Var , 1, &color[0]); } ``` 此段代码展示了如何利用 GLM 数学库简化工作流程的同时保持良好的可读性和效率[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值