初识OpenGL着色器语言
未完待续:
1、着色器架构
OpenGL着色器语言(GLSL)由OpenGL实现链接和编译,完全在图形硬件中运行。
至少需要两个着色器
- 顶点着色器
- 片段着色器。
- 还有一种可选的着色器称为几何着色器。
我们可以在3中方式中选择一种向顶点着色器传递数据:
- 参数,是对每个顶点而言的。
- 统一值,是针对整个顶点数据批次的常量。
- 加载和使用纹理数据。
可以为片段着色器设置统一值和纹理数据。
注意:将顶点属性发送到片段着色器毫无意义,因为片段着色器只是用来在土元进行光栅化后对片段进行填充(最基本的是像素)。
着色器程序的从入口点main函数开始。
2、变量和数据类型
数据类型:
- 整数(有符号和无符号)
- 浮点数(单精度)
布尔值
没有指针,且没意任何类型的字符串和字符。但函数可以还回这些类型的一种,也可以声明为void。
向量类型:
向量数据类型 | 描述 |
---|---|
vec2,vec3,vec4 | 2分量,3分量,4分量浮点向量 |
ivec2,ivec3,ivec4 | 2分量,3分量,4分量整数向量 |
uvec2,uvec3,uvec4 | 2分量,3分量,4分量无符号整数向量 |
bvec2,bvec3,bvec4 | 2分量,3分量,4分量布尔向量 |
我们可以使用一个“构造函数初始化一个向量。
例如:
vec4 vVertexPos = vec4(39.0f, 10.0f, 0.0f, 1.0f);
有关向量的操作:
vVertexPos = vOldPos + vOffset; //两个向量相加
vVertexPos = vNewPos; //赋值
vVertexPos = vec4(1.0f, 1.0f, 0.1f, 0.0f);
vVertexPos *= 5.0f; //进行缩放
可以对独立元素进行寻址:
1.典型情况下:
vVertexPos.x = 3.0f;
vVertexPos.xy = vec2(3.0f, 5.0f);
vVertexPos.xyz = vNewPos.xyz;
2.进行颜色操作时使用rgba:
vOutputColor.r = 1.0f;
3.进行纹理操作时用stpq。
4.向量类型还支持调换操作:
如:
vNewColor.bgra = vOtherVertex.x + 5.0f;
向量类型不只是着色器的本地数据类型,也是硬件的数据类型,速度很快。
矩阵类型:
所以的矩阵只支持浮点数。
矩阵类型 | 描述 |
---|---|
mat2,mat2x2 | 两行两列 |
mat3,mat3x3 | 三行三列 |
mat4,mat4x4 | 四行四列 |
mat2x3 | 两行三列 |
mat2x4 | 两行四列 |
mat3x2 | 三行两列 |
mat3x4 | 三行四列 |
mat4x2 |