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的基本数据类型以及聚合数据类型等进行介绍。