OpenGL 着色器中使用的是着色语言GLSL。着色语言源自C语言,提供了丰富的原生类型,如向量、矩阵等,还有大量的内建函数,这在处理3D图形时可以更加高效、易用。下面是整理的是OpenGL ES2.0的GLSL语言。

 

基本数据类型

标量

GLSL中的标量含布尔、int和float,声明方法也跟一般的语言相似:

向量

由2,3或4维标量组成:

访问向量的某个分量可以通过数组下标v[0]访问,起始索引为0。也可以通过.+分量名来访问,根据目的GLSL中有三套分量名,分别为颜色r,g,b,a,坐标x,y,z,w和纹理坐标s,t,p,q,使用的时候三套分量名是相同作用的,只要同时使用时,保证为同一套即可:

矩阵

在3D场景中,矩阵是十分重要的,平移,旋转或者缩放都是靠矩阵运行实现的。所以GLSL中原生支持矩阵类型和相应的矩阵计算。

矩阵可以看成由多个列向量组成,类似于二维数组,通过m[0]访问第一列向量,通过m[0][0]访问第一行第一列的值。

采样器

一种特殊的基本数据类型,专门用来进行纹理采样的相关操作,我的理解采样器就是是一幅或一套纹理的引用,其值由宿主程序传入(Android即为Java):

结构体

类似于C语言中的结构体,声明方式同样使用struct关键字:

数组

跟C语言不太一样的是,数组声明的时候可以不指定长度,使用数组时也不用关心越界问题,编译器会自动创建适当大小的数组:

 

空类型

使用void表示,用来声明不含返回值的函数,main函数就是例子。

 

基本语法

大部分语法都是跟C语言类似的,像变量声明、初始化,变量的作用域,运算符,if/else、for、while流程控制等都几乎是一样的,主要提一下不一样的地方。

1、系统许多的内建变量都是以_gl为开头的,所以用户自定义的变量不要使用这个做开头。

2、向量、矩阵初始化时各个元素既可以是字面常量也可以是变量:

3、通过.可以混合选择向量的分量,并且可以重新排列:

4、GLSL中对类型的匹配十分严格,没有类型自动转换的功能,左值右值的类型必须完全相同,类型的强制转换需要通过类似于构造函数的方式:

5、函数参数的修饰符:缺省为in修饰符,修饰输入参数,相当于在函数体中使用的是参数的拷贝,跟一般的函数参数一样;out修饰符,修饰输出参数,类似于传入了指针或引用,在函数体给变量赋值会改变该变量的值,不能是字面常量;inout具有输入输出两种功能。

6、指定变量的精度:通过lowp、mediump和highp作为限定符修饰变量就可以指定变量的精度。同一个着色器中所有相关类型都用一个精度可以在着色器第一句使用precision

限定符

要想正确使用GLSL,限定符的意义和所修饰的变量如何使用是很重要的:

内建变量

不需要声明即可直接使用,分为输出变量和输入变量,输出变量可以在着色器赋值,进而传入到渲染管线中,输入变量为只读变量,常用的内建变量并不多:

内置函数

GLSL内置了大量内置函数,通常都是以最优方式实现,有的甚至直接硬件支持。包含大量数学函数:三角函数、指数函数、几何函数、向量矩阵函数等,这些可以自己开发编写,但是往往效率低下,使用内置函数可以更高效更方便的做图像处理。还有一些没有办法自己编写的函数,如纹理采样函数:

通过采样器指定到一幅纹理,在通过坐标获得某一位置的颜色值,这个函数在需要进行纹理贴图时会用到。

基本程序结构

一套program含一个顶点着色器和一个片元着色器,最基础的不含复杂图形计算的着色器其实是很简单的:

顶点着色器:

片元着色器:

 

 

参考资料:

OpenGL ES2.0 for Android
http://www.zhouchengjian517.com/opengl-es2.0-for-android/ 

你好,三角形
http://learnopengl-cn.readthedocs.org/zh/latest/01%20Getting%20started/04%20Hello%20Triangle/#pipeline

OpenGL ES2 学习教程
https://segmentfault.com/t/opengl-es/blogs

