WebGL-Shader入门(6.着色器语言GLSL ES 预处理指令和宏定义)
Posted 点燃火柴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebGL-Shader入门(6.着色器语言GLSL ES 预处理指令和宏定义)相关的知识,希望对你有一定的参考价值。
GLSL ES 预处理指令宏定义
1. 预处理指令
预处理指令用来在着色器程序真正编译之前对代码进行预处理,预处理指令都是以 (#) 开始,先来通过一个例子感受一下
#ifdef GL_ES
precision mediump float;
#endif
上面这段代码,检查是否已经定了 GL_ES 宏,如果定义了就执行#ifdef 和 #endif 之间的内容,这个预处理指令的格式和C语言很类似。
GLSL ES 语言一共提供了三种预处理指令,接下来一一说明
1.1 #if
#if 条件表达式
条件表达式为真,执行这里
#endif
1.2 #ifdef
#ifdef 某宏
如果定义了某宏,执行这里
#endif
1.3 #ifndef
#ifdef 某宏
如果没有定义某宏,执行这里
#endif
2. 宏定义
宏使用 #define
指令进行定义,定义宏的方式为
#define 宏名 宏内容
例如定义圆周率或一个特定的数
#define PI 3.14//圆周率
#define NUM 30//num
如果程序中宏不在使用,可使用 #undef
指令解除宏定义,例如执行 #undef PI
可以解除圆周率的宏定义
你也可以使用 #if
#else
指令配合 #ifdef
编写出更灵活的预处理指令,例如
#define NUM 30
#if NUM == 30
//如果宏NUM为30,执行这里
#else
//否则,执行这里
#endif
关于宏的名字可以任意取,但是不能和两个内置的宏冲突,分别是 GL_ES 和 GL_FRAGMENT_PRECISION_HIGH,GL_ES 在OpenGL ES 2.0 中定义为1,GL_FRAGMENT_PRECISION_HIGH 表示片元着色器支持highp精度
关于精度限定,来看一个例子
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float; //着色器支持高精度,限定浮点类型为高精度
#else
precision mediump float; //着色器不支持高精度,限定浮点类型为中精度
#endif
#endif
GLSL ES 还提供了一个 #version
指令来指定着色器使用的GLSL ES的版本,如果不指定GLSL ES的版本,默认指定101,如果你要指定为100版本,在着色器的顶部写下 #version 100
语句,
注意, #version 指令必须写在着色器顶部,在它之前只能有注释和空白
以上是关于WebGL-Shader入门(6.着色器语言GLSL ES 预处理指令和宏定义)的主要内容,如果未能解决你的问题,请参考以下文章
WebGL-Shader入门(2.着色器语言GLSL ES矢量和矩阵的访问与运算)
WebGL-Shader入门(5.着色器语言GLSL ES 内置变量和内置函数)
WebGL-Shader入门(1.着色器语言GLSL ES数据类型介绍与使用)
WebGL-Shader入门(3.着色器语言的限定词-参数限定词/存储限定词/精度限定词)