1.12 从0开始学习Unity游戏开发--渲染概念

在我们继续扩大我们控制场景物体的逻辑之前,我希望先讲讲Unity中关于渲染的一些概念,如果不是做图形程序或者技术美术,可能做很久游戏开发也不一定用得上,但是既然要系统性的从0学起,那至少还是要了解一些最基本的内容。

本篇我们会以0基础的视角,以相机着手,了解我们常用的渲染组件和逻辑都是怎么关联的,如果以及非常粗略的说明我们看到的画面都是哪些因素所影响,最后如何呈现出来的。

相机组件

我们选中Main Camera看一下这个Camera组件,可以看到非常长,里面有大量的配置项,但是我们今天只讲最基本的,也就是里面这个Projection的部分。

如果选中后看Scene窗口里的话,可以看到有这样一些线条:

其实这些线条就是辅助线,用来提示你这个相机可视区域在3D空间中是个什么样子。这样看不太清楚,我们尝试将Camera组件里面Projection下的Clipping Plane的Far修改为10:

可以看到整个相机可视距离其实是一个躺着的金字塔形状,但其实是玛雅金字塔,如果我们修改Far旁边的Near为5的话,可以看到其实是一个3D的梯形:

那么这个是起什么作用呢?

我们正常3D世界里面看到物体有近大远小的概念,那么游戏里面要实现真实的3D场景画面,肯定也需要还原这样一个效果,为了还原这样的效果,我们需要将原本在平坦的3D空间的物体,进行透视投影这样一个数学变换到我们所谓的屏幕上,我们的屏幕是哪个呢?就是上面我们看到的玛雅金字塔的顶部,也即是下图红色部分:

而右下角那个预览画面,其实就是将我们的立方体,通过透视投影,拍扁到我们的那个红色平面上形成的画面。

而透视投影的计算规则则是通过一个矩阵来变换,这个矩阵通过刚刚我们修改的Near(近裁面),Far(远裁面),Fov(视场角),Aspect(屏幕长宽比例)来共同决定。

至于具体如何计算,本次只是介绍基本的概念,不会详细的阐述,只需要理解我们通过相机拿到这个矩阵后,我们可以通过离散数学里面矩阵乘法,把我们任意一个3D世界中的点(x, y, z)变换到我们这个3D梯形区域内,如果不在这个梯形内的就会被裁剪掉不会绘制。

通过这样一个变换会得到我们想要的近大远小的视觉效果。

如果希望调整这个画面的透视效果,则可以直接修改我们上面提到的Camera组件里面Projection部分,而Projection其实就是投影的意思。

当然除了透视投影,我们在玩RTS,塔防等类型游戏时,其实并没有近大远小,所有物体放哪里都一样大,这个时候我们会用正交投影,计算其实也是构造出一个矩阵用于变化3D世界里面的位置。

如果需要启用正交投影的话,可以直接在面板上切换:

Perspective就是透视的意思,Orthographic就是正交。

物体渲染组件

有了我们的相机,我们确定了场景内任何一个点的位置应该如何出现在屏幕上,但是仅仅这样肯定不行,我们还不知道哪些位置需要画在屏幕上,以及画什么颜色。

而现在我们其实就有一个可以出现在画面中的Cube,我们在看一下它的组件:

除了Transform和我们自己写的两个组件外,还有一个BoxCollider其实是用于物理计算,我们先按下不表。

那么剩下的就是Mesh Filter和Mesh Renderer两个组件了,而这两个组件就是我们Cube能够真正显示在屏幕上的原因。

为了证明这一点,我们尝试点击Mesh Renderer旁边那个勾选框,就是用于启用和禁用组件功能的操作入口。我们取消勾选后,这个组件就不会生效,可以看到取消后,我们就看不到Cube的银灰色表面,只剩下一些线框了:

而Game窗口由于没有这些辅助线框,则完全失去了Cube的踪影。

