OpenGL ES着色器语言----------------储存修饰符

Posted ziyo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL ES着色器语言----------------储存修饰符相关的知识,希望对你有一定的参考价值。

一、存储修饰符

技术分享图片

  本地变量只能使用存储修饰符const

  函数参数只能用const。函数返回值类型和结构体字段不要使用const。

       从一个运行时着色器到下一个运行时着色器之间进行数据类型通信是不存在的。这阻止了同一个着色器在多个顶点和片元之间同时执行。

       没有存储修饰符或仅仅使用const修饰符的全局变量,可能在main()执行前进行初始化。Uniforms, attributes和varyings可能没有初始化器。

1、默认存储修饰符

        如果在全局变量前没有修饰符,那么它们就与应用程序和其他处理器上的着色器没有关联。

  对于全局或本地的无修饰符变量,声明都会在其所属的那个处理器上分配内存。这个变量将提供对分配的内存的读写访问。

 

2、常量修饰符       

   命名的编译时常量可以用const声明。任何使用const声明的变量在其所属的着色器中均是只读的。

  const可以用来修饰任何基本数据类型。通常const变量在声明的同时要进行初始化:      

      const vec3 zAxis = vec3 (0.0, 0.0, 1.0);

       

   结构体字段不能使用const修饰,但是变量可以,并通过构造器进行初始化。包含数组的数组和结构体不能声明为常量,因为它们不能被初始化。

3、Attribute

  attribute修饰符用于声明通过OpenGL ES应用程序传递到顶点着色器中的变量值。在其它任何非顶点着色器的着色器中声明attribute变量是错误的

  在顶点着色器被程序使用之前,attribute变量是只读的。

  attribute变量的值通过OpenGL ES顶点API或者作为顶点数组的一部分被传进顶点着色器。它们传递顶点属性值到顶点着色器,并且在每一个运行的顶点着色器中都会改变。

  attribute修饰符只能修饰float, vec2, vec3, vec4,mat2,mat3,mat4。attribute变量不能声明为数组或结构体。如:

               attribute vec4 position;

               attribute vec3 normal;

               attribute vec2 texCoord;

  

  大家可能希望图形硬件有极少量的固定位置来传递顶点属性。

  所以,OpenGL ES为每一个非矩阵变量赋予了升级到4个浮点数值的空间,如vec4。

  在OpenGL ES中,可以使用的属性变量个数是有限制的,如果超过这个限制,将会引起链接错误。(声明了但没有使用的属性变量不会受到这个限制。)

  一个浮点数属性也要受到这个限制,所以你应该尽量将四个毫不相关的float变量打包成一个pack,以优化底层硬件的兼容性。

  一个mat4和使用4个vec4变量是一致的,同理,一个mat3和使用3个vec3变量是一致的,一个mat2和使用2个vec2变量是一致的。

  着色语言和API隐藏了到底这些空间是如何被矩阵使用的。属性变量需要被声明为全局变量。

4、Uniform

  uniform修饰符用来修饰那些在整个图元被处理的过程中保持不变的全局变量。

  所有的uniform变量都是只读的,可以通过应用程序调用API命令初始化,或者通过OpenGL ES间接初始化。

    uniform vec4 lightPosition; 

  uniform修饰符可以和任意基本数据类型一起使用,或者包含基本数据类型元素的数组和结构体。

  每种类型的着色器的uniform变量的存储数量是有限制的,如果超过这个限制,将会引起编译时或链接时错误。

  声明了但是没有被静态使用的uniform变量不会受到这个限制。

  静态使用(static use)是指着色器包含变量在预处理以后的一个引用。用户定义的uniform变量和着色器中被静态使用的内建uniform变量将共同决定有没有超出可用uniform存储范围。
 

  当顶点着色器和片元着色器被链接到一起,它们将共享同一个名称空间。这就意味着,所有被连接到同一个可执行程序的着色器中的同名变量必须也同时具有相同的类型和精度。

4、Varying  

  varying变量提供了顶点着色器,片元着色器和二者通讯控制模块之间的接口。

  顶点着色器计算每个顶点的值(如颜色,纹理坐标等)并将它们写到varying变量中。

  

  通过定义,每个顶点的varying变量以一种透视校正的方式被插入到正在渲染的图元上。如果是单采样,插值为片元中心。如果是多采样,插值可以是像素中的任何地方,包括片元中心或者其中一个片元采样。

   片元着色器会读取varying变量的值,并且被读取的值将会作为插值器,作为图元中片元位置的一个功能信息。varying变量对于片元着色器来说是只读的

        在顶点和片元着色器中都有声明的同名varying变量的类型必须匹配,否则将引起链接错误。

  下表总结了顶点和片元着色器匹配的规则:

  技术分享图片

       术语“静态使用”意思是在预处理之后,着色器至少包含一个访问varying变量的语句,即使这个语句没有真正执行过。

       varying vec3 normal;

         varying修饰符只能用在float, vec2, vec3, vec4, mat2, mat3, mat4和包含这些类型元素的数组上,不能用于修饰结构体。

         varying变量需要声明为全局变量。

 

 


---------------------整理自南极娃娃鱼文章,来源如下

作者:南极娃娃鱼
来源:CSDN
原文:https://blog.csdn.net/wangyuchun_799/article/details/7744620?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

 












以上是关于OpenGL ES着色器语言----------------储存修饰符的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)

OpenGL ES着色语言-光照效果之散射光

OpenGL ES着色语言-光照效果之散射光

OpenGL ES着色语言-光照效果之散射光

如何在OpenGL ES着色器中实现Catmull Clark细分算法