{GLSL
0:GLSL介绍
1:常用的数据类型
2:修饰符
3:内置变量/函数
4:表达式
1:操作符
2:数组访问
3:构造函数
4:成分选择
5:控制流
1:循环(for,while,dowhile)
2:条件(if/else)
3:退出片段着色器(discard)
6:函数
}
{0:GLSL介绍
三大主流高级编程语言
HLSL 基于DirctX(High Level Shading Language)
GLSL 基于OpenGL(OpenGL Shading Language)
CG 基于NVIDIA公司和C for Graphic简称
}
{1:常用的数据类型
bool 布尔变量
int 整形(代表至少包含16位的有符号的整数。可以是十进制的,十六进制的,八进制的。)
float 单精度浮点数
double 双精度浮点数
向量:包含n个布尔
bvec2 包含2个布尔成分的向量
bvec3 包含3个布尔成分的向量
bvec4 包含4个布尔成分的向量
向量:包含n个整型
ivec2 {x,y} 包含2个整型成分的向量
ivec3 {x,y,z}包含3个整型成分的向量
ivec4 {x,y,z,w}包含4个整型成分的向量
向量:包含n个整型
vec2 {x,y} 包含2个整型成分的向量
vec3 {x,y,z} 包含3个整型成分的向量
vec4 {x,y,z,w} 包含4个整型成分的向量
{x,y,z,w}
{r,g,b,a}
{s,t,p,q}
矩阵:
mat2x2 mat2x2(2x2的浮点数矩阵类型)
mat2x3 mat2x3 2列3行的浮点矩阵(OpenGL的矩阵是列主顺序的)
mat2x4 mat2x4 2列4行的浮点矩阵
矩阵:
mat3x2 mat3x2 3列2行的浮点矩阵
mat3x3 或者mat3x3(3x3的浮点数矩阵类型)
mat3x4 mat3x4 3列4行的浮点矩阵
mat4x2 mat4x2 4列2行的浮点矩阵
mat4x3 mat4x3 4列3行的浮点矩阵
mat4x4 mat4x4 4x4的浮点矩阵
sampler1D 用于内建的纹理函数中引用指定的1D纹理的句柄。只可以作为一致变量或者函数参数使用
sampler2D 二维纹理句柄
sampler3D 三维纹理句柄
samplerCube cube map纹理句柄(立体图,例如看镜子上的图片就是立体图)
sampler1DShadow 一维深度纹理句柄
sampler2DShadow 二维深度纹理句柄
}
{2:修饰符
变量的声明可以使用如下的修饰符
precision 浮点精度
lowp 低精度
mediump 中精度
highp 高精度
例如:
precision lowp float //浮点精度低精度 float
修饰符 描述
const 常量值必须在声明是初始化。它是只读的不可修改的。
attribute 表示只读的顶点数据,只用在顶点着色器中。数据来自当前的顶点状态或者顶点数组。它必须是全局范围声明的,不能再函数内部。
一个attribute可以是浮点数类型的标量,向量,或者矩阵。不可以是数组或则结构体
uniform 一致变量。在着色器执行期间一致变量的值是不变的。
与const常量不同的是,这个值在编译时期是未知的是由着色器外部初始化的。
一致变量在顶点着色器和片段着色器之间是共享的。它也只能在全局范围进行声明
varying 顶点着色器的输出。例如颜色或者纹理坐标,(插值后的数据)作为片段着色器的只读输入数据。
必须是全局范围声明的全局变量。可以是浮点数类型的标量,向量,矩阵,不能是数组或者结构体。
centorid varying 在没有多重采样的情况下,与varying是一样的意思。在多重采样时,
centorid varying 在光栅化的图形内部进行求值而不是在片段中心的固定位置求值。
invariant (不变量)用于表示顶点着色器的输出和任何匹配片段着色器的输入,在不同的着色器中计算产生的值必须是一致的。
所有的数据流和控制流,写入一个invariant变量的是一致的。编译器为了保证结果是完全一致的,需要放弃那些可能会导致不一致值的潜在的优化。
除非必要,不要使用这个修饰符。在多通道渲染中避免z-fighting可能会使用到。
in 用在函数的参数中,表示这个参数是输入的,在函数中改变这个值,并不会影响对调用的函数产生副作用。
相当于C语言的传值),这个是函数参数默认的修饰符
out 用在函数的参数中,表示该参数是输出参数,值是会改变的
inout 用在函数的参数,表示这个参数即是输入参数也是输出参数
个人总结:
变量修饰符
uniform 全局变量(由外部程序传递给vertex和fragment Shader的变量)
attribute 局部变量(只能在顶点Shader中用)
可以 浮点数类型的标量,向量,或者矩阵。float,vec2,mat
不可以 数组或则结构体
varying 共享变量(vs和fs共享用)
可以 浮点数类型的标量,向量,或者矩阵。float,vec2,mat
不可以 数组或则结构体
以下是例子:
const char* vs = {
...
"attribute vec4 _color;\n"
"varying vec4 _outColor;\n"