Hor Shader入门(2)--图形学用到数学部分简单介绍

15
回复
3050
查看
打印 上一主题 下一主题
[ 复制链接 ]

2

主题

14

帖子

34

积分

Rank: 9Rank: 9Rank: 9

UID
324078
好友
1
蛮牛币
36
威望
0
注册时间
2019-6-5
在线时间
18 小时
最后登录
2020-1-16

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 Hor 于 2019-11-5 15:44 编辑

数学部分(除开矩阵,这个应该是初中的数学没人反对吧?)坐标系:
  • 分左手坐标系,右手坐标系,区别主要在于 z 轴的指向
  • unity用的是左手坐标系
  • 本地坐标系
    • 物体本身坐标系
    • 在unity中假如reset的话,那本地坐标系和世界对应的坐标系一致

  • 世界坐标系
    • 例如本身坐标进行旋转,本地坐标变了,但世界坐标没变

  • 摄像机坐标系
    • 摄像机坐标系也属于一种本地坐标,对于摄像机坐标的操作会影响摄像机的视野范围

      • 而在视野范围的会被保留交给GPU去进行图形的渲染,视野范围外的会被剔除


  • 屏幕坐标系
    • 屏幕坐标是个二维坐标系,将游戏里面的三维坐标投影成屏幕坐标然后输出,这样我们才能看到。


- 向量:
  • 向量的定义:一个有方向又具有大小的有像线段
  • 向量运算:
    • 加法
      • 假设有两个向量:v1(0,1)   ;      v2(1,1)
      • 那么相加可得:v3 = v1+v2 = (0+1,1+1) = (1,2)

    • 减法
      • 和向量加法类似
      • v1,v2相减可得:v3 = v1-v2 = (0-1,1-1) = (-1,0)
      • 得到得是由v2得终点指向v1的终点的有向线段

    • 点乘
      • 向量的点乘得到的是一个常数,不再是向量
      • v1 * v2  = (0,1) *(1,1) = 0 * 1+1*1 = 1
      • 点乘意义:

        • 由于向量v1 * v2 = |v1||v2|cosA
        • 所以当知道向量v1 ,v2就能求他们之间的夹角


    • 叉乘
      • 叉乘相乘得到的还是一个向量,且这个向量为垂直于v1,v2所组成平面的法向量。
      • 向量a X b 和向量 b X a 得到的法向量的方向相反。
      • 假如 向量a(1,1,1) ; 向量b(0,1,0)
      • a X b = (1 * 0 - 1 * 1,1 * 0 - 1 * 0,1 * 1-1*0) = (-1,0,1)
      • 因为我们所有看到的面对应的法向量是面向我们的,有些情况下看不到很可能就是法向量的方向反了。


  • 矩阵
    • 矩阵要说的比较多,也是学习shader的一大数学阻碍,这里不展开说,只说其中的 对于shader的意义,具体可以百度去了解矩阵所需要掌握的知识
    • 意义:用于变换,比如坐标的平移,旋转,缩放都可以用矩阵去表示,还有颜色等变换等
    • 以平移变换矩阵为例子,假设向量a(1,1,1)想要向Y轴上平移n个单(1,1+n,1)那么我们就想向量a乘什么的矩阵会等于(1,1+n,1),下面就是这个矩阵,具体怎么得到的,需要去了解矩阵的乘法;(7字形乘法,这样比较好记,哈哈)
    • [1,0,0]
    • [0,1,0]
    • [0,n,1]


