你的位置:首页 > 操作系统

[操作系统]OpenGL ES 3.0之Uniform详解


  Uniform是变量类型的一种修饰符,是OpenGL ES  中被着色器中的常量值,使用存储各种着色器需要的数据,例如:转换矩阵、光照参数或者颜色。

  uniform 的空间被顶点着色器和片段着色器分享。也就是说顶点着色器和片段着色器被链接到一起进入项目,它们分享同样的uniform。因此一个在顶点着色器中声明的uniform,相当于在片段着色器中也声明过了。当应用程序装载uniform 时,它的值在顶点着色器和片段着色器都可用。在链接阶段,链接器将分配常量在项目里的实际地址,那个地址是被应用程序使用和加载的标识。

  另一个需要注意的是,uniform 被存储在硬件被称为常量存储,这是一种分配在硬件上的存储常量值的空间。因为这种存储需要的空间是固定的,在程序中这种uniform 的数量是受限的。这个限制能通过读gl_MaxVertexUniformVectors 和gl_MaxFragmentUniformVectors编译变量得出。( 或者用GL_MAX_VERTEX_UNIFORM_VECTORS 或GL_MAX_FRAGMENT_UNIFORM_ VECTORS 为参数调用glGetIntegerv)OpenGL ES 2.0必须至少提供256 个顶点着色器uniform 和224个片段着色器uniform。

  

  获取和设置Uniform

  在程序中使用glGetProgramiv函数,将GL_ACTIVE_UNIFORMS作为参数来查询Uniforms,可以获取程序中Uniform的数量,,如果常量处于active,说明它正在被程序使用。另外你可以只声明Uniform而不使用它,链接器将会优化掉这些Uniform,不将它存储到实际使用的常量列表中。你能使用GL_ACTIVE_UNIFORM_MAX_LENGTH 为参数调用glGetProgramiv,找出在程序里最大的常量列表名字(甚至是空的)。一旦我们知道实际使用的常量数目和描述的数目,我们可以使用glGetActiveUniform 和glGetActiveUniformsiv查找常量:

  

  

  

  使用glGetActiveUniform函数你可以确定Uniform几乎所有的属性。你可以通过它的类型来确定它的名称。另外如果变量是一个数组,你可以找出数组中的最大值。我们可以通过glGetUniformLocation函数来获取Uniform的位置,位置值是一个整型数据,用来标识Uniform在程序中的位置。注意:不在uniform 块中指定位置。这个位置值用于后面函数使用这个Uniform。

  

  glGetUniformLocation将根据Uniform名称获取Uniform的位置,通过下列函数根据位置来装载uniform

  

  

  

  装载uniforms函数大部分是自动完成的。使用哪个函数装载uniforms取决于glGetActiveUniform函数返回的类型。例如类型如果是GL_FLOAT_VEC4,glUniform4f 或glUniform4fv 被使用。如果返回的类型大于一个,glUniform4fv 将被使用一次装载整个数组。如果uniform不是一个数组类型,glUniform4f 或glUniform4fv 被使用。一个值得注意的地方是glUniform*调用不使用程序对象句柄做参数。原因是因为glUniform*调用总是在当前的程序中绑定glUseProgram 执行。uniform值在程序对象中总是保持一致。也就是说,一旦你在项目里设定一个uniform值,这个值将保持不变,甚至你激活另一个程序。

  

GLint maxUniformLen;GLint numUniforms;char *uniformName;GLint index;glGetProgramiv ( progObj, GL_ACTIVE_UNIFORMS, &numUniforms );glGetProgramiv ( progObj, GL_ACTIVE_UNIFORM_MAX_LENGTH,&maxUniformLen );uniformName = malloc ( sizeof ( char ) * maxUniformLen );for ( index = 0; index < numUniforms; index++ ){  GLint size;  GLenum type;  GLint location;  // Get the uniform info  glGetActiveUniform ( progObj, index, maxUniformLen, NULL,  &size, &type, uniformName );  // Get the uniform location  location = glGetUniformLocation ( progObj, uniformName );  switch ( type )  {    case GL_FLOAT:    //    break;    case GL_FLOAT_VEC2:    //    break;    case GL_FLOAT_VEC3:    //    break;    case GL_FLOAT_VEC4:    //    break;    case GL_INT:    //    break;    // ... Check for all the types ...
    default:
    // Unknown type
    break;
  }
}

 

 

 

  




河南旅游攻略大全河南旅游攻略自助游河南旅游报价价格河南旅游景点推荐河南旅游团报价2015世界睡眠日是哪天 2015年元旦促销主题词大全 2015年中秋节是哪天?什么时候?中秋节来历介绍 2015上海外滩跨年4D灯光秀活动 2015开平立园三八妇女节女士免费吗?广东开平立园3.8女士优惠价格? 正月十五闹花灯 元宵节安徽游玩好去处 2015马降龙碉楼三八妇女节门票免费吗?开平马降龙碉楼3.8女士优惠价格? 2015赤坎古镇三八妇女节女士免费吗?开平赤坎影视城3.8女士门票优惠活动? 听说清远佛冈森波拉有八大奇景,请问是什么? 清远宝晶宫门票是多少? 东莞龙凤山庄怎么样?在哪里拍婚纱照漂亮吗? 东莞龙凤山庄有哪些娱乐项目? 阳山广东第一峰好玩不?广东第一峰旅游风景区团购价格? 九龙湖度假村团购票价?肇庆九龙湖度假村要门票吗? 肇庆九龙湖度假山庄介绍?九龙湖度假山庄有住宿吗? 鼎湖九龙湖酒店预订?九龙湖酒店多少钱一晚? MAX4521ESE+T Datasheet MAX4521ESE+T Datasheet MAX4521EUE+ Datasheet MAX4521EUE+ Datasheet DG200ADY+ Datasheet DG200ADY+ Datasheet 卡塔尔航空怎么样 卡塔尔航空怎么样 卡塔尔航空怎么样 深圳港澳通行证网上续签 深圳港澳通行证网上续签 深圳港澳通行证网上续签 九寨沟风景图片 九寨沟风景图片 九寨沟风景图片