unity Shader 入门精要 EX

1、shader概念

Shader,中文名为着色器。
Shader其实就是专门用来渲染图形的一种技术,通过shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果。
shader是伴随可编程渲染管线(SRP-Scriptable Render Pipeline)出现的。SRP替代了传统的固定渲染管线,可以在管线中应用3D图形学相关计算,拓展了创作者的发挥空间,是渲染技术的一次革命。
其他缩写:
PBR(基于物理渲染)——一种拟真渲染技术
SRP(可编程渲染管线)
URP (通用渲染管线)
HDRP(高清渲染管线)
DRP(默认内置渲染管线)

PBR:基于物理渲染
以前的渲染是在模仿灯光的外观
现在是在模仿光的实际行为
试图形看起来更真实

1.Build-In Render 内置渲染器(默认)兼容太多,反而不能面面俱到,效果不好

2.Scriptable Render Pipline 可编程渲染管线技术,是Unity提供的新渲染系统,可用C#脚本定制Unity的渲染过程,但自己定制渲染管线对编程要求很高,难度大,所以Unity提供里2个预制的管线,基本上涵盖了我们所有的需求,使用时不需要太底层的技术要求!

2.1 High Definition Render Pipleline 高清管线流程,专注于高端图形渲染,针对高端硬件配置,像PC、XBox 和Playstation,其面向高逼真度的游戏、图形demo和建筑渲染、超写实效果,以及所需的最佳图形效果。同时针对高端图形处理时,它要比内置渲染器要快得多,但如果用来做low poly风格的作品就有点杀鸡用牛刀了,纯属浪费资源和时间;但要想得到完成利用HDRP的完美表现能力,需要大量的贴图,漫反射贴图、高光贴图、金属贴图、平滑贴图、AO贴图、法线贴图、凹凸贴图、高度贴图…So,要做HDRP流程需要非常长的时间和庞大的制作团队,还有充足的预算!建议5人以下的小团队慎入!

2.2 Universal Render Pipleline 通用管线流程(URP前身为Lightweight Render Pipeline — LWRP轻量级渲染管线),专注于性能,URP是选了不会错的渲染管线,它被设计为能够在任何平台上都能提供最好的性能,所以除非有特殊需求只能在HDRP或者SRP解决的,其他都应该选择URP,不管是移动端、主机、PC等,URP都能提供高性能的渲染,目前URP能做的也非常多,它拥有很多HDRP相同的功能,但为了在所有平台达到更好的性能,其做了一定的缩减,但这并不意味着URP做不出漂亮的游戏;

这两种管线流程都利用里Unity新的可编程渲染管线技术,Unity正在把他们变成新的标准,shader graph,visual effect graph这些新功能都是他们的专属,这两个都是创作shader和粒子特效很棒的工具,也支持VR,不过HDRP做逼真风格的VR性能要求非常高!因为Unity实际上把所有东西渲染2次(因为有两个镜头),所以延迟渲染现在只有HDRP支持,不过对URP的支持官方已经在路上。

两者最大的区别是对光照的支持,HDRP提供高级和丰富的光照功能,比如实时全局光照(RealTime GI),能够模拟光线反射、体积光、能模拟光穿过空气中的粒子,还有重头戏的光线跟踪,一种新的光线反射和阴影渲染技术,其原理是跟踪光线在场景中放射的路径,模拟光线在真实世界里与物体交互的效果,这技术对硬件性能非常高,但能产生非常逼真的效果,可以直接用来做电影级别的预渲染作品。

另外一个区别是Shader,HDRP提供一系列高端的shader特效,例如高度、细节和parallax Maps,分别用于纹理的位移、细节和深度模拟,它还支持子面散射,用于模拟光线穿过很薄的物体,比如皮肤和衣物,它提供了高级的shader,像是stacklit,能够让你同时使用多个材质的属性,比如子面散射、彩虹色、各向异性和模糊参数化。

对于后处理效果,两者不相伯仲,HDRP独占的最重要效果,包括AO(环境光遮蔽)、自动曝光(模拟人眼适应不同光线条件的能力)、屏幕空间反射(模拟基于屏幕上可见物体的反射);URP的AO支持已经在做了,但好东西不是都在HDRP,2D光照和阴影就是URP独占的,所以如果你在做2D游戏,就选URP!

另外两个管线都支持一个很Cool的特效—相机堆叠,让你能够同时用多个相机渲染。
原文链接:https://blog.youkuaiyun.com/weixin_41622043/article/details/107623694

2、shader分类(顶点Shader、像素Shader)

Shader分为两类 :
顶点Shader(3D图形都是由一个个三角面片组成的,顶点Shader就是计算每个三角面片上的顶点,并为最终像素渲染做准备)。
像素Shader,顾名思义,就是以像素为单位,计算光照、颜色的一系列算法。

