1. 程式人生 > >14 WebGL 著色器程式語言GLSL ES的預處理指令

14 WebGL 著色器程式語言GLSL ES的預處理指令

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指令必須在著色器頂部,在它之前只能有註釋和空白。