那么我们来看看这两个组件,先看Mesh Filter:

双击这个Cube的输入框旁边的圆点,根据我们之前的文章,可以了解到这个圆点可以定位到我们当前引用的对象是啥,看图片可以看到我们选择的是个立方体,并且叫Mesh类型。

而Mesh翻译过来就是网格,渲染跟网格有什么关系呢?网格其实就是我们常常说的建模里面的模型的形状,同样也就是我们常会听到一个模型有多少多少面,这一面其实就是一个三角形面(也可能是其他形状的面),如果仔细看,这个Select窗口底部这个Cube的Mesh预览,能看到有线条,可以看出是一个个三角形面组成的。

那么现在其实就比较清楚了,Mesh Filter组件存储了一个Mesh资源的引用。

接下来看第二个组件Mesh Renderer:

那么这个看起来很怪,如果说我们的Mesh是用来当作模型来渲染的,那么这个Mesh Renderer为什么没地方引用它呢?

我个人觉得这是一个Unity设计的历史遗留问题,以后我们可以见到更多其他的Renderer组件,而有些Renderer组件是直接在Renderer组件里面配置Mesh资源的。

那么Mesh Renderer其实是利用了一个潜规则,也就是说它会自动寻找同一个GameObject上的Mesh Filter组件里面配置的Mesh作为自己绘制用的Mesh。

而我们Mesh要渲染的话,光有三角面肯定不行,那我们至少要贴个图把,那么我们利用贴图的地方其实就是Material(材质),其实这么说不太准确,但是为了说明的保证连贯性,先暂时这么说。

也就是这个不起眼的Lit作为我们渲染用的Material,同样的我们可以点击右边圆点来定位到我们用的具体是哪个资源,但是因为修改和查看材质数据的操作频率很高,Unity会默认给我们显示在面板的最下方:

这下是不是突然明白之前一直很奇怪为啥有的GameObject下面有这样一坨东西,有的又没有。其实这就是Mesh Renderer组件独特的显示内容。

可以看到有一大坨的配置参数,而我们所需要配置的贴图也可以配置在这里面,只不过这个Lit是Unity内部的自带的材质,不让你改,你得自己复制一个再替换掉Mesh Renderer里面的那个Lit才能对上面那么多内容进行修改。

如果有接触过渲染,比如学过OpenGL入门教程的人,可以比较敏感的发现,这个额外多出来的面板的开头就是Shader

当然如果这个材质已经是复制出来可以自行修改的,则这里下拉框也是可以选择其他Shader的。

至于Shader是什么,本文不会继续深度讲解,这里只稍微提一句。

整理流程

上面我们讲了三个组件:

  1. 相机组件Camere
  2. 承载模型资源的Mesh Filter组件
  3. 对物体Mesh渲染负责的Mesh Renderer组件

在Unity中,每帧会收集所有场景里面的启用的Mesh Renderer组件,并且剔除掉不在Camera组件可视范围内的部分。

Mesh Renderer组件会提供物体渲染所需的Material数据,Mesh数据,给到Unity,Unity再合并Camera的投影矩阵传递到GPU,GPU会处理Mesh,把Mesh上每个位置通过投影矩阵转换到屏幕坐标上,而Material的数据则提供了部分颜色信息。最后我们的画面就呈现出来了。

下一章

本章了解了基础的渲染相关组件信息后,我们可以对场景哪些地方控制着我们的画面效果有了一个大概的印象,如果想要实现我们想象中的各种画面效果还有很长的路要走,而渲染相关的内容我们会单独的起一个系列来进行讲解。

下一章,我们暂时放下渲染,进一步增强我们的场景掌控能力,学习如何动态的创建我们的物体,并且如何动态的加载资源,在这其中,Unity管理资源最重要的组件化思维Prefab也会进行讲解。

猜你喜欢

转载自blog.csdn.net/z175269158/article/details/129932609