GLSL基础

1.数据类型

1.1 标量

三种基本类型:float int bool,以及由这些数据类型组成的数组和结构体。
GLSL不支持指针,字符,字符串,双精度浮点数,字节,短整型,长整型或这些类型的无符号型。

float f = 3.14;//不需要后缀指明精度
float f1 = 3;//wrong,不支持强制类型转换
float f2 = float(3);//使用构造函数进行转换
int i = 42;
int i1 = 042;//八进制
int i2 = 0x4A;//十六进制

1.2 矢量

向量和矩阵也作为基本数据类型,向量类型包括由上述三种基本数据类型构成的是二维 三维 四维的向量,比如浮点型三维向量为vec3,整形四维向量为ivec4
vec2,vec3,vec4 包含2,3,4个浮点数的矢量
ivec2,ivec3,ivec4 包含2,3,4个整数的矢量
bvec2,bvec3,bvec4 包含2,3,4个布尔数的矢量

可以使用以下的名称来访问矢量的各个元素:
x,y,z,w 将矢量看做一个位置或方向
r,g,b,a 将矢量看做一种颜色
s,t,p,q 将矢量看做一个纹理坐标

vec3 v;
v[1] = 3.0;
v.x = 2;
v.xy = v2.yz;//将v2的头2个元素互换,在复制到v2的头2个元素中

1.3 矩阵

mat2 2*2的浮点数矩阵
mat3 3*3的浮点数矩阵
mat4 4*4的浮点数矩阵
矩阵是列向量优先的,可以将矩阵作为列矢量的数组来访问,如果transform是一个mat4,那么transform[2]就是transform的第三列,transform[3][1]是transform的第四列的第二个分量。第一索引是列,第二索引是行

1.4 取样器

sampler 取样器,封装要访问的纹理的句柄
sampler1D 访问一个一维纹理
sampler2D 访问一个二维纹理
sampler3D 访问一个三维纹理
samplerCube 访问一个立方贴图纹理
sampler1DShadow 访问一个带对比的一维深度纹理
sampler2DShadow 访问一个带对比的二维深度纹理

着色器本身不能初始化取样器,只能通过一个uniform限定的取样器从应用程序接收取样器,或者将他们传递给用户或内置函数

uniform sampler2D Grass;
vec4 color = texture2D(Grass,coord);//coord是一个vec2,存储了要用来作为草地纹理的索引的二维位置,color是执行纹理查找的结果,texture是纹理查找函数

1.5 结构

同C,不需要使用typedef关键字

1.6 数组

声明时不必指定大小,可以在要使用时再指定大小,或直接用下标使用,编译器会使数组足够大以存放数组

vec4 point[];
//1.后指定大小
vec4 point[10];//以后就是10大小,不可在更改大小,不可在重复定义
//2.直接使用
vec2 point[2]=vec4(1.0);//现在大小为3
vec2 point[7]=vec4(2.0);//大小为8 

1.7 初始化器和构造函数

所有的内置函数和结构都有构造函数

vec4 v = vec4(1.0,2.0,3.0,4.0);
vec3 v2 = vec3(0.6);//==vec3(0.6,0.6,0.6)全为此值
vec2 v3 = vec2(v);//v的前2个部分将初始化v3
vec2 v4 = vec2(1.0,2.0,3.0);//舍弃第三个分量
mat2 m = mat(2.0);// == mat2(2.0,0.0,0.0,2.0)对角线

1.8 类型转化

类型转换使用构造函数完成

2 限定符:

GLSL中有四个限定符

  1. const 同C++,标定一个常量
  2. attribute 仅用于顶点着色器,对于某一顶点来说是不可更改的
  3. uniform 对于一个图元来说是不可更改的,用于顶点着色器和像素照色器
  4. varying 用于从顶点着射器向片段着色器传递数据

3 运算符和数学函数

GLSL支持所有标准运算符,且都支持向量和矩阵运算,支持所有C的流程控制语句(if,for,while,do-while),GLSL中应尽量避免使用循环语句
例:

mat4 a,b,c;
c=a*b;//c是矩阵a和b叉乘的结果,不等于b*a
vec3 a,b;
b=sqrt(a);//b中的每个元素都是a的对应元素的平方根

流经着色器
能够实现基本的渲染功能的最小着色器称作流经着色器,含义是数据流在不经处理的情况下流过着色器,这样的着色器结构非常简单。
例:

void main(void)
{
    //选择一: gl_Position = gl_ProjectionMatrix*gl_ModelViewMatrix * gl_Vertex;
    //选择二:gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    /*选择三:*/gl_Position = ftransform();
}

这里提供了3种作用相同的流经顶点着射器。它们的作用是将该顶点与当前的模型视图矩阵和投影矩阵依次相乘。注意:当前顶点的坐标被保存在变量gl_Position中,这是opengl提供的内建变量
类似的一个流经片段着射器如下:

void main(void)//流经片段着射器
{
    gl_FragColor = gl_FrontColor;
}

这个流经片段着射器只保留了当前的模型颜色。gl_FragColor是OpenGL的内建变量表示当前片段颜色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值