OpenGL 与 3D第 2 / 6 章
着色器与 GLSL
理解着色阶段、输入输出、Uniform 和 GLSL 数据类型。
着色器
着色器简介
本章资料 着色器 - LearnOpenGL CN
深入学习资料 The Book of Shaders
**概念定义:**着色器是一个把输入转换为输出的程序,相互之间不能通信,只能通过输入和输出传递数据
特点:
盲视: 相互不能通信
无记忆:一个线程不知道前一刻运行的任务
抽象性
着色器的要素
版本和模式(core),核心模式
输入和输出变量
main函数
着色器的类型 (仅可编程着色器)
顶点着色器
主要负责坐标位置、坐标系统的变换
主要从模型的局部坐标经过矩阵转换到世界坐标,再到观察空间,再到裁剪空间,然后裁剪、光栅化,送到片段着色器
🎉 提示
顶点着色器中,与顶点相关的数据通过VBO来传输,那么在threejs中,着色器是与材质挂钩的,如果公用材质,那么uniform也是相同的,不能根据不同的VBO来给mesh传递uniform, 这时一个可行的解决方案是通过一个texture来传递, 如batchedMesh的实现就是通过一个texture来存储不同的模型的matrix,所以,然后不同的模型通过meshid来获取的对应的matrix
片元着色器
主要接收光栅化后每个像素的信息,对像素点的颜色进行计算,包含光照等效果实现
几何着色器
用于改变片元的几何形状,光栅化的具体方式
小结
顶点着色器数量要远远少于片元着色器, 执行计算性能更优,但是效果往往没有在片元着色器中好,因为会有很多像素的是通过插值生成的,片元着色器直接就是每个像素的颜色值
着色器语言 GLSL (opengl shadering language)
in type in_variable_name; //输入变量
out type out_variable_name; //输出变量
uniform type uniform_variable_name //全局变量
- in 输入变量
- out 输出变量->向下一个着色器输出
- uniform 全局变量,着色器程序所有阶段(顶点、几何、片元)均可以访问,在着色器中不可修改,但可以在CPU中被更新
- 向量
- vecn 包含n个float分量的默认向量
- bvecn 包含n个bool分量的向量
- ivecn 包含n个int分量的向量
- uvecn 包含n个unsigned int分量的向量
- dvecn 包含n个double分量的向量
// 重组(Swizzling)
vec2 someVec;
vec4 differentVec = someVec.xyxx;
vec3 anotherVec = differentVec.zyw;
vec4 otherVec = someVec.xxxx + anotherVec.yxzy;
vec2 vect = vec2(0.5, 0.7);
vec4 result = vec4(vect, 0.0, 0.0);
vec4 otherResult = vec4(result.xyz, 1.0);