WebGL-Shader入门(6.着色器语言GLSL ES 预处理指令和宏定义)

Posted 点燃火柴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebGL-Shader入门(6.着色器语言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_ESGL_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.着色器语言的限定词-参数限定词/存储限定词/精度限定词)

shader编程-着色器中颜色基础(WebGL-Shader开发基础06)

shader编程-着色器中颜色基础(WebGL-Shader开发基础06)