CG数学函数(shader用到的函数):
  • bs(x)  返回输入参数的绝对值;
  • acos(x) 反余弦函数,输入参数范围[-1,1],返回[0,π]区间的角度值;
  • all(x) 如果输入的参数均不为0,则返回true,否则返回false;
  • any(x) 输入的参数只要有一个不为0,则返回true;
  • asin(x) 反正弦函数,输入的参数取值区间[-1,1],返回角度值范围为[-π/2,π/2];
  • atan(x) 反正切函数,返回角度值范围[-π/2,π/2];
  • atan2(y,x) 计算y/x的反正切值;
  • ceil(x) 对输入的参数向上取整;
  • clamp(x,a,b) 如果x小于a,返回a;x大于b,则返回b;否则,返回x;
  • cos(x) 返回x的余弦值,返回值范围[-1,1];
  • cosh(x) 双曲余弦函数,计算x的双曲余弦值;
  • cross(A,B) 返回两个三元向量的叉积,注意参数必须是三元向量;
  • degrees(x) 输入参数为弧度值,函数将其转换为角度值;
  • determinant(m) 计算矩阵的行列式因子;
  • dot(A,B) 返回A和B的点积,参数可以是标量,也可以是向量;
  • exp(x) 计算e^x的值,e=2.71828;
  • exp2(x) 计算2^x的值;
  • floor(x) 对输入的参数向下取整;
  • fmod(x,y) 返回x/y的余数。如果y为0,结果不可预料;
  • frac(x)  返回标量或者是每个向量组件的分数部分;
  • frexp(x,out exp) 将浮点数x分解为尾数和指数,x=m*2^exp返回m,并将指数存入exp中,如果x为0,则尾数和指数都返回0;(不是很明白?)
  • isfinite(x) 判断标量或者向量中的每个数据是否是无限,如果是返回true,否则返回false;
  • isnan(x) 判断标量或者向量中的每个数据是否是非数据,如果是返回true,否则返回false;
  • ldexp(x,n) 计算x(2^n)的值;
  • lerp(a,b,f) 计算(1-f)a + bf 或者 a+f(b-a)的值,即在下限a和上限b之间进行插值,f表示权值。注意,如果a和b是向量,则权值f必须是标量或者等长的向量;
  • lit(NdotL,NdotH,m)  N表示法向量。L表示入射光向量。H表示半角向量。m表示高光向量。函数计算环境光,散射光,镜面光的贡献,返回四元向量: X表示环境光的贡献,总是1;Y表示散射光的贡献,如果N.L<0,则为0,否则为N.L; Z表示镜面光的贡献,如果N.L<0或者N.H<0,则为0;否则为(N.H)^m;W始终为1;
  • log(x)    计算ln(x)的值,x必须大于0;
  • log2(x) 计算log2^x的值,x必须大于0;
  • log10(x) 计算log10^x的值,x必须大于0;
  • max(a,b) 比较两个标量或者等长向量元素,返回最大值;
  • min(a,b) 比较两个标量或者等长向量元素,返回最小值;
  • mul(M,N) 计算两个矩阵相乘,如果M为AxB矩阵,N为BxC矩阵,则返回AxC矩阵;
  • mul(M,v)  计算矩阵和向量相乘;
  • mul(v,M) 计算向量与矩阵相乘;
  • noise(x)  噪声函数,返回值始终在0-1之间,对于同样的输入,返回相同的值(也就是说并不是真正意义上的随机噪声);
  • pow(x,y)  表示x^y;
  • radians(x) 函数将角度值转换成弧度值;
  • round(x)  四舍五入;
  • saturate(x) 如果x小于0,返回0;如果x大于1,返回1;否则返回x;
  • sign(x) 符号函数 ,如果x大于0,返回1;如果小于0,返回-1;否则返回0;
  • sin(x)  输入参数为弧度,计算正弦值,返回值范围[-1,1];
  • sincos(float x ,out s, out c)  该函数是同时计算x的sin值和cos值,其中s=sin(x),c=cos(x),这样比分开计算要快;
  • smoothstep(min,max,x)  x位于min和max之间,若x=min,返回0;若x=max,返回1;若x在两者之间,按下列公式返回数据:-2((x-min)/(max-min))^3+3((x-min)/(max-min))^2;
  • step(a,x)  若x< a,返回0,否则返回1;
  • sqrt(x)  求x的平方根,x必须大于0;
  • tan(x)  输入参数为弧度,计算正切值;
  • tanh(x) 计算双曲正切值;
  • transpose(M)   M为矩阵,计算其转置矩阵;  

2,几何函数
  • 几何函数,用于执行和解析几何相关计算,如根据入射光向量和顶点法向量,求反射光和折射光的方向向量。
  • distance(pt1,pt2)  两点之间的欧几里得距离;
  • faceforword(N,I,Ng)   若Ng*I<0,返回N,否则返回-N;=
  • length(v)  返回一个向量的模;
  • normalize(v) 归一化向量;
  • reflect(I,N)   根据入射光方向向量,和顶点法向量N,计算反射光方向向量,其中I和N必须被归一化,需要注意的是:这个I是指向顶点的;函数只对三元向量有效;
  • refract(I,N,eta)  计算折射向量,I为入射光线,N为法向量,eta为折射系数;其中I和N必须被归一化,如果I和N之间夹角太大,则返回(0,0,0),也就是没有折射光线;函数只对三元向量有效;

3.纹理映射函数
  • tex1D(sampler1D tex,float s)  一维纹理查询;
  • tex1D(sampler1D tex, float s, float dsdx, float dsdy)   使用导数值查询一维纹理;
  • Tex1Dproj(sampler1D tex, float2 sq)  一维投影纹理查询;
  • Tex2D(sampler2D tex,float2 s)  二维查询纹理;
  • Tex2Dproj(sampler2D tex, float4 szq) 二维投影纹理查询;
  • Tex3D(sampler3D tex, float s)   三维纹理查询;
  • Tex3Dproj(sampler3D tex, float4 szq)   查询三维投影纹理,并进行深度值比较;
  • texCUBE(samplerCUBE tex, float3 s)    查询立方体纹理;
  • texCUBEproj (samplerCUBE tex, float4 sq)    查询立方体投影纹理;

  • 偏导函数**ddx(a) 参数a对应一个像素位置,返回该像素值在X轴的偏导数;ddy(a)  参数a对应一个像素位置,返回该像素值在X轴上的偏导数;
  • 调试函数**void debug(float4 x)    如果在编译时设置了debug,片段着色程序中调用该函数可以将值x作为COLOR语义的最终输出,否则该函数什么也不做;





