UnityShader
渲染管线
为后续的渲染操作提供数据,包括顶点,材质,法线,纹理等。应用阶段由 CPU 负责,剔除不可见物体、整理渲染资源、优化合批、准备 Shader 参数、生成并提交 DrawCall,为 GPU 渲染做好全部前置准备。
渲染管线 指的是将三维场景中的网格、纹理、灯光等数据,最终转换成二维屏幕图像的一系列步骤。你可以把它想象成一个流水线,原料(模型数据)从一端进入,经过一系列加工(变换、光照、着色等),最终产品(像素图像)从另一端出来。(将数据分阶段变成屏幕图像的过程 应用阶段 -> 几何阶段 -> 光栅化阶段)
Unity 主要支持两种渲染管线:
- 1.内置渲染管线:Unity 传统的、固定的渲染管线。开发者对其流程的控制相对有限,主要通过设置影响一些开关和参数。
- 2.可编程渲染管线:Unity 现代的高端解决方案,允许开发者通过编写 C# 和 Shader 代码来完全控制和定制渲染的每一个阶段。主要包括:
- •Universal Render Pipeline:通用渲染管线,适用于所有平台(移动、PC、主机),是新项目的推荐选择。
- •High Definition Render Pipeline:高清渲染管线,用于追求高端图形效果的游戏和应用(如 PC、主机)。


