Visual LabINTERACTIVE LEARNING
OpenGL 与 3D第 2 / 6 章

着色器与 GLSL

理解着色阶段、输入输出、Uniform 和 GLSL 数据类型。

OpenGLGLSL渲染管线
进阶预计 62 分钟查看源文 ↗

着色器

着色器简介

本章资料 着色器 - 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 //全局变量
  1. in 输入变量
  2. out 输出变量->向下一个着色器输出
  3. uniform 全局变量,着色器程序所有阶段(顶点、几何、片元)均可以访问,在着色器中不可修改,但可以在CPU中被更新
  4. 向量
  • 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);