01.导读

02.学前须知

03.计算机图形学相关理论

GLSL

OpenGL 着色器编程语言(OpenGL Shading Language), 是用来在OpenGL中编写着色器的语言, 是一种具有C/C++风格的高级语言.

HLSL

高级着色器语言(High Level Shader Language), 是由微软拥有及开发的一种着色器语言, 主要用于Direct3D, 不与OpenGL标准兼容, 与Nvidia的CG非常相似.

CG

C for Graphic, 简称 Cg语言, Cg是由Nvidia与微软相互协作开发的一种高级着色器语言, 与HLSL非常相似.

Unity 中编写ShaderLab来通过OpenGL/DirectX告诉显卡驱动要做什么, 然后显卡驱动在指挥GPU进行计算并输出到显示器上.

04.Shader编程初识

Shader 是什么?

  • Shader 就是着色器.
  • Shader 其实就是专门用来渲染图形的一种技术, 通过Shader, 我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果.
  • Shader 其实就是一段代码, 用于告诉GPU如何去绘制模型每一个顶点的颜色(顶点相关的一些数据, 顶点的法线, 顶点的UV…)以及最终像素的颜色.

Shader 可视化编辑器

  • Shader forge
  • Amplify Shader Editor
  • Shader Graph

ShaderLab 的几种形式

  • 固定管线着色器(Fixed Function Shader)..(已淘汰, 仅了解)
  • 表面着色器(Surface Shader) (更符合人类的思维逻辑, 偏表面属性的着色器)
  • 顶点片断着色器(Vertex/Fragment Shader)

ShaderLab 模版

  • Standard Surface Shader (对应上面的表面着色器)
  • Unlit Shader (不受光照的Shader, 但是仍然可以添加各种光照, 代码层面上是顶点片断着色器)
  • Image Effect Shader (后处理Shader, 屏幕后处理, 屏幕整体调色)
  • Compute Shader (运行在GPU上的代码, 独立于普通渲染管线以外的, 通常做一些大量的并行运算)
  • Ray Tracing Shader (光线跟踪Shader)

Shader 代码框架

Shader 方法函数

CGPROGRAM/ENDCG

  •  用于定义CG语言的开始与结束
  • Cg/HLSL代码放于此内
  • 顶点着色器和片断着色器都在这其中

#Pragma vertex name

  • #pragma 是编译指令, 这里表示定义了叫name的顶点着色器

#Pragma fragment name

  • 这里表示定义了叫name的片断着色器

Shader 变量与数据类型

  • float  常用于 位置属性或者说UV的时候, 需要很大的一个精度
  • half   常用于 方向, 颜色(非HDR颜色可以用fixed),  法线  (URP中使用half代替了fixed, half的精度为16位,范围从-60000到60000)
  • fixed  (淘汰)
  • Integer 常用于 数组索引, 在OpenGL 2.0 / DirectX3D 9 会自动把定义的整形转换成 float, 因为硬件不支持,  在 OpenGL 3.0+ / DirectX3D 11+ 支持整形
  • sampler2D  采样贴图, 最常见的贴图
  • samplerCUBE 6个面的贴图

PC 只认 float, 移动端可以按需使用 float  / half / fixed 做到一些性能的提升.

05.顶点着色器

1.顶点与三角面

2.结构与语义

顶点的多个属性信息(Struct) -> 顶点数据 -> 应用程序阶段数据 -> 顶点着色器

  • 顶点位置
  • 顶点UV坐标
  • 顶点法线
  • 顶点颜色
  • 顶点索引Id

3.结构的初始化与返回

顶点的多个属性信息(appdata) -> 顶点着色器(-> v2f)片断着色器

4.坐标系

  • 2D坐标系: 只有两个维度的坐标系,用于描述二维空间,比如X轴和Y轴
  • 3D坐标系: 拥有三个轴向的坐标系,主要用于描述三维空间,比如X轴、Y轴和Z轴
  • Unity 是左手坐标系,  3DMAX 是右手.

