第一章 简介
nothing
第二章 渲染流水线
什么是流水线? 什么是管线
GPU渲染的过程就流水线。
Shader在管线中的位置? Shader能做到那些功能,做不到哪些?
为什么裁剪在顶点、几何着色器之后? 几何着色器可能会修改顶点。什么是DrawCall? DC为什么慢?
DrawCall就是CPU发起一次绘制请求,绘制相关的数据神马的都要告诉GPU,可以想象两个部门协作,交流成本自然就高了。
着色器需要完成什么?
- 顶点着色器首要任务是完成顶点坐标从模型空间到屏幕空间的转换。为什么片元着色器不能做这个? 因为片元着色器之前总得知道哪些像素要绘制吧,屏幕坐标都不知道话,一个三角形三个点,怎么变成屏幕上一个面呢?
- 顶点着色可以计算颜色,也可以不计算颜色。
- 片元着色器,可以针对每个像素操作。像素之间的操作是相互独立的,所以 1.>互相不知道数据 2.>可以并行操作。
第三章 Unity Shader基础
什么是材质?Unity中如何使用Shader?
什么是ShaderLab?如何写ShaderLab?
Unity提供的一种描述性语言,有自己的语法,比通常意义的Shader写起来要方便。
官方文档在这Shader "shaderName" { Properties { _Color ("Main Color", Color) = (1,.5,.5,1) } SubShader { Tags { ... } Pass { Tags { ... } CGPROGRAM // code here ENDCG } } Fallback "Diffuse" }
Fallback是用来干嘛的?
就是备用shader,后面的名称是一些内部shader的名字。如果前面的各种subshader都支持不了,总得有个Plan B吧。不过后面有些专门用来做屏幕后处理的Shader是不用这个的。
表面着色器是啥玩意?
Unity自己定义的着色器类型,背后最终自动翻译成顶点着色器和片元着色器。跟多光源打交道比较方便,背后可能生成多个pass什么的。
由Unity的渲染工程师Aras发明。这大佬认为顶点和片元着色器的抽象不对,应该划分成表面着色器、光照模型和光照着色器才对。对用户来说确实可能写起来比较简单。
第四章 学习Shader需要的数学基础
左手坐标系跟右手坐标系的区别,如何区分?Unity中使用的是左手还是右手?
Unity使用左手坐标系。但是,在观察空间中,使用右手坐标系。为什么呢?是惯例吗?还不清楚。
矢量、向量的运算
- 矢量的点积 A·B = |A||B|cosQ 可以用点积来判断两个向量的夹角。
- 向量 A⃗ A → 点乘单位向量 b⃗ b → ,结果为 A⃗ A → 在 b⃗ b → 上的投影大小。
- 叉乘的结果为垂直AB向量平面的向量,可以称为法向量。不满足交换律,AxB = -BxA
- 对于XYZ向量有一下公式: Z = X x Y Y = Z x X X = Y x Z 简单记忆就是式子中XYZ的顺序保持不变,循环使用,从左到右为 X->Y->Z->X->Y->Z
旋转的正方向?
左手坐标系中,相对旋转轴正方向顺时针为正方向。以左手大拇指朝向旋转轴正向,四指弯曲方向就是旋转方向正向。
矩阵的简单运算
AB≠BA(AB)C=A(BC)MI=IM=M(AB)T=BTAT(AB)−1=B−1A−1MM−1=M−1M=I(MT)T=M(M−1)−1=M(MT)−1=(M−1)TMv⃗ =v⃗ MT A B ≠ B A ( A B ) C = A ( B C ) M I = I M = M ( A B ) T = B T A T ( A B ) − 1 = B − 1 A − 1 M M − 1 = M − 1 M = I ( M T ) T = M ( M − 1 ) − 1 = M ( M T ) − 1 = ( M − 1 ) T M v → = v → M T
对于正交矩阵:
MTM=MMT=IMT=M−1 M T M = M M T = I M T = M − 1