OpenGL ES 的三种变量类型(uniform,attribute和varying)

1.uniform变量

uniform变量是外部application程序传递给(vertex和fragment)shader的变量。因此它是application通过函数glUniform**()函数赋值的。在(vertex和fragment)shader程序内部,uniform变量就像是C语言里面的常量(const ),它不能被shader程序修改。(shader只能用,不能改)

如果uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用。(相当于一个被vertex和fragment shader共享的全局变量)

uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。

以下是例子:

uniform mat4 viewProjMatrix; //投影+视图矩阵
uniform mat4 viewMatrix;        //视图矩阵
uniform vec3 lightPosition;     //光源位置

2.attribute变量

attribute变量是只能在vertex shader中使用的变量。(它不能在fragment shader中声明attribute变量,也不能被fragment shader中使用)

一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。

在application中,一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数glVertexAttribPointer()为每个attribute变量赋值。

以下是例子:

uniform mat4 u_matViewProjection;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
varying vec2 v_texCoord;
void main(void)
{
gl_Position = u_matViewProjection * a_position;
v_texCoord = a_texCoord0;
}

3.varying变量

varying变量是vertex和fragment shader之间做数据传递用的。一般vertex shader修改varying变量的值,然后fragment shader使用该varying变量的值。因此varying变量在vertex和fragment shader二者之间的声明必须是一致的。application不能使用此变量。

以下是例子:

// Vertex shader
uniform mat4 u_matViewProjection;
attribute vec4 a_position;
attribute vec2 a_texCoord0;
varying vec2 v_texCoord; // Varying in vertex shader
void main(void)
{
gl_Position = u_matViewProjection * a_position;
v_texCoord = a_texCoord0;
}

// Fragment shader
precision mediump float;
varying vec2 v_texCoord; // Varying in fragment shader
uniform sampler2D s_baseMap;
uniform sampler2D s_lightMap;
void main()
{
vec4 baseColor;
vec4 lightColor;
baseColor = texture2D(s_baseMap, v_texCoord);
lightColor = texture2D(s_lightMap, v_texCoord);
gl_FragColor = baseColor * (lightColor + 0.25);
}

时间: 2024-10-12 21:07:12

OpenGL ES 的三种变量类型(uniform,attribute和varying)的相关文章

shader三种变量类型(uniform,attribute和varying)

uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用.(相当于一个被vertex和fragment shader共享的全局变量) uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息. 以下是例子: uniform mat4 viewProjMatrix; //投影+视图矩阵 uniform mat4 viewMatrix; //视图矩阵 uniform vec3 lightPosition; //光源位置

Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的

bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使用Boolean类型. 这四种类型的布尔值占用内存的数量如下: Boolean 1 Byte ByteBool 1 Byte WordBool 2 Bytes(1 Word) LongBool 4 Bytes(2 Words) 对于ByteBool,WordBool和LongBool三种类型True

固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型

一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符串型(string)Convert.ToDateTime() 转换为日期型(datetime)Convert.ToDouble() 转换为双精度浮点型(double)Conert.ToSingle() 转换为单精度浮点型(float) 二.运算符算术运算符 + - * / %逻辑运算符 & | ^

java Data、String、Long三种日期类型之间的相互转换

java Data.String.Long三种日期类型之间的相互转换 // date类型转换为String类型 // formatType格式为yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒 // data Date类型的时间 public static String dateToString(Date data, String formatType) { return new SimpleDateFormat(formatType).format(data

xhtml三种元素类型

xhtml三种元素类型:块级元素/内联元素/可变元素 块级元素:独占一行.可自定义自己的宽度和高度.作为其他元素的容器,可容纳其他内联元素和块级元素,喻做一个盒子.内联元素:始终以行内逐个显示.不能设置宽高,宽高由内容支撑.可定义padding/margin/border/background.可变元素:根据上下文确定是块级元素还是内联元素.注:不同的元素类型之间可以通过display属性来实现转换. 举例:块级元素:div/h1/p/form/hr/ifrom/......内联元素:span/

Linux三种进程类型

Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性. 1.  交互进程是由一个Shell启动的进程.交互进程既可以在前台运行,也可以在后台运行. 2.  批处理进程和终端没有联系,是一个进程序列. 3.  监控进程(也称系统守护进程)是Linux系统启动时运行的进程,并常驻后台.例如,httpd是著名的Apache服务器的监控进程. init是Linux系统操作中不可缺少的程序之一.所谓的init进程,它是一个由内核启动的用户级进程. 内核自行启动(已经被载入内存,开始运行,

Delphi三种变量申明范围的理解+变量和常量

大体的三种解释是这样的 全局变量:是指在类外声明的变量,通常这种变量时在整个工程内有效的,也就是说在整个工程中的类都可以使用.该变量的生存周期是在工程创建时有效,工程销毁时销毁. 类变量:是指在类中声明的变量,这种变量在类中的方法都可以使用.其生命周期是在类创建时有效,类销毁时销毁. 局部变量:是指在方法内部声明的变量,这种变量只能在方法内部使用.其生命周期也是在方法内部有效,当方法调用结束后,其内部所声明的变量也随之销毁 全局变量放在public底下.类似于vb中类模块中的public a a

oracle 三种复合类型变量分析

实际项目中,经常遇到的三种复合类型变量.结合部分项目实例做个整理,具体如下: 记录类型:记录类型可以包含一个或多个成员,而每个成员的类型可以不同,成员可以是标量类型.也可以引用其他的变量类型.这种类型的特点是比较适合处理查询语句中有多个列的情况,最常用的情况就如在调用某一张表中的一行记录. 索引表类型(关联数组):索引表类型和数组相似,他利用键值查找对应的值,这里的键值同真正数组的下标不同,索引表中下标允许使用字符串.数组的长度不是固定值,可以根据需要自动增长.其中的键值是整数或是字符串,其中的

Sort merge join、Nested loops、Hash join(三种连接类型)

目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接): 首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed table需要的数据,然后对这些数据按照与driving table对应的连接操作列进行排序:最后两边已经排序的行被放在一起执行合并操作.排序是一个费时.费资源的操作,特别对于大表.所以smj通常不是一个特别有效的连接方法,但是如果driving table和probed table都已经预先排序