几何阶段
图元
在图形编程中,图元 是指由 GPU 渲染的基本几何形状。它是构成所有复杂模型的基本 building block。
你可以把它想象成画家作画时的“基本笔触”——点、线、三角。任何复杂的 3D 模型,无论是角色、车辆还是场景,最终都会被分解成这些简单的图元,然后交由 GPU 进行绘制。
Unity Shader(以及 DirectX、OpenGL 等图形 API)主要支持以下三种图元类型:
- 点
- 线
- 三角形 (最重要的图元)
顶点着色器(几何阶段)
顶点着色器是几何阶段的第一个步骤。它的输入是原始的模型顶点数据(位置、法线、纹理坐标、顶点颜色等),输出是经过一系列变换和处理后的顶点数据。
它的主要任务是将模型的顶点从模型空间转换到齐次裁剪空间,以便后续阶段进行裁剪和屏幕映射。
- 坐标变换——顶点变换、法线变换、纹理坐标变换等
- 顶点属性处理——对顶点的其他属性进行处理,比如顶点颜色、透明度、切线向量等,可以用于实现顶点动画、着色、光照等效果
- 顶点插值——计算顶点属性的插值值
曲面细分着色器,几何着色器
裁剪
裁剪阶段会自动的将不在视野内和部分在视野内的图元(点、线、三角形)进行裁剪,我们可以进行一些配置,但是一般我们不需要进行任何处理,渲染管线会自
动帮助我们进行处理
几何阶段就是将顶点进行坐标转换,裁剪画面外的图元,也就是将模型的顶点从其本地坐标转换到最终的屏幕坐标中
光栅化阶段
像素
像素是计算机图形学中的基本概念,它是组成图像的最小可控单位具有位置和属性,用于表示图像中的颜色和其他信息它是二位图像中的一个点,每个像素都占据
屏幕上的一个固定位置
片元
在渲染管线中,片元是指在光栅化阶段生成的像素或像素
片段片元是渲染管线中进行像素级别操作和计算的基本单位每个片元代表了屏幕上的一个像素,并且具有位置信息和与之相关的属性比如:颜色、深度值、法线等等
光栅化阶段的操作
渲染管线的光栅化阶段同样由GPU主导,同样我们无法拥有绝对的控制权,同样GPU为我们开放了部分控制权。
光栅化阶段主要做的事情是根据几何阶段输入的信息计算每个图元覆盖哪些像素,以及为这些像素计算他们的颜色等等工作
三角形设置
几何阶段输入到光栅化阶段的数据主要是三角形网格的顶点信息,我们得到的只是三角形网格每条边的两个端点信息如果想要得到整个三角形网格对像素的覆盖情
况,就必须计算每条边上的像素坐标,为了能计算三角形边界像素的坐标信息,我们必须得到三角形边界的表示方式。
在三角形设置这个小阶段,GPU主要做的事情就是计算三角形网格的表示数据
三角形遍历
该阶段主要根据三角形设置中计算出的三角形网格数据检查每个像素是否被一个三角形网格所覆盖。
如果覆盖的话,就会生成一个片元(包含屏幕坐标、深度、法线等等信息)这个阶段也被成为扫描变换。
在三角形遍历这个小阶段GPU主要做的事情就是根据三角形网格信息得到被它们覆盖的片元序列
片元着色器(像素着色器)
它主要完成对三角形遍历输入的片元序列中的每个片元(像素)的着色计算和属性处理
片元着色器需要完成的工作主要有:
1.光照计算——计算片元的光照效果
2.纹理映射——根据片元在纹理中的位置,对纹理进行采样,将纹理颜色映射到片元上,实现表面贴图效果
3.材质属性处理——根据材质的属性,比如颜色、透明度、反射率等,计算片元的最终颜色和透明度
4.阴影计算——根据光源等信息,计算片元是否处于阴影中,影响其最终颜色
等等对于我们来说片元着色器是完全可编程的
逐片元操作
它主要完成对片元着色器输出数据(最终颜色、法线、纹理坐标、深度等)进行各种处理和计算逐片元操作主要完成的工作主要有:
1.决定每个片元的可见性,比如深度测试、模板测试
2.如果通过了所有测试,需要把片元的颜色值和已经存储在颜色缓冲区的颜色进行合并(混合)
在渲染管线(流水线)的光栅化阶段,最主要做的工作就是对片元(像素)进行最终处理最主要完成的就是确定片元(像素)最终是否渲染到屏幕上并且确定其的最终渲染的颜色效果
Shader开发
shader就是着色器,用于编写图形表现效果的程序 代码。
Shader开发的本质:通过对渲染管线中的数据进行自定义处理来决定最终的渲染效果简而言之通过Shader代码来处理渲染数据
逆矩阵 - 正交矩阵 - 行矩阵和列矩阵
矩阵的几何意义:矩阵的变化(包括平移,旋转,缩放)
齐次坐标
矩阵的齐次坐标:它是通过引入一个额外的维度来扩展传统的笛卡尔坐标系,就是将一个原本是n维的向量或矩阵用n+1维来表示,让我们可以更方便的进行几何
变换和矩阵运算。
举例:三维空间中有一个向量或点(x,y,z),它对应的齐次坐标就是给它加一维,变成(x,y,z,w),其中w值的改变可以让它有具有不同的含义。
作用:
- 可以通过齐次坐标,明确的区分点和向量:(三维空间中的(x,y,z),它既可以表示点,也可以表示向量。那么我们可以利用齐次坐标给它加一维,变成(x,y,z,w),其中W=1时代表是一个点,W=0时代表一个向量。这样我们就可以明确它是点还是向量了)
- 3X3的矩阵不能直接表示平移变换,它只能表示线性变换,也就是只能描述对象的旋转,缩放等线性变换,而不能描述对象的平移
逆矩阵
1.逆矩阵必须是方阵,并且行列式不为0
2.逆矩阵为伴随矩阵的转置 / 行列式
性质:矩阵 * 矩阵的逆矩阵 = 单位矩阵
正交矩阵
一个方阵和它的转置矩阵相乘为单位矩阵,那么它就是正交矩阵
它的列向量是标准正交的:矩阵的每一列都是一个单位向量(长度为1),并且任意两列之间都垂直(内积为0)。
它的行向量是标准正交的:矩阵的每一行都是一个单位向量,并且任意两行之间都垂直。
它的转置就是它的逆:这是最常用、最简洁的定义方式。
Qᵀ * Q = Q * Qᵀ = I其中
Qᵀ是 Q 的转置矩阵,I是单位矩阵。
根据这个定义,我们可以立即得到一个重要性质:
如果 Q 是正交矩阵,那么它的逆矩阵非常容易求:Q⁻¹ = Qᵀ。 这避免了复杂的求逆计算。
平移矩阵


点的计算

向量的计算

旋转矩阵
缩放矩阵


先缩放,在旋转,后平移
坐标空间转换


v