5.裁剪和投影

6.模型本地空间

7.CGInclude

  • HLSLSupport.cginc 编译CGPROGRAM时自动包含此文件, 其中声明了很多预处理宏帮助多平台开发.
  • UnityShaderVariables.cginc 编译CGPROGRAM时自动包含此文件, 其中声明了很多各种内置的全局变量.
  • UnityCG.cginc 需要手动添加, 其中声明了很多内置的帮助函数与结构.
  • Windows {unity install path}/Data/CGIncludes/xxx.cginc
  • Max /Applications/Unity/Unity.app/Contents/CGIncludes/xxx.cginc

8.空间变换

本地空间->(模型变换)->世界空间->(视图变换)->相机空间->(投影变换)->裁剪空间

矩阵变换运算符  mul(M,V);  M=矩阵   V=向量

模型的本地空间到齐次裁剪空间

UnityObjectToClipPos(v.vertex);

o.pos = mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, v.vertex));

9.屏幕映射

10.为什么一个Cube有24个顶点

“如果一个顶点, 它真的是一个顶点,那么,它就只有一个顶点!”

06.片段着色器

1.光栅化

  • 三角形设置 根据点组装成一个个三角形
  • 三角形遍历 遍历找出所有属于对应三角形的片断
  • 插值 利用顶点数据对片断进行插值

2.片断着色器

在片断着色器里, 可以自由的去定义每一个像素的颜色, 可以用各种算法去决定每一个像素最终输出到屏幕上的时候是什么样的效果

分量 rgba xyzw

3.顶点与片断的区别

能在顶点里面做的事情绝不再片断里面做.

07.作业

1.输出一个颜色

08.材质属性

1.材质属性 Properties

  • Type -> Color 颜色
  • Type -> Int 整数
  • Type -> Float 浮点数
  • Type -> Vector 四维向量
  • Type -> 2D 纹理
  • Type -> 3D 纹理
  • Type -> Cube 立方体纹理

2.Color、Int、Float、Vector、2D纹理, 常用通用特征

09.自发光角色材质

1.需求分析

2.纹理相关概念

像素和纹素

3.纹理的采样

  • 属性定义 _MainTex(“Tex”, 2D) = “white”{}
  • CG中声明 sampler2D _MainTex;
  • 着色器中采样 fixed4 tex = tex2D(_MainTex, i.uv);

4.Shader与材质的关系

一个Shader对应多个材质

5.基本运算符

6.片断的舍弃Clip

Clip(x)  如果x < 0 则舍弃掉此片断 对片断的舍弃所以只能在片断里使用

7.UV的Tiling与Offset

8.图形计算器

  • https://www.desmos.com
  • https://www.geogebra.org/graphing
  • Grapher(MacOS自带)

9.优化溶解效果 (处理溶解边缘信息)

smoothstep(min, max, x); // 在两个值直接平滑过渡 (尽量不使用此函数)

  • 如果 x 比 min 小, 返回 0
  • 如果 x 比 max 大, 返回 1
  • 如果 x 处于范围[min, max]中, 则返回0 和 1 之间的平滑值

saturate(x)

  • 如果 x 比 min 小, 返回 0
  • 如果 x 比 max 大, 返回 1
  • 如果 x 在0~1之间, 返回 x

10.变体之multi_complile

什么是变体?

变体的优缺点

  • 可将多个功能与效果集成到一个Shader,便于使用管理.
  • 变体数量过多会导致加载时间过长内存占用增加.

变体的类型 (有两种不同的类型)

  • 1.无论如何都会被编译的变体.  (动态开关的功能..)
  • 2.通过材质的使用情况来决定是否编译的变体.

变体的声明

  • #pragma multi_compile _ NAME

  • 变体名必须为全大写

  • 可通过添加 _ 来定义一个默认空的变体

  • 变体名字必须跟属性名一致, 变体名保持大写 后加 _ON

10.作业

