GLSL着色器的组成
【摘要】 这是一个最简单的顶点着色器的例子,乍一看,和C语言程序的源码非常类似,连注释都是一样的。// 1. 预编译命令#version 330 core// 2. 全局变量声明in vec4 a_Position;// 3. 主函数void main() { gl_Position = a_Position;}一般而言,一个着色器程序的源码有三部分组成:预编译命令、全局变量声明和主函数。 1 预编译...
这是一个最简单的顶点着色器的例子,乍一看,和C语言程序的源码非常类似,连注释都是一样的。
// 1. 预编译命令
#version 330 core
// 2. 全局变量声明
in vec4 a_Position;
// 3. 主函数
void main() {
gl_Position = a_Position;
}
一般而言,一个着色器程序的源码有三部分组成:预编译命令、全局变量声明和主函数。
1 预编译命令
和C语言的预编译类似,GLSL同样提供了一系列命令来定义宏和常量,或者有条件地生成编译代码块。上面的着色器例子中,#version 330 core就是声明GLSL版本的预编译命令。下表列出了常用的预编译命令。
命令 | 说明 |
---|---|
#define | 定义宏和常量 |
#undef | 删除宏和常量 |
#if | 条件编译 |
#ifdef | 条件编译 |
#ifndef | 条件编译 |
#else | 条件编译 |
#elif | 条件编译 |
#endif | 条件编译 |
#error text | 强制编译器将text输出到日志 |
#pragma options | 设置编译器的特定选项 |
#extension options | 设置GLSL扩展 |
#version number | 设置GLSL版本 |
#line options | 设置诊断行号 |
2 全局变量声明
GLSL属于强类型语言,所有变量都需要事先声明,并给出确定的数据类型。变量声明的一般格式如下。
数据类型 变量名 = 变量值;
尽管在主函数内部也可以声明变量,但主函数外的变量声明在数据类型前还需要一个存储限定符。比如上面的着色器例子中,a_Position是预先声明的变量,其数据类型是vec4,数据类型前面的in就是存储限定符。存储限定符是GLSL语言中最具特色的语法,也是初学者最难理解的概念。带存储限定符的变量声明的一般格式如下。
存储限定符 数据类型 变量名;
3 主函数
和C语言类似,主函数由多行语句组成,无返回值。主函数可以直接使用在主函数外都声明的全局变量,也可以在使用之前的任何时候声明局部变量,也可以使用着色器内置的输入变量(只读)和输出变量。不同类型的着色有着各自不同的内置变量,详见本文第6节。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)