Unity三渲二:渲染基础

目录

一、渲染流水线

1.1、什么是渲染流水线(Rendering Pipeline,也叫做渲染管线)

1.1.1应用阶段:

应用阶段的三个阶段:

1.把数据加载到显存中:

2、设置渲染状态

3.调用Draw Call

1.Draw Call的过程:

2.为什么要减少Draw Call命令?

1.1.2几何阶段:

几何阶段的五个阶段:

1.顶点着色器(可编程)

2.曲面着色器(不必需)

3.几何着色器(不必需)

4.裁剪(可配置,不可编程)

5.屏幕映射(可配置和可编程)

1.1.3光栅化阶段

光栅化阶段的四个阶段:

1.三角形设置(固定函数)

2.三角形遍历(固定函数)

3.片元着色器(可编程)

4.逐片元操作(高度可配置)

4.1模板测试

4.2深度测试

4.3混合

二、什么是Shader


一、渲染流水线

渲染流水线的最终目的是在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。它的输入是一个虚拟摄像机、一些光源、一些Shader以及纹理等(UnityShader入门精要)

1.1、什么是渲染流水线(Rendering Pipeline,也叫做渲染管线)

流水线相比不用说,它的作用在现实生活的为生产效率提供了巨大贡献。采用n条流水线制作工序,能够在原生产基础上得到n倍的速度提升。

对于渲染流水线,自然而然也不必说是为了提高渲染的速度。

对于计算机来说,计算机会从一系列的顶点、纹理等信息出发,将这些信息转换成人眼看到的图像,由计算机的CPU和GPU共同完成

渲染流水线会分为三个阶段:应用阶段几何阶段光栅化阶段。

这三个阶段也是各自是一条流水线,都是渲染流水线中的子流水线。

1.1.1应用阶段:

应用阶段是由我们主导的,通常由CPU负责实现。在这一阶段,开发者有三个任务:准备号场景数据(比如场景模型,摄像机位置,光源等)、粗粒度剔除(此任务是为了提高渲染的性能,把不可见的物体剔除掉)、设置模型的渲染状态(也就是我们平常设置材质的过程)。

应用阶段最重要的输出是渲染图元(也就是渲染需要的几何信息,其可以是点、线、三角面等)

应用阶段结束会将渲染图元传递给下一个阶段:几何阶段

应用阶段的三个阶段:
1.把数据加载到显存中:

我们渲染的图形的数据会存放在硬盘(HDD)中(比如模型,贴图,材质等),然后又会被加载到系统内存(RAM)中,然后也会被加载到显卡上的存储空间,即显存(VRAM)中。

为什么要这样操作呢?因为显卡对于显存的访问速度很快,并且大多数的显卡都不能直接访问内存、

2、设置渲染状态

所谓渲染状态,就是渲染了场景中的网格物体是怎样被显示的(比如使用顶点着色器【Vertex Shader】还是片元着色器【Fragment Shader】,光源属性等)

3.调用Draw Call

Draw Call实际上是一个命令,由CPU发起命令让GPU执行。当给定一个Draw Call时,GPU会根据渲染状态和所有输入的顶点数据进行计算,最终输出成屏幕上显示的像素,这个计算过程,则是GPU流水线。

1.Draw Call的过程:

CPU通关应用程序向DirectX或者是OpenGL发送渲染命令,这些接口又发送渲染命令给显卡驱动,然后显卡驱动再翻译命令,命令GPU进行渲染操作。

2.为什么要减少Draw Call命令?

在CPU与GPU通信之间,有一个命令缓冲区(Draw Call为其中的一种命令),CPU向命令缓冲区添加命令,GPU从命令缓冲区中读取命令,实现CPU和GPU单独运行互不影响。但是GPU的渲染速度往往会快于CPU的命令提交速度,添加大量的Draw Call命令会严重延缓CPU的速度,导致CPU过载。

CPU有许多提交任务没有完成,GPU处理所有的渲染命令闲置下来,就导致了游戏画面卡顿的情况

1.1.2几何阶段:

几何阶段用于处理所有和我们要绘制的几何相关的事情(比如要绘制什么图元,如何绘制它们等),这一阶段通常在GPU上进行

