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

摘要:
任何使用const声明的变量在其所属的着色器中均是只读的。attribute变量的值通过OpenGLES顶点API或者作为顶点数组的一部分被传进顶点着色器。所以,OpenGLES为每一个非矩阵变量赋予了升级到4个浮点数值的空间,如vec4。在OpenGLES中,可以使用的属性变量个数是有限制的,如果超过这个限制,将会引起链接错误。所有的uniform变量都是只读的,可以通过应用程序调用API命令初始化,或者通过OpenGLES间接初始化。

一、存储修饰符

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

本地变量只能使用存储修饰符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变量的类型必须匹配,否则将引起链接错误。

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

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

术语“静态使用”意思是在预处理之后,着色器至少包含一个访问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着色器语言----------------储存修饰符》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇分享公司DAO层动态SQL的一些封装Java泛型底层源码解析--ConcurrentHashMap(JDK1.6/JDK1.7/JDK1.8)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在Vue中使用了Swiper ,从后台获取动态数据后,swiper滑动失效

原因是因为Swiper提前初始化了,然而数据还没有加载完成。解决方法如下: 1、在Swiper初始化时 swiper0 = new Swiper('.w0', { initialSlide :0, observer:true,//修改swiper自己或子元素时,自动初始化swiper observeParents:true,//修改...

Node.js连接RabbitMQ,断线重连,动态绑定routing key

RabbitMQ官方提供的教程https://www.rabbitmq.com/tuto...,是基于回调的。 下面将给出基于Promise式的写法。并且实现动态的队列绑定 初始化配置 const amqp = require('amqplib') // rabbitMQ地址 const {amqpAddrHost} = require('../conf...

SAS | 使用SAS数据

目录 1 创建和重定义变量 2 使用SAS函数 2.1 常用SAS字符函数 2.2 常用SAS数值函数 3 IF-THEN语句 3.1 使用if-then语句(单分支) 3.2 使用if-then/else语句分组观测(双分支/多分支) 4 提取数据中的子集(if语句/delete语句) 5 使用SAS日期 5.1 常用SAS日期函数 5...

关于对JMM(java内存模型)的个人理解

java内存模型是一种虚拟机规范,它定义了Java内存模型,用于屏蔽各种不同硬件和操作系统访问内存差异,以实现让java程序在各种平台下都能达到一致的并发效果.JMM规范了java虚拟机与计算机内存是如何协同工作的,规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量. 关于主内存与工作内存之间的具体交互协...

使用CMake构建OpenCV项目

这篇文章我们来对我们的安装进行测试,并介绍如何用CMake工具快捷地构建OpenCV项目。 为了使整个项目更加条理,我们的文件夹采用如下组织方式: binbuildCMakeLists.txtsrc 其中bin目录用于放编译生成的可执行文件,build目录用于cmake构建项目,src用于放源代码。"CMakeLists.txt"这个名字,一个...

JAVA继承初始化过程

我们有必要对整个初始化过程有所认识,其中包括继承,对这个过程中发生的事情有一个整体性的概念。请观察下述代码: //: Beetle.java // The full process of initialization. class Insect { int i = 9; int j; static int x1 = prt("sta...