unity shader入门精要_零基础入门Unity Shader(一)

本文转自Unity Connect博主 taecg

前言

Shader,中文名为着色器,对很多开发者来说它是一个神秘的存在,想学但是又不知道如何去学,或者学了一段时间发现Get不到它的点,始终感觉游离在外,无法开窍。

那么本专栏(Unity技术美术)在前几篇介绍了美术资源标准后,打算接下来花一些篇章来讲下如何从零基础入门Shader,目的在于让初学Shader的程序或者美术可以快速进入这个丰富多彩的世界。

什么是Shader

虽然上面有简单的说了下Shader就是着色器,但是还是有必要详细说明一下具体什么是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具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。

Shader编程语言

既然Shader是一段代码,那必然要用一种语言来书写它,目前主流的有三种语言:

1.基于OpenGL的OpenGL Shading Language,简称GLSL。

2.基于DirectX的High Level Shading Language,简称HLSL。

3.还有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其实是同一种语言。

美术人员看到这里时也不用害怕,语法上并不难,而且在后续的章节中碰到相关的语法时我们会详细的进行说明。

什么是Unity Shader

显卡有NVIDIA、ATI、Intel等等。。。

图形API有OpenGL、DirectX、OpenglES、Vulkan、Metal等等。。。

Shader编程语言有GLSL、HLSL、Cg等等。。。

是不是有点头晕,该怎么去选择呢?在Unity中我们又应该如何做呢?

其实在Unity中反而一切变的简单起来了,我们只需关心如何去这实现我们想要的效果就好了,其余的事情全部交给Unity来自动处理。因为我们在Unity中编写的Shader最终会根据不同的平台来编绎成不同的着色器语言,那么我们在Unity中应该用什么语言来书写Shader呢?

官方的建议是用Cg/HLSL来编写,当然你也可以使用GLSL,主要是因为Cg/HLSL有更好的跨平台性,更倾向于使用Cg/HLSL来编写Shader程序。

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

在Unity中有3种Shader(其实就是三种不同的写法):

1.Surface Shaders 表面着色器

2.Vertex/Fragment Shaders 顶点/片断着色器

3.Fixed Function Shaders 固定管线着色器

其中Fixed Function Shaders已经被淘汰,完全没有学习的必要了。

Surface Shader其实就是Unity对Vertex/Fragment Shader的又一层包装,以使Shader的制作方式更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。

但是Surface Shader也有它的局限性,就是Vertex/Fragment Shader能实现的效果,Surface Shader不一定能实现,反过来则成立,Surface Shader能实现的Vertex/Fragment Shader则一定可以实现。

并且在Unity2018后的版本中推出了Unity官方自己的可视化Shader工具(Shader Graph)。从生成的代码上来看,也全部是用的Vertex/Fragment Shader,那是不是可以理解为在今后的可编程渲染管线中,Unity自己也抛弃了Surface Shader,而全部采用了Vertex/Fragment Shader?

总之,在今后的学习过程中,也会涉及一些Surface Shader的内容,但主要还是会以Vertex/Fragment为主。

另外,学会Shader也会给我们带来很多的好处:

游戏中模型显示粉色的情况你一定碰到过吧,是Shader丢失呢,还是Shader不符合当前平台呢,又或者是Shader上有语法的错误呢?如果我们有了解并学会Shader的话,这些问题就不会再是一脸懵逼啦。

內建Unity Shader仅仅只是“通用”用例,不足以满足我们所有的画面表现需求。

一旦掌握Shader,可以为游戏/应用创造独一无二的视觉享受。根据实际需求,为游戏和应用实现特定功能的Shader。

能大大的帮助我们做渲染上的性能优化,因为通过Shader可以控制渲染什么以及如何渲染。

撰写Shader的能力对于游戏团队非常重要,掌握Shader技能的开发一直是炙手可热的职位。现在一个不争的事实就是,技术美术永远是各大厂商的稀缺资源。

好处多多,大家快快学习起来吧~

文章链接

https://connect.unity.com/p/ling-ji-chu-ru-men-unity-shader-yi?app=true

更多相关知识欢迎大家使用Unity官方app关注该博主~

在本篇文章中,我们将从个简单的 Unlit Shader 开始,了解如何在 Unity 的 URP 中编写 Shader。 Unlit Shader 是最基本的 Shader,它不考虑任何光照,只对物体进行纯色渲染。这是个非常适合初学者的 Shader,因为它可以让我们更好地理解 Shader 的基本结构和语法。 首先,我们需要创建个新的 Shader,选择 URP 中的 Universal Render Pipeline/Lit Shader,并将其重命名为 Unlit。 接下来,打开 Shader 文件,我们可以看到 Shader 的基本结构如下: ``` Shader "Custom/Unlit" { Properties { // 定义 Shader 的属性 } SubShader { // 定义 SubShader 的标签和 Tags Pass { // 定义 Pass 的标签和 Tags CGPROGRAM // Shader 代码 ENDCG } } } ``` 如上所述,Shader 由多个 SubShader 组成,每个 SubShader 又由多个 Pass 组成。在这里,我们只需要关注个 SubShader个 Pass。 首先,我们需要在 Properties 中定义 Shader 的属性。这些属性可以在材质面板中进行编辑和调整。对于 Unlit Shader,我们只需要定义颜色属性即可,代码如下: ``` Properties { _Color ("Color", Color) = (1,1,1,1) } ``` 上述代码定义了个名为 _Color 的属性,类型为 Color,初始值为白色。在这里,我们使用了 UnityShaderLab 语言来定义属性。 接下来,我们需要在 SubShader 中定义标签和 Tags。标签和 Tags 是用来控制 Shader 的渲染和使用的,我们需要根据实际情况进行定义。 对于 Unlit Shader,我们只需要定义个名为 "RenderType" 的标签,值为 "Opaque",表示这个 Shader 用于不透明的渲染。代码如下: ``` Tags { "RenderType"="Opaque" } ``` 最后,我们需要在 Pass 中编写 Shader 代码。对于 Unlit Shader,我们只需要将颜色值直接输出即可,代码如下: ``` CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; float4 _Color; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { return _Color; } ENDCG ``` 在上述代码中,我们定义了两个结构体 appdata 和 v2f,分别代表输入和输出数据。在 vert 函数中,我们将输入的顶点位置转换为屏幕空间的位置,并将其保存到输出中。在 frag 函数中,我们直接返回颜色值,这样就能够实现纯色渲染了。 最后,我们需要将 Shader 保存,并将其赋给个材质。在材质面板中,我们可以看到 _Color 属性,可以通过这个属性来修改材质的颜色。 这就是从个简单的 Unlit Shader 开始,在 Unity 的 URP 中编写 Shader 的全部过程。希望本文对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值