GLSL着色器的组成

举报
天元浪子 发表于 2021/11/25 15:52:50 2021/11/25
【摘要】 这是一个最简单的顶点着色器的例子,乍一看,和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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。