GLSL ES支持预处理指令。预处理指令用来在真正编译之前对代码进行预处理,都以井号(#)开始。下面就是我们曾使用的预处理指令。
#ifdef GL_ES
precision mediump float;
#endif
这段代码检查了是否已经定义了GL_ES宏,如果是,那就执行#ifdef和#endif之间的部分。这个预处理指令的格式和C语言或JavaScript中的if语句很类似。
下面是我们在GLSL ES中可能用到的三种预处理指令。
你可以使用#define指令进行宏定义。和C语言中的宏不同,GLSL ES中的宏没有宏参数:
#define 宏名 宏内容
你可以使用#undef指令解除宏定义:
#undef 宏名
你可以使用#else指令配合#ifdef(就像C语言或JavaScript中if语句中的else),比如:
宏的名称可以任意起,只要不和预定义的内置宏名称(表6.17)相同即可。
所以,我们可以这样使用宏来进行精度限定:
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float; //支持高精度,限定浮点型为高精度
#else
precision mediump float; //不支持高精度,限定浮点型为中精度
#endif
#endif
可以使用#version来指定着色器使用的GLSL ES版本:
#version number
可以接受的版本包括100(GLSL ES 1.00)和101(GLSL ES 1.01)。如果不适用#version 指令,着色器将默认GLSL ES的版本是1.00。指定1.01版本的代码如下:
#version 101
#version指令必须在着色器顶部,在它之前只能有注释和空白。