1

主题

10

帖子

17

积分

Rank: 1

UID
201799
好友
0
蛮牛币
10
威望
0
注册时间
2017-1-14
在线时间
7 小时
最后登录
2019-11-25
沙发
2019-11-11 20:10:13 只看该作者
感谢分享
3偶尔光临
196/300
排名
25425
昨日变化

0

主题

65

帖子

196

积分

Rank: 3Rank: 3Rank: 3

UID
119006
好友
0
蛮牛币
1
威望
0
注册时间
2015-8-20
在线时间
115 小时
最后登录
2020-5-29
板凳
2019-11-11 20:30:08 只看该作者
感谢分享

0

主题

3

帖子

4

积分

Rank: 1

UID
335046
好友
0
蛮牛币
0
威望
0
注册时间
2019-10-30
在线时间
1 小时
最后登录
2019-11-14
地板
2019-11-14 12:17:32 只看该作者
谢谢楼主,十分有用

0

主题

14

帖子

35

积分

Rank: 1

UID
329644
好友
0
蛮牛币
15
威望
0
注册时间
2019-8-17
在线时间
21 小时
最后登录
2019-11-20
5#
2019-11-16 09:58:37 只看该作者
6666666666
7日久生情
3956/5000
排名
326
昨日变化

7

主题

575

帖子

3956

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
100070
好友
1
蛮牛币
10
威望
0
注册时间
2015-5-13
在线时间
1539 小时
最后登录
2020-6-18

活力之星

6#
2019-11-25 17:32:04 只看该作者
感谢分享
排名
64945
昨日变化

0

主题

12

帖子

17

积分

Rank: 1

UID
169072
好友
0
蛮牛币
25
威望
0
注册时间
2016-9-18
在线时间
6 小时
最后登录
2020-4-30
7#
2019-11-28 16:32:17 只看该作者
谢谢分享!!!!!!!

0

主题

43

帖子

55

积分

Rank: 2Rank: 2

UID
335753
好友
0
蛮牛币
72
威望
0
注册时间
2019-11-12
在线时间
12 小时
最后登录
2019-12-19
8#
2019-12-2 18:59:59 只看该作者
看的来 学不来
3偶尔光临
228/300
排名
15589
昨日变化

0

主题

50

帖子

228

积分

Rank: 3Rank: 3Rank: 3

UID
257797
好友
0
蛮牛币
7
威望
0
注册时间
2017-12-4
在线时间
130 小时
最后登录
2020-7-3
9#
2019-12-17 17:51:52 只看该作者
感谢分享
排名
64945
昨日变化

0

主题

17

帖子

67

积分

Rank: 2Rank: 2

UID
221022
好友
0
蛮牛币
14
威望
0
注册时间
2017-5-7
在线时间
48 小时
最后登录
2020-6-23
10#
2019-12-24 10:08:01 只看该作者
感谢分享

0

主题

5

帖子

7

积分

Rank: 1

UID
339554
好友
0
蛮牛币
6
威望
0
注册时间
2020-1-14
在线时间
2 小时
最后登录
2020-1-14
11#
2020-1-14 17:38:06 只看该作者
技术贴,已经收藏
5熟悉之中
641/1000

0

主题

14

帖子

641

积分

Rank: 5Rank: 5

UID
339884
好友
0
蛮牛币
379
威望
0
注册时间
2020-1-23
在线时间
627 小时
最后登录
2020-7-4
12#
2020-1-27 12:45:43 只看该作者
谢谢楼主分享~~
排名
34890
昨日变化

0

主题

23

帖子

45

积分

Rank: 1

UID
57941
好友
0
蛮牛币
13
威望
0
注册时间
2014-11-27
在线时间
14 小时
最后登录
2020-4-21
13#
2020-2-21 20:27:19 只看该作者
好 感谢分享
2初来乍到
149/150
排名
18293
昨日变化

0

主题

29

帖子

149

积分

Rank: 2Rank: 2

UID
268303
好友
0
蛮牛币
199
威望
0
注册时间
2018-2-9
在线时间
86 小时
最后登录
2020-6-23
14#
2020-6-4 15:32:51 只看该作者
摄像机不是右手坐标系的么
排名
64945
昨日变化

0

主题

9

帖子

14

积分

Rank: 1

UID
233098
好友
0
蛮牛币
0
威望
0
注册时间
2017-7-19
在线时间
3 小时
最后登录
2020-6-13
15#
2020-6-12 17:49:07 只看该作者
混分真难
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

,