当前位置:   article > 正文

Shader入门精要-1-渲染流水线&数学基础_shader水入门

shader水入门

渲染流水线

  • 应用阶段
    应用程序进行的数据准备

    • 将(纹理,网格,顶点颜色,纹理坐标,法线等)数据加载到显存
    • 设置渲染状态(网格的材质,着色器,光源等设置)
    • 调用DrawCall(CPU调用GPU,GPU开始渲染)[指向一个需要被渲染的图元列表]
  • 几何阶段

    • 顶点着色器
    • 曲面细分着色器
    • 几何着色器
    • 剪裁
    • 屏幕映射
  • 光栅化阶段

    • 三角形设置
    • 三角形遍历
    • 片元着色器
    • 逐片元操作

基础数学知识

插个博客学习知识

坐标系

unity在模型空间使用左手坐标系
unity在世界空间使用左手坐标系
unity在观察空间使用右手坐标系对左手来说摄像机的前向是-z轴

二维坐标系:可以通过翻转旋转形成等阶坐标系
二维坐标系
三维坐标系:通过旋转并不能转换成相同的坐标系,有两种旋转方向

  • 左手坐标系:unity使用左手坐标系
  • 右手坐标系:
    在这里插入图片描述
    左右坐标系对应程序来说,一般不管是使用左手还是右手的程序都是将x指向右方向,y指向上方向,然后,左手坐标系z指向屏幕里,右手z指向自己

数学模型

标量

矢量:相对于某个位置的偏移;

加减: 对应分量相加减

几何意义:三角形定则
在这里插入图片描述
向量b相对于向量a的偏移,b-a

矢量的模:根号下各个分量的平方和

在这里插入图片描述

矢量和点:将矢量的尾移到坐标原点,则点和矢量的表示就重合了。
矢量和标量:

只有乘除没有加减,且矢量只能被除
k*a = (kVx,kVy,kVz) a/k=(Vx/k,Vy/k,Vz/k)
几何意义:对矢量进行缩放

矢量相乘
点乘(点积,内积,dot) 结果是 标量

在这里插入图片描述

几何意义:一个矢量在另一个矢量上的投影(0垂直,大于0夹角小于90度,小于0夹角大于90度)
a·b=b·a
a·b=ax·bx+ay·by+az·bz
性质
几何意义:两个向量的模相乘再乘以夹角的余弦值
在这里插入图片描述

叉乘(叉积,外积,cross) 结果是 矢量
  • 叉积的模:
    |axb|=|a||b|sinθ
  • 叉积的方向:
    垂直两个向量,方向依照右手(左手)坐标系由(0°≤θ≤180°)右手(左手)定则决定
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

单位矢量(被归一化的矢量):模为1的矢量

归一化:把非零矢量转换成单位矢量的过程
单位矢量=a/|a|

矩阵 可以表示一个变换

在理解矩阵前其实可以先看看平面方程 直线方程,什么点法式,一般式等,更能理解方程和几何意义的关系

插 函数知识

函数

定义域 值域 对应法则
自变量 因变量
函数 不等式 方程 相关联
百度搜线性函数 甚至可以看到 仿射变换和 线性映射

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方块矩阵(方阵)
对角矩阵

在这里插入图片描述

单位矩阵

在这里插入图片描述

转置矩阵

在这里插入图片描述

逆矩阵 可以还原一个变换

在这里插入图片描述

正交矩阵

在这里插入图片描述
当时看到这个c1,c2,c3就蒙圈了,看不下去了,不懂这个怎么来的,今天可算让我懂了,看这里
就是基向量的缩写

矩阵几何意义

推导看这个挺好的

变换
线性变换

满足矢量加和标量乘
在这里插入图片描述

齐次坐标 基础变换矩阵 平移矩阵

在这里插入图片描述
在这里插入图片描述

缩放矩阵

在这里插入图片描述

旋转矩阵

在这里插入图片描述
如果旋转多个轴时,在unity中是按照先z轴再x轴再y轴旋转的。
在这里插入图片描述

复合变换

先缩放,再旋转,再平移
在这里插入图片描述

矩阵再次理解

没来得及看

在一个三维坐标系下的一个向量,可以用这个坐标系的基向量来表示:即若这个向量为(a,b,c);它可以表示为:(a,b,c)=ax+by+cz;

而当一个矩阵和向量相乘时,可以看成矩阵的每一行都是一个基向量(此处把向量看成行矩阵);所以说:矩阵相乘就是一个坐标系的变换,即变成了由(矩阵第一行,矩阵第二行,矩阵第三行)为基向量的坐标系。

这里是列向量
在这里插入图片描述

Unity中使用矩阵

把矢量变换成列矩阵,进行右乘
从右至左进行计算
先缩放,再旋转,最后平移
旋转是按照z,x,y来的

坐标空间变换

推导空间变换矩阵

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
总结:只要知道一个坐标系原点的相对位置,和该坐标系的基矢量,就能获得这个坐标系相对于另一坐标系的转换矩阵

unity中存在的几个坐标空间变换

首先:变换坐标系需要的两个量:相对原点,三个基矢量

  1. 模型到世界:
    正常按照推导变换矩阵的公式推就行,unity中根transform组件提供相对于世界坐标系的位置(模型坐标系原点即模型根位置),以及基矢量三个坐标轴;
  2. 世界到相机:
    【相对原点】世界变换到相机,即 相机当前transform位置是原点位置,所以相机位置需要取反,这样就是原点位置相对于相机位置。
    【三个基矢量】然后通过相机transform的旋转,可以知道,世界坐标系的三个基矢量由 相机进行相反旋转可以得到新的基矢量。
    满足得到变换矩阵条件。
    上述在书里的另一个思路:
    将相机想象到世界坐标原点,且坐标轴重合(观察中);相反平移,相反旋转,即可。

因为相机空间是右手坐标系,需要把结果z轴翻转(实际书写中)

  1. 相机到剪裁:
    通过相机的视锥体来决定;从三维降到二维
  • 正交
    视锥体是长方体,无空间感
  • 透视
    视锥体是梯形,有空间感

通过视锥体来剪裁图形比较麻烦,所以引入投影矩阵

投影矩阵:不进行降维操作,降维在屏幕映射阶段
透视投影:
正交投影:

  1. 剪裁到屏幕:
    齐次除法,透视除法, 归一化的设备坐标(NDC)

在对法线进行变换计算时:

直接用变换顶点的矩阵去变换法线,法线方向可能是错误的。
在这里插入图片描述
切线不受影响,同时切线和法线相互垂直,所以 使用原变换矩阵的逆转置矩阵 来变换即可。

变换矩阵如果是正交矩阵,即只包含旋转和统一缩放。那么就可以用原变换矩阵来变换。
在这里插入图片描述

Shader

shader内置变换矩阵

在这里插入图片描述

shader中的相机参数

在这里插入图片描述

数据类型

行列矩阵或者向量:float3 float4
矩阵:float3x3 float4x4
矩阵相乘:mul()

CG里矩阵是按行索引 (unity脚本里的Matrix4x4是按列索引)

到这暂且算基础完,剪裁空间 的 投影转换 还不懂 屏幕投射也放以后再看。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/107603
推荐阅读
相关标签
  

闽ICP备14008679号