- 着色器(Shader)是用来替代固定渲染管线(实现图像渲染)的可编辑程序。
着色器分为顶点着色器Vertex Shader(程序中有多少顶点就调用多少次顶点着色器)和片元着色器Pixel Shader(程序中片元着色器通常比顶点着色器调用的次数多得多)两种
(注:两种着色器在不同的实现中略有不同)。
其中Vertex Shader主要负责顶点的几何关系等的运算,Pixel Shader主要负责片元颜色等的计算。
小知识:当今主流的GPU中都配置了不只一套顶点着色器,片元着色器要更多的多
- 着色语言基于C/C++的语法,但与C/C++并不完全相同。
着色语言中有许多内建的原生数据类型以及构建数据类型,如
1. 标量
浮点型(float)、布尔型(bool)、整形(int)
2.向量型
基本语法,向量名.分量名。
rgba指颜色,xyzw指坐标,stpq指纹理坐标
vec2 : 包含了2个浮点数的向量 vec3 : 包含了3个浮点数的向量 vec4 : 包含了4个浮点数的向量
ivec2 : 包含了2个整数的向量 ivec3 : 包含了3个整数的向量 ivec4 : 包含了4个整数的向量
bvec2 : 包含了2个布尔数的向量 bvec3 : 包含了3个布尔数的向量 bvec4 : 包含了4个布尔数的向量
3.矩阵型(matrix)
3D场景中的移位、旋转、缩放等变换都是由矩阵的运算来实现的(矩阵的访问可以作为数组来访问)
mat2 :2*2的浮点数矩阵 mat3 : 3*3的浮点数矩阵 mat4 : 4*4的浮点数矩阵
4.采样器
专门用来进行纹理采样的相关操作,一般情况下,一个纹理采样器变量代表一幅或一套纹理贴图,采样器变量不能在着色器中
初始化,一般情况下,纹理采样器变量都用uniform限定符来修饰,从宿主语言(如JAVA)接收传递进着色器的值。
sampler2D :用于访问二维纹理 sampler3D :用于访问三维纹理 samplerCube :用于访问立方贴图纹理
5.结构体、数组、空类型等。
着色器语言的限定符:
主要的有:attribute属性限定符、uniform一致变量限定符、varying易变变量限定符、const常量限定符
注:
因着色器语言中的内建变量大部分都以gl_开头的原因,用户自定义变量命名不允许使用gl_开头。
-------------------------------------------------------------------------------------------------------------------
着色器语言的变量运算注意点:
着色语言中属性变量、一致变量以及易变变量在声明的时候一定不能进行初始化。
通过运算符“.”可以进行混合选择操作
(例:vec4 color = vec4(0.3,0.7,0.5,0.6); vec3 t1= color.aabg 或 vec3 t2;t2.grb =color.aab等)
在矩阵上使用加减乘除运算时满足线性代数定义。
着色语言的赋值没有自动类型转换。