OpenGL ES 着色语言的更多相关文章

  1. OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

    OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...

  2. OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围

    OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)   所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符. ...

  3. OpenGL ES着色器语言之着色概览(官方文档)

    OpenGL ES着色器语言之着色概览(官方文档第二章) 事实上,OpenGL ES着色语言是两种紧密关联的语言.这些语言用来在OpenGL ES处理管线的可编程处理器创建着色器. 在本文档中,除非另 ...

  4. OpenGL ES着色器语言之操作数(官方文档第五章)

    OpenGL ES着色器语言之操作数(官方文档第五章) 5.1操作数 OpenGL ES着色器语言包含如下操作符. 5.2数组下标 数组元素通过数组下标操作符([ ])进行访问.这是操作数组的唯一操作 ...

  5. OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)

    OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章) 4.5精度和精度修饰符 4.5.1范围和精度 用于存储和展示浮点数.整数变量的范围和精度依赖于数值的源(varying,unifo ...

  6. OpenGL ES着色器语言之静态使用(static use)和预处理

    OpenGL ES着色器语言之静态使用(static use) 在OpenGL ES中有一个术语叫静态使用(static use),什么叫静态使用呢? 在写代码中,对于一个变量可能具有以下三种情况: ...

  7. Android OpenGL ES 开发(八): OpenGL ES 着色器语言GLSL

    前面的文章主要是整理的Android 官方文档对OpenGL ES支持的介绍.通过之前的文章,我们基本上可以完成的基本的形状的绘制. 这是本人做的整理笔记: https://github.com/re ...

  8. OpenGL ES Shader语言中的函数不支持递归

    An example function definition is given here for a simple function that computes basic diffuse light ...

  9. OpenGL ES学习笔记(一)——基本用法、绘制流程与着色器编译

    首先声明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. 在Android.iOS等移动平台上 ...

随机推荐

  1. python分割数组里面重复的元素

    c=[1,1,1,1,2,2,2,3,3,4,4,4,4,4,5,5,5,] a = [] x = [] for i in range(0,len(c)): if i + 1 < len(c): ...

  2. 查看SqlServer的内存使用情况

    上一篇提到动态T-SQL会产生较多的执行计划,这些执行计划会占用多少内存呢?今天从徐海蔚的书中找到了答案.动态视图不仅可以查到执行计划的缓存,数据表的页面缓存也可以查到,将SQL整理一下,做个标记. ...

  3. 解决Navicat无法连接Oracle的问题

    G:\app\hoge\product\11.2.0\dbhome_3\BIN

  4. [Hibernate] - many to one

    Hibernate的多对一操作: 例子参考引用: http://www.tutorialspoint.com/hibernate/hibernate_many_to_one_mapping.htm h ...

  5. 关于checkbox的attr无效的问题

    jq用了10版本的,一直发现attr无效,查找良久,由同事帮忙解决该问题,感谢. 特记录下该问题. 由于 新版本attr换成了prop的问题. $("input[name='delIds'] ...

  6. noaman日志第一条:2015-1024;“Hello.World”

    在南京的不知道第几个周末,一夜的煎熬终于活过来了.清早起来开通了自己的博客,第一条说说就记录开通博客这个事件.没有别的. 之后我会着重记录每天看书内容,以及所要编写的重要程序,一点一滴地积累希望能收获 ...

  7. Saltstack系列3:Saltstack常用模块及API

    说明 salt '*' sys.list_modules #列出当前版本支持的模块 API原理是通过调用master client模块,实例化一个LocalClient对象,再调用cmd()方法来实现 ...

  8. [Freescale]Freescale L3.14.52_1.1.0 yocto build

    可参照:http://blog.csdn.net/wince_lover/article/details/51456745 1. Refer to <基于i.mx6处理器的Yocto项目及Lin ...

  9. [cmd]linux 常用命令

    1. 磁盘/文件大小中占用情况 df -h: 磁盘大小占用情况 du -h file: 文件夹大小,du -ah file文件夹内所有文件占用情况 du -sh dir: 可以查看文件夹大小,而不列出 ...

  10. activiti自定义流程之Spring整合activiti-modeler5.16实例(五):流程定义列表

    注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建        (2)创建流程模型:activiti自定义流程之Spring ...