几个不同的图形API都有各自的Shader语言
在DirectX中,顶点shader叫做 Vertex Shader ,像素Shader叫做 Pixel Shader;
在OpenGL中,顶点Shader也叫做 Vertex Shader ,但像素Shader叫做 Fragment Shader,也就是我们常说的片断Shader或者片元Shader。

说白了,Shader其实就是一段代码,这段代码的作用是告诉GPU具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。

3、Shader编程语言

渲染操作由GPU完成,由于GPU使用不同于CPU的并行运算结构,需要一种适用于GPU的编程语言,也是shader编写使用的编程语言:
目前主流的Shader编程语言(面向GPU的编程语言)有三种:

基于OpenGL的OpenGL Shading Language,简称GLSL。
基于微软DirectX的High Level Shading Language,简称HLSL。
还有NVIDIA公司的C for Graphic,简称Cg语言。

GLSL与HLSL分别是基于OpenGL和Direct3D的接口,两者不能混用。
而Cg语言是用于图形的C语言,这其实说明了当时设计人员的一个初衷,就是让基于图形硬件的编程变得和C语言编程一样方便,自由。正如C++和 Java的语法是基于C的,Cg语言本身也是基于C语言的。如果您使用过C、C++、Java其中任意一个,那么Cg的语法也是比较容易掌握的。Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性高等。

Cg语言是Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致,所以,HLSL和Cg其实是同一种语言。

Unity3d里CG如何编译
Windows:Direct3D GPU汇编代码
Mac:OpenGL GPU汇编代码
Flash: flash GPU汇编代码
Ios/Android: Unity会将CG转换成GLSL代码

为什么使用GPU编程渲染
优点: GPU高并行结构 拥有更多逻辑运算单元(ALU)适合用于密集型数据处理,对数据进行独立运算(多个数据并行运算时间和一个数据单独执行时间是一样的)
CPU大部分面积为控制器和寄存器
GPU并行处理能力强于CPU 让它同一时间处理很多顶点数据
缺点:由于是数据独立运算难以实现数据之间相关性的算法(射线和物体的求交运算)
GPU无法实现CPU强大逻辑运算能力(这就是为何GPU如此牛皮却无法取代CPU的原因)

选择:
使用HLSL进行shader编程
曾使用CG,Unity当初是以移动平台为主要目标的。而移动平台的主流图形API是OpenGL,对应的除了GLSL之外,就是CG。但是CG已经停止更新很多年了。随着GPGPU的出现,以及Unity扩大对象平台范围,特别是最近的Compute Shader、Mesh Shader、以及光线跟踪的出现,CG已无法胜任。而微软在家用机市场的地位依然强健,且HLSL的粒度比GLSL细(就是更底层),在互转的时候HLSL转GLSL容易而反之困难,此外竞争对手虚幻引擎也是用的HLSL。

4、Unity Shader

4.1概述

在Unity中编写的Shader最终会根据不同的平台来编绎成不同的着色器语言。

Unity Shader严格来说并不是传统上的Shader,而是Unity自身封装后的一种便于书写的Shader,又称为ShaderLab。

由于有更好的跨平台性,Unity官方的建议是用Cg/HLSL来编写shader。(当然你也可以使用GLSL)

4.2分类(Surface Shaders、Vertex/Fragment Shaders、Fixed Function Shaders…):

在Unity中有4种Shader:

Surface Shaders 表面着色器
(Unity对Vertex/Fragment Shader的又一层包装。更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。)
(在进行表面着色器的开发时,我们将直接在Subshader这个层次上写代码,系统将把我们的代码编译成若干个合适的Pass——Subshader与pass概念详见后续‘shader语法框架’相关内容)
Vertex/Fragment Shaders 顶点/片断着色器
(更基础的shader,Vertex/Fragment Shader能实现的效果,Surface Shader不一定能实现,反过来则成立)
Fixed Function Shaders 固定管线着色器
(已经被淘汰,不再推荐)
固定功能的shader,是对硬件能执行的基本的命令进行编写的shader。这类shader功能很有限,但是速度却是最快的。
涉及五方面内容Properties(属性)、Material(材质)、Lighting(光照)、Settexture(设置纹理)以及Pass(通道)。
用于不支持高级着色器特性的旧硬件上,完全采用ShaderLab编写。
unity内建了许多固定功能管线着色器。

