GLSL介绍
GLSL是多种紧密相关的语言,这些语言用于为OpenGL API处理管道中包含的每个可编程处理器创建着色器。包含如下的着色器:
- Vertex
- Tessellation Control
- Tessellation Evalution
- Geometry
- Fragment
- Compute
编译器处理阶段
Shader处理器的编译单元在编译的最后阶段可选地链接在一起之前被分别处理。其处理逻辑如下:
- 源字符串是以字节序列输入,’\0’被解释为终止符。
- 所有源字符串被串联以形成单个输入,’\0’字节被丢弃,所有其他值均保留。(每个shader可能有多个输入字符串)
- 每个字符串均根据UTF-8标准进行解释,不同之处在于,所有无效字节序列均以其原始形式保留以用于后续处理。
- 每个{回车,换行}和{换行,回车}序列都由单个换行符代替,所有剩余的回车符和换行符都将用单个换行符替代。
- 每个字符的行号等于前一个换行符的数量加一。请注意,此操作只能随后通过#line指令进行更改,并且不受编译阶段6中删除换行符的影响。
- 在换行符之前出现反斜杠(’')的都将被删除(转义)。请注意,不会替换任何空格,从而允许单个预处理令牌跨越换行符。此操作不是递归的;不会删除任何新生成的{反斜杠 换行符}序列。
- 所有注释均替换为一个空格。注释中允许所有(非零)字符和无效的UTF-8字节序列。’//‘样式注释包括初始的’//‘标记,并一直延续到但不包括终止换行符。’/…/‘注释同时包含开始和结束标记。
- 源字符串将转换为一系列预处理Token。这些Token包括预处理编号,标识符和预处理操作。每一个Token的行号是Token开始的第一个字节的行号。
- 预处理器运行。执行指令并执行宏扩展。
- 空格和换行符将被丢弃。
- 预处理Token将转换为Token
- 语法根据GLSL ES语法进行分析。
- 根据语言的语义规则检查结果。
- 将着色器链接在一起以形成一个或多个程序或分离的程序。当将一对连续阶段的着色器链接到同一程序时,两个着色器中未使用的任何输出和相应的输入都可能会被丢弃。
- 生成二进制文件。