《Unity Shader 入门精要》总结——第二章

PS:本文仅仅是个人理解,如有不足,敬请谅解。
本人,目前一个在校大学生,计算机专业,因为个人从小喜欢玩游戏,特别是手机游戏,因此也自己选择了学习Unity引擎。我曾经觉得游戏这东西,在于玩法新奇,道具丰富,功能很多,社交强大,从没有想过画面对游戏到底有何影响。不过自从前一段时间,玩了崩坏学园三时候,那种美轮美奂的特效,以及精美的建模,让我感到非常惊喜。每一次获得一个新角色时候,就感觉像是拿到一款心爱的玩具,所以从那个时候开始,我开始在了解游戏画面表现这一方面,结合自己是学程序的,所以发现了shader这个东西,看了很多大神们的博客,都是以《Unity Shader 入门精要》这一本书来进行讲解的,所以我也拿了这本书进行学习,我之后的一系列博客就是自己对这本书的理解与总结,主要目的是为了自己以后方便复习,如果能帮到一些和我一样的人,鄙人深感荣幸。
———(本人的小声哔哔)

这本书的第二章就是介绍了关于“Shader”整体简介,以及所必需的掌握的知识。
1.什么是Shader?
Shader即是着色器,顾名思义是用来上色的,是给谁上色呢,就是我们平时电脑屏幕上看的那些多姿多彩的颜色、图形。
2.Shader的大概工作流程是什么?
与Shader联系非常紧密的是渲染流水线。可以这样说,如果你没有了解过渲染流水线的工作流程,就永远无法说自己对Shader已经入门。Shader就是可以说是渲染流程中的一部分,它的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有的效果。它的输入是一个虚拟摄像机、一些光源、一些shader以及纹理等。
3.什么是渲染流水线?
首先先来解释一下,什么是流水线?
拿本书里面所讲的玩具工厂来讲。一个娃娃的装配线,需要经过四个步骤:制作身体->制作头部->制作头发->最后进行产品包装。如果按照完整的流程做完这四个才能完成一个娃娃的制作。假如四个流程每个流程需要1小时,那么四个小时才可以做出一个娃娃。
后来人们引入了流水线,把每个步骤并发执行,这样就可以大大的提高效率。
而决定最终效率的是耗时间最长的那个步骤,也被成为性能瓶颈。(后面优化有非常大的作用
同样渲染流水线也类似于流水线,它的工作就是从一个三维场景出发,最终生成(渲染)一张二维图像,然后映射到屏幕上。换个具体的解释,计算机需要从一系列的顶点数据、纹理等信息出发,把这些信息最终转换成一张人眼可以看到的图像,这个工作通常是CPU和GPU合作完成的。
渲染流水线三个概念性阶段如下图:

渲染流水线3个概念性阶段

3.1 应用阶段
这个阶段也就是准备一些好所有渲染需要的模型,光源,场景等等的数据,设置每个模型渲染的状态,包括但不限于它使用的材质(漫反射颜色、高光反射颜色)、使用的纹理、使用的Shader,这一阶段最重要的是输出渲染所需要的渲染图元(可以是点、线、三角面),这些渲染图元会被输入到几何阶段。
PS:这个是有开发者主导的阶段,不在本书的范围,也就是开发游戏的程序员,他想要什么模型,什么场景等等这一系列的。
3.2.几何阶段
这一阶段会接受来自应用阶段的渲染图元,再一次决定需要渲染的图元是什么,怎么样绘制它,在屏幕哪个位置绘制它。这一阶段通常在GPU上进行。
几何阶段最重要的一个任务就是把经典坐标变换到屏幕空间中,再交给光栅器进行处理。通过对输入的渲染图元进行多步处理后,这一阶段将会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等信息,并传递给下一阶段。
3. 3.光栅化阶段
这一阶段会使用来自几何阶段的数据来决定产生屏幕上的像素,并渲染出最终的图像。这一阶段也是在GPU上运行。光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。它还需要对上一个阶段得到的逐顶点数据(例如纹理坐标、顶点颜色等)进行插值,然后再进行逐像素处理。
PS:以上每一个阶段都可以分成很多细小的阶段,仅仅概念性的流水线。
4.渲染流水线中的CPU部分
渲染流水线的起点是CPU,即是应用阶段。大致可以分为如下的3个阶段:
(1)把数据加载到显存中。
所有渲染需要的数据都是从HDD(硬盘)中加载到RAM(主存),又被加载到VRAM(显存),因为显卡对于VRAM读取速度更快,而且大部分显卡是没有权利访问RAM的。
(2)设置渲染状态。
什么是渲染状态呢?简单来讲就是决定这个东西该怎么渲染,就像美术上面说的画画的要求,渲染状态如果做特别支出,所有网格都会渲染出一种特效,这样出来的材质会使得看起来是一模一样。(也就是设置这部分怎么渲染,那部分该怎么渲染)
(3)调用Draw Call。
当你准备好一个图元时候,就需要调用Draw Call,这个命令其实就是一个传送命令,发起方是CPU,接受方是GPU,指向一个需要被渲染的图元列表,而不是有任何材质的信息了,(上一个设置渲染已经根据这些材质决定了怎么渲染),然后传送给GPU。
PS:这个Draw Call在后面进行优化时候非常重要,大部分时候渲染时间长不是花在GPU而是CPU发出Draw Call命令这个阶段。
5.渲染流水线的GPU部分
这一部分我就用书上的流程图如下:

渲染流水线GPU部分
紫色部分就是几何阶段,红色部分是光栅化阶段。
不是每一部分都是需要我们亲力亲为的,只有那些可配置的可编程的才是我们需要自己做的工作。
因为此篇文章是对Shader一个大概了解总结,所以只讲特别重要的部分,其他的可配置的是后面一些细微工作需要做的。
首先这个流程的输入端,顶点数据是哪儿来的,就是应用阶段,从HDD调用到RAM再调用到VRAM,然后经过设置好渲染状态后,然后调用Draw Call,从这里送到的显存里面的。
而可完全编程的第一个大头就是顶点着色器,顾名思义就是让顶点的坐标进行空间变换,然后进行一些着色计算,比如布料会随风而动,其实就是布料模型上面的顶点运动,不管怎么计算,这个阶段最最最重要的一个任务就是要把顶点坐标从模型空间转换到齐次裁剪空间
第二个可完全编程的就是片元着色器,在DirectX中,片元着色器被称为像素着色器,但其实片元着色器是一个更合适的名字,因为此刻的片元并不是一个真正意义上的像素。
前面的光栅化阶段实际上并不会影响到屏幕上的每个像素的值,而是会产生一系列的数据信息,来描述一个三角网格是怎样覆盖每个像素的。而每个片元就负责存储这样的一系列数据。(真正的改变像素操作是后面的逐片元操作,这个在后面透明度测试时候进行讲解)而每个片元其实是三角形遍历得到的,如果那个像素被三角形网格覆盖就会生成一个片元。(也就是片元存的信息已经是一个像素所需要的所有基本信息,但并没有真正的渲染,还需逐片元中进行合并和检测剔除不合理的,这也就是说为什么片元并不是一个真正的像素)

三角网格

这个三角网格顶点就存储存了自己坐标信息,三个坐标信息一旦确定就确定了自己的位置,覆盖了哪些像素(可以这样理解,里面每一个的方格子,就是一个片元,在此是绘画原因,实际上每个方格大小都一样),顶点还可能存储颜色,深度,法线等等信息。
片元着色器的输入是上一个阶段对这些顶点信息进行线性插值得到的结果,更具体来说是根据那些顶点着色器输出的数据插值得到的,而他的输出是一个或者更多的颜色值。(这种插值比如说你顶点坐标最大是1,而最小是0.5,那么其中就是0.5-1而具体怎样插值就要看情况了)。
在这个阶段可以完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角形网格的3个顶点对应的纹理坐标进行插值后,就可以得到其覆盖的片元的纹理坐标了。
PS:片元着色器,它仅仅影响的是单个片元,他们并不会把得到的信息发送给他们的邻居,有一个例外读者可以自己去百度。
逐片元操作设计到一些比较复杂的测试技术,在下一篇文章中讲解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity Shader是一种用于渲染图形的程序,它可以控制对象的表面颜色、纹理、透明度、反射等属性,从而实现特殊的视觉效果。对于游戏开发者来说,掌握Shader技巧是非常重要的。 以下是关于Unity Shader入门精要: 1. ShaderLab语言 ShaderLab是Unity中用于编Shader的语言,它是一种基于标记的语言,类似于HTML。ShaderLab可以用于定义Shader的属性、子着色器、渲染状态等信息。 2. CG语言 CG语言是Unity中用于编Shader的主要语言,它是一种类似于C语言的语言,可以进行数学运算、向量计算、流程控制等操作。CG语言可以在ShaderLab中嵌入,用于实现Shader的具体逻辑。 3. Unity的渲染管线 Unity的渲染管线包括顶点着色器、片元着色器、几何着色器等组件,每个组件都有不同的作用。顶点着色器用于对对象的顶点进行变换,片元着色器用于计算每个像素的颜色,几何着色器用于处理几何图形的变形和细节等。 4. 模板和纹理 在Shader中,我们可以使用纹理来给对象添加图案或者贴图,也可以使用模板来控制对象的透明度、反射等属性。纹理可以通过内置函数tex2D()来获取,模板可以通过内置函数clip()来实现裁剪。 5. Shader的实现 Shader的实现需要注意以下几点: - 在ShaderLab中定义Shader的属性、子着色器、渲染状态等信息。 - 在CG语言中实现Shader的具体逻辑,包括顶点着色器、片元着色器等内容。 - 使用纹理和模板来实现特定的视觉效果。 - 在对象上应用Shader,通过调整Shader的属性来达到不同的效果。 以上是关于Unity Shader入门精要,希望对你有所帮助。如果你想更深入地了解Shader的编技巧,可以参考官方文档或者相关教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风萧水寒人往前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值