GLSL ES 预处理指令宏定义
- 1. 预处理指令
-
- 1.1 `#if`
- 1.2 `#ifdef`
- 1.3 `#ifndef`
- 2. 宏定义
1. 预处理指令
预处理指令用来在着色器程序真正编译之前对代码进行预处理,预处理指令都是以 (#) 开始,先来通过一个例子感受一下
#ifdef GL_ESprecision 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_HIGHprecision highp float; //着色器支持高精度,限定浮点类型为高精度#elseprecision mediump float; //着色器不支持高精度,限定浮点类型为中精度 #endif
#endif
GLSL ES 还提供了一个 #version
指令来指定着色器使用的GLSL ES的版本,如果不指定GLSL ES的版本,默认指定101,如果你要指定为100版本,在着色器的顶部写下 #version 100
语句,
注意, #version 指令必须写在着色器顶部,在它之前只能有注释和空白