Modern OpenGL – GLSL着色语言2:GLSL入口函数和GLSL中的变量
1 GLSL的入口函数和基本结构
对于很多编程语言学习的第一步就是学习如何输出HelloWorld,学过类C语言的同学都知道,C和C++程序的入口函数就是从main函数开始,那么和C语言类似,GLSL语言的入口函数也是从main开始的,每一个OpenGL的shader都有着类似于下列代码的基本结构:
#version 330 core
void main()
{
// 在此处添加有关的shader程序代码
}
2 GLSL中的变量声明
- 与C/C++类似,GLSL是一种强类型的编程语言,所有变量在使用之前都必须提前声明,并且需要在声明时就指定变量的数据类型。
例如:
double redValue = 1.0f;
- 其次,变量的命名规范与C语言相同:可以使用字母、数字、下划线字符组成变量的名称,但是数字和下划线不能作为名称的第一个字符。
- 另外与C语言不同的是:变量名称在命名时不能使用连续的下划线,因为,在GLSL中使用连续下划线字符的有可能是保留字符。
3 GLSL中变量的作用域
- 在任何函数定义之外声明的变量拥有全局作用域,因此对着色器中所有函数都是可见的。类似于C语言中的全局变量。
#version 330 core
double redColor = 1.0f;
void main()
{
}
上述代码中的redColor对于该shader中所有函数都是可见。
- 在一组大括号之内,比如函数定义、循环体或者if语句块中声明的变量,只是对于该大括号内是可见的。类似于C语言中的局部变量。
- for循环的迭代自变量,
下面循环中的i,
#version 330 core
void main()
{
for(int i=0;i<100;++i)
{
}
}
上述的迭代变量i只在for循环体中有效,类似于C/C++。
4 GLSL中变量的初始化
int pointNum = 300;
float length = 150.89f;
bool isVisible = true;
double a = 3.1456465456456456465465LF;
- 所有声明的变量都必须在声明的同时进行初始化,防止出现错误
- 浮点数的初始化必须包含一个小数点或者使用科学计数法进行表示,例如7E-8
- flaot型的变量建议在初始化的时候在数值末尾添加f或者F后缀表示其为浮点数
- double精度的变量初始化时必须在数值末尾添加lF或者LF后缀表示其为一个双精度的变量
5 GLSL中变量的隐式转换
因为GLSL是一种强类型语言,其有着比C/C++语言更加严格的隐式转换规则。
比如说在C/C++中,bool型变量可以被隐式转换为int型变量,比如:
int isPass = false;
这在C/C++中是没有语法错误的,但是在GLSL中会返回一个编译错误,错误原因为:布尔值不能赋予整形变量。
由此可见GLSL比C/C++更加注重类型安全,在GLSL可支持隐式转换的类型如下:
可转换的类型 | 可从这些类型进行转换 |
---|---|
uint | int |
float | int、uint |
double | int、uint、float |
好的,本节对GLSL中入口函数和变量的声明使用以及初始化做了一些简单的介绍,下一节的内容将对GLSL的基本数据类型以及聚合数据类型等进行介绍。
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:Modern OpenGL – GLSL着色语言2:GLSL入口函数和GLSL中的变量
原文链接:https://www.stubbornhuang.com/973/
发布于:2020年11月16日 22:07:49
修改于:2023年06月26日 22:06:33
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
52