shader是伴随可编程渲染管线(SRP-Scriptable Render Pipeline)出现的。
早期GPU遵循的管线叫固定管线(Existing Fixed Function Pipeline),固定管线只能配置“是否开启雾效”、“是否开启光照”、“是否开启深度测试”等一些参数,而不能控制物体与光交互的算法。
固定管线只需要传递不同存储器所需要的数据到参数列表就可以了. 至于它的底层是如何实现的,并不需要关心.因为这一切它已经封装起来了.
OpenGL从3.1版本开始,固定管线从核心模式中去除,因此我们必须使用着色器来完成工作。
初步推断:
[Fixed Function Shaders就是以shader编程的方式去实现从核心模式中去除的固定管线功能? ]
[但unity也有针对固定管线的shader,但功能上是固定的,shader功能上更偏向与选择设置,无法进行自由定义的3D图形学运算。]

Compute Shader
这是Unity3D新增的一种。
Compute Shader技术是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用,GPU将不仅具有3D渲染能力,也具有其他的运算能力,也就是我们说的GPGPU的概念和物理加速运算。
Compute Shader 使用HLSL语言。

4.3倾向

shader种类用Vertex/Fragment Shader,shader语言用HLSL。

Unity2018后的版本中推出了Unity官方自己的可视化Shader工具(Shader Graph),其生成的代码全部是用的Vertex/Fragment Shader。在今后的可编程渲染管线中,更倾向于较全面的Vertex/Fragment Shader。

早期的Unity中的Shader是用Cg写的,但是后面都转到了HLSL。虽然二者有一定一致性,但Cg已经很久不更新了,所以使用HLSL才是正道。
(可编程渲染管线的shader使用HLSL,之前的内置渲染管线shader一般用Cg)

4.4 Shader在unity中的使用(和材质、贴图的关系)

创建编写shader->创建材质并关联shader->关联shader所需的贴图作为一项输入->将材质赋予游戏物体->最后运行以渲染出目标画面。

Shader(着色器)实际上就是一小段程序,它负责将输入的顶点数据以指定的方式和输入的贴图或者颜色等组合起来,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。
输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质),之后,我们便可以将材质赋予三维物体来进行渲染(输出)了。

【材质好比引擎最终使用的“整套解渲染决方案”,Shader好比是解决方案的流程设计,而贴图就是流程中决定使用的输入原材料。】

5、开始在unity中接触shader

5.1shader模板(unity中Create/Shader后的选项):

Standard Surface Shader
标准表面着色器,是一种基于物理的着色系统(使用了Physically Based Rendering(简称PBR)技术,即基于物理的渲染技术),以模拟现实真实的方式来模拟材质与灯光之间的关系,可以很轻易的表现出各种金属反光效果,同时此种Shader的书写逻辑也更符合人类的思维模式。

Unlit Shader
Vertex/Fragment Shader,也就是最基本的顶点片断着色器,不受光照影响的Shader,多用于特效、UI上的效果制作。

Image Effect Shader
也是顶点片断着色器,只不过是针对后处理而定制的模版,后处理是什么呢?Bloom(也有人叫Glow/泛光/辉光等说法)、调色、景深、模糊等,这些基于最终整个屏幕画面而进行再处理的Shader就是后处理。

Compute Shader
Compute Shader是运行在图形显卡上的一段程序,独立于常规渲染管线之外的,它可以直接将GPU作为并行处理器加以利用,从而使GPU不仅具有3D渲染能力,还具有其他的运算能力。

Ray Tracing Shader
射线追踪着色器,用于 GPU 射线追踪的着色器。此着色器应至少包含一个射线生成着色器。

Shader Variant Collection
Shader变体收集器,在上面创建的时候,你会发现Shader Variant Collection与以上四个是被隔开的,就是因为这个与它们不一样,它不是制作Shader的模版,而只是对Shader变体进行打包用的容器。

5.2贴图、材质与Shader

shader是指令代码,需关联材质才能赋予游戏对象以达成效果。
材质——按照关联

Unity Shader中的草地效果可以通过制作草地着色器来实现。草地在风吹动时会产生规律性的摆动效果,因此在草地的动画方面,需要营造一种个体上随机但整体上一致的效果。首先,可以根据顶点在平面中的位置生成具有规律的系数,如下所示: float random = sin(UNITY_HALF_PI * frac(root.x) + UNITY_HALF_PI * frac(root.z)); 接下来,可以根据生成的系数来控制草的宽度和高度的变化。可以通过调整_Width和_Height参数来增加或减少草的宽度和高度,并且根据生成的random值进行微调,如下所示: _Width = (_Width + random / 50.0) * input.color.a; _Height = (_Height + random / 5.0) * input.color.a; 通过这种方式,可以实现草地在风中摆动的效果。在Unity中,可以将这个草地着色器应用于草坪网格,并进行优化,以实现更加逼真的草地效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [unity Shader 入门精要 EX](https://blog.youkuaiyun.com/xinghaikongmeng/article/details/120798744)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [UnityShader[4]几何着色器与可交互草地](https://blog.youkuaiyun.com/Thanatos_Left/article/details/126141627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值