OpenGL ES之glUniform函数

来源:互联网 发布:托业模拟考试软件 编辑:程序博客网 时间:2024/06/06 01:24

了解更多IOS底层原理知识,关注腾讯课堂八点钟学院IOS高级开发 

 IOS学习交流群 431449751;


函数名:

glUniform

功能:

为当前程序对象指定Uniform变量的值。(译者注:注意,由于OpenGL ES由C语言编写,但是C语言不支持函数的重载,所以会有很多名字相同后缀不同的函数版本存在。其中函数名中包含数字(1、2、3、4)表示接受这个数字个用于更改uniform变量的值,i表示32位整形,f表示32位浮点型,ub表示8位无符号byte,ui表示32位无符号整形,v表示接受相应的指针类型。 )

函数原型:

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); 

参数列表:

location

指明要更改的uniform变量的位置

v0,v1,v2,v3

指明在指定的uniform变量中要使用的新值

函数原型:

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); 

参数列表:

location

指明要更改的uniform变量的位置

count

指明要更改的元素个数。如果目标uniform变量不是一个数组,那么这个值应该设为1;如果是数组,则应该设置为>=1。

vlaue

指定一个具有count个数值的数组指针,用来更新指定的uniform变量。

函数原型:

void glUniformMatrix2fv(GLint location,  GLsizei count,  GLboolean transpose,  const GLfloat *value); 

void glUniformMatrix3fv(GLint location,  GLsizei count,  GLboolean transpose,  const GLfloat *value); 

void glUniformMatrix4fv(GLint location,  GLsizei count,  GLboolean transpose,  const GLfloat *value); 

参数列表:

location

指明要更改的uniform变量的位置

count

指明要更改的矩阵个数

transpose

指明是否要转置矩阵,并将它作为uniform变量的值。必须为GL_FALSE。

value

指明一个指向count个元素的指针,用来更新指定的uniform变量。

描述:

glUniform更改一个uniform变量或数组的值。要更改的uniform变量的位置由location指定,location的值应该由glGetUniformLocation函数返回。通过调用glUseProgram,glUniform操作的程序对象将成为当前状态的一部分。

glUniform{1|2|3|4}{f|i}使用传进来的实参,修改通过location指定的uniform变量。

所有在程序对象中定义的活动uniform变量,在程序对象链接成功后都会被初始化为0.直到下一次程序对象链接成功再一次被初始化为0前,它们将保留通过调用glUniform赋给它们的值。

glUniform{1|2|3|4}{f|i}v可以用来更改单个uniform变量的值,或者一个uniform变量数组。

glUniformMatrix{2|3|4}fv用来更改一个矩阵或一个矩阵数组。

错误:

GL_INVALID_OPERATION 没有当前程序对象;着色器中的uniform变量的尺寸和glUniform中指明的尺寸不一致;glUniform的整形变体加载float类型的uniform变量,或者float类型的变体加载整形的uniform变量;location不是当前程序对象的有效uniform位置,并且location的值不等于-1;count的值大于1,但是指明的uniform变量不是一个数组;如果采样器不是调用glUniform1i 和glUniform1iv。

GL_INVALID_VALUE count小于0;transpose不是GL_FALSE。


关于GLSL编辑纹理的一些函数和说明

转载
  
GLSL的很多信息都是英文的,即使有中文资料大多都是照搬书或者是直接复制的官方SDK的Google解释。这里给出一些GLSL应用纹理的基础知识
首先是 glActiveTexture(GL_TEXTURE0+i);
glBindTexture(texTarget, texture[i]);
关于glActiveTexture这个函数,在多重纹理当中,最好让他的GL_TEXTUREi和实际纹理数组序号一致,因为一旦你在某个纹理上绑定了glActiveTexture,那么后面要取消掉就非常困难,反正我试了好多次都没有成功。
然后是 texLoc   = glGetUniformLocation(p2, "tex0");  //tex0用于在GLSL中定义采样器名称
glUniform1i(texLoc, 2);//texLoc在获得定位之后,被glUniform1i绑定至GLSL
这里的tex0和你GLSL中的tex0是对应的,如果你有多个纹理,可以将其命名为tex1,tex2..等等,只要保证和GLSL里面的一致就可以。但是如果你在多个FBO中用的话,显然tex12这样的命名会给你的GLSL编写带来烦恼,所以在每个shader program里面,你可以独立的指定。比方说在一个shader program0中的,你要把纹理0和纹理1处理下,那么把他们命名为tex0和tex1;接下来你要在shader program1中,处理纹理3和纹理4,那么也可以把他们也命名为tex0和tex1,和之前的不存在冲突,这个是实测的结果。这样的好处是,不用在编写某个GLSL的时候,还要记得自己用了多少个tex
至于glUniform1i,这个网上也很少有个人理解的解释。其实它是指定了一个一致性变量,具体的含义不说了,重点说说glUniform1i(texLoc, 2)中2的含义。官方SDK说是Specifies the new values to be used for the specified uniform variable.是什么意思呢?其实texLoc这个变量是可以复用的,多个纹理都可以用他作为location传入,但是不同的是,这个type必须保持不一致。你可以把他看成是第一个location,第二个location等等,如果type重复了,那就意味着纹理的入口位置被重叠了,所以在不太理解这个type的含义之前,保持它的递增
做完上面两个步骤,就可以进入GLSL函数编写了

0 0