模型的本地坐标当做颜色输出.

11.常用内置函数解析(上)

1.基本运算符

2.UV的引用

3.abs和frac

4.floor和ceil

5.max和min

6.pow和rcp

7.exp和exp2

8.fmod

9.saturate和clamp

10.sqrt和rsqrt

12.常用内置函数解析(下)

1.lerp

2.sin和cos

3.distance和length

4.step

5.smoothstep

示例

13.缓冲区

1.帧缓冲区

帧缓冲区也叫做帧缓存,  是用于存放一帧中数据信息的容器.

片断写入帧缓冲之前会按顺序经历一系列的测试

  • Alpha测试
  • 模版测试
  • 深度测试

片断写入帧缓冲之时也会进行一些运算操作

  • 混合

帧缓冲跟显示器的关系

  • 随机扫描显示器 (很多年就被淘汰了)
  • 光栅扫描显示器 (现在都是这种)

帧缓冲的方式

  • 单缓冲
  • 双缓冲

 

 

 

有哪些缓冲区

  • Depth Buffer (深度缓冲区)
  • Color Buffer (颜色缓冲区)
  • Stencil Buffer (模版缓冲区)
  • 自定义缓冲区

2.颜色缓冲区

存储每帧颜色信息的缓冲区

1bit / 24bit

1920×1080分辨率的颜色缓冲占用多少显存呢?

1920*1080*3/1024/1024 = 5.93MB

清除缓冲区

Clear (color + Z + stencil)

3.帧调试器FrameDebugger

14.特效通用材质

1.需求分析

2.渲染排序

3.混合模式Blend

4.面剔除Cull

5.Shader中的时间_Time

6.遮罩的实现

7.UV扭曲效果的实现

8.变体之shader_feature

9.CustomData

15.作业

1.纹理与UV

16.屏幕扭曲材质

1.需求分析

2.屏幕坐标

3.屏幕抓取GrabPass

4.扭曲的实现

5.再议屏幕坐标

6.最简屏幕坐标

17.UI材质

1.UI材质需求分析

2.UIShader的基础功能

3.PerRendererData

4.UI组件中的调色

5.什么是模版测试

6.Shader中实现模版测试Stencil

7.二进制

8.通道ColorMask

9.遮罩RectMask2D的支持

10.UI材质去色功能的实现

18.作业

1.Blend混合

2.模版测试Stencil

19.光学与颜色

1.光学简史

2.图形学中的几何光学

20.点与向量

1.点与向量

2.向量的点积

3.向量的叉积

21.渲染路径

1.渲染路径

2.Shader中的渲染路径LightMode

3.Unity中的灯光类型

4.前向渲染路径

5.渲染路径的对比与选择

22.经验光照模型

1.光照模型Lambert

2.光强与环境色

3.Lambert光照的实现

4.不同灯光类型的支持与区分

5.光照的衰减

6.光照模型Phong

7.光照模型Phong的实现

8.光照模型Blinn-Phong原理及实现

23.作业

1.非重要角色光照

24.深度测试与写入

1.深度缓冲区

2.深度写入ZWrite

3.深度测试ZTes

4.XRay透视效果

5.Pass的复用

6.深度偏移Offset

25.作业

1.特效合集Shader

26.光照的阴影

1.ShadowMapping的原理

2.阴影的投射

3.阴影的接收

4.Fallback

5.ShaderLOD

6.模型网格阴影

本站所有文章、资源、如无特殊说明或标注互联网转载外, 均为本站以及特邀作者、注册会员、游客投稿原创发布. 所提供下载链接均为站外链接, 网站本身并不存储相关资源文件, 所有资源仅用于个人学习及研究使用, 请在24小时内删除, 切勿用于商业用途, 如产生法律纠纷本站概不负责, 任何个人或组织, 在未征得本站同意时, 禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台. 如若本站内容侵犯了原著者的合法权益, 请及时通知本站, 待核实后将在三个工作日内进行删除.