几何阶段会对每个渲染图元进行逐顶点、逐多边形的操作,其一个重要任务就是把顶点坐标变换到屏幕空间里,再给予光栅化处理。

这一阶段会输出屏幕空间的二维顶点坐标、每个顶点的深度值、着色等相关信息并传递给下一个阶段:光栅化阶段

几何阶段的五个阶段:
1.顶点着色器(可编程)

GPU接收CPU输出的顶点数据作为输入。顶点着色器是完全可编程的,通常实现顶点的空间转换、顶点着色等功能,主要完成的工作有:坐标变换和逐顶点光照,它必须完成的任务是将顶点坐标从模型空间转换到齐次裁剪空间

2.曲面着色器(不必需)

曲面着色器是可选的,当需要高精度的模型来表现效果时,会给CPU带来极大负担,曲面着色器可以通过线性插值插入新顶点,生成更多面,依靠低精度模型也能实现圆滑的效果。

3.几何着色器(不必需)

可选,增加或销毁图元,改变模型原有形状

4.裁剪(可配置,不可编程)

对不在摄像机范围内的物体进行裁剪,这个过程在齐次裁剪空间进行

5.屏幕映射(可配置和可编程)

把每个图元的x和y坐标转换到屏幕坐标

1.1.3光栅化阶段

光栅化阶段会使用上一个阶段传递过来的数据生成屏幕上的像素,渲染出最终的图像,通常在GPU上运行。

光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上,需要对上一个阶段得到的逐顶点数据进行插值,然后再进行逐像素处理

光栅化阶段的四个阶段:
1.三角形设置(固定函数)

计算三角形三条边上的像素坐标,为下一步操作做准备。

2.三角形遍历(固定函数)

找到哪些像素被三角形覆盖,对应的像素生成一个片元(包括屏幕坐标,深度信息,纹理坐标,发现等,是状态集合)【这个阶段也被称为扫描变换】。

3.片元着色器(可编程)

也叫像素着色器,实现逐片元着色操作,最重要的是对纹理采样,它的输出是一个或者多个颜色值。

4.逐片元操作(高度可配置)

经历一系列测试决定片元的可见性(模板测试->深度测试->混合)【比如透明物体】

4.1模板测试

与之相对应的是模板缓冲,可以进行多重阴影绘制去除、限制渲染区域。

4.2深度测试

判断遮挡关系

4.3混合

二、什么是Shader

在几何阶段和光栅化阶段,这两个阶段都在GPU上进行,都是GPU流水线中的子流水线,而Shader所在的阶段就是渲染流水线的一部分,具体来说,Shader是GPU流水线上高度可编程的阶段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity中,Shader是用来定义物体表面的着色和渲染效果的一种程序。在Unity5.2及以上的版本中,Unity提供了四种Shader模板供我们选择。其中,Standard Surface Shader会产生一个包含了标准光照模型的表面着色器模板;Unity Shader会产生一个不包含光照(但包含雾效)的基本顶点/片元着色器;Image Effect Shader为我们实现各种屏幕后处理效果提供一个基本模板;Computer Shader则产生一种特殊的Shader文件,用于进行一些与常规渲染流水线无关的计算。一个单独的Unity Shader不能单独发挥作用,必须要和材质结合起来使用。 每一个Unity Shader文件可以包含多个SubShader语义块,但最少要有一个。当Unity需要加载一个Unity Shader时,会扫描所有的SubShader语义块,然后选择第一个能够在目标平台上运行的SubShader。如果都不支持的话,Unity会使用Fallback语义指定的Unity Shader。这是因为不同的显卡具有不同的能力,一些旧的显卡仅能支持一定数目的操作指令,而一些更高级的显卡可以支持更多的指令数。因此,我们希望在旧的显卡上使用计算复杂度较低的着色器,而在高级的显卡上使用计算复杂度较高的着色器,以提供更出色的画面效果。 SubShader的标签是一个键值对,它的键和值都是字符串类型。这些键值对是SubShader和渲染引擎之间的沟通桥梁,用来告诉Unity渲染引擎应该以怎样的方式和何时渲染这个对象。具体情况可以查看相关的表格。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

米芝鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值