什么是渲染 管道?

2020-07-06 10:06发布

6条回答
Mantra
2楼 · 2020-07-06 10:16

渲染管道与渲染管线是同一个意思,主要是讲解3D模型经过什么样的流程会变成屏幕上的像素信息。

渲染管线的流程是在 GPU 中进行的,它主要占有计算机的显存部分。渲染管线在这个过程中进行了顶点处理、面处理、光栅化、像素处理等阶段。

蜗牛
3楼 · 2020-07-06 13:39

想要在屏幕上渲染出效果惊人的画面,那就必须了解将一个3D场景渲染到2D屏幕的过程,而这个过程就是 渲染管线。可以将它类比成一个工厂的流水线,在工厂的流水线中,原材料经过各个环节的处理最终成为一个产品。而在渲染管线中,原材料就是3D场景的坐标和一些其他数据,然后经过一系列处理变成屏幕上的有色2D像素。

渲染管线主要可以分为以下三个阶段:

  • 应用阶段(Application Stage)

  • 几何阶段(Geometry Stage)

  • 光栅化阶段(Rasterization Stage)

应用阶段主要由应用程序主导,与CPU打交道。这个阶段需要完成的任务主要有:

  1. 数据从硬盘加载到内存并由CPU进行相应计算,将计算好的数据加载到显存

  2. 设置渲染状态

  3. 调用Draw Cal

几何阶段在GPU中完成,在接受到顶点数据输入以后,主要经历以下几个过程:

  1. 顶点着色器(Vertex Shader)

  2. 曲面细分着色器(Tesselation Shader)

  3. 几何着色器(Geometry Shader)

  4. 裁剪(Clipping)

  5. 屏幕映射(Screen Mapping)

光栅化主要经历以下阶段:

  1. 三角形设置(Triangle Setup)

  2. 三角形遍历(Triangle Traversal)

  3. 片元着色器(Fragment Shader)


小狮子
4楼 · 2020-07-06 13:43

渲染管线也称为渲染流水线,是显示芯片内部处理du图形信号相互独立的的并行处理zhi单元。顶点管线在GPU中的作用就是处理几何数据,并将3D数据投射到二维的屏幕上。借用一个网友说的简单例子来通俗的说明一下顶点管线和像素渲染管线的作用。一个画家在做画的时候,都需要先把所画人或物的轮廓,框架画出来,这里我们称之为“构图”;然后再根据光照进行着色,这里我们称之为“渲染”。顶点管线和像素渲染管线所起的就是这两个作用,顶点管线和引擎负责把“轮廓、框架”画出来,而像素渲染管线和引擎则负责对画好的“轮廓、框架”根据光照等因素进行着色,构成一幅完整的图形。渲染管线直接关系到显卡对画面的渲染性能

Ross
5楼 · 2020-07-06 14:03

渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。一个流水线是一序列可以并行和按照固定顺序进行的阶段。就像一个在同一时间内,不同阶段不同的汽车一起制造的装配线,传统的图形硬件流水线以流水的方式处理大量的顶点、几何图元和片段。


注意理解的是这里有一个前后关系,前一个阶段的输入会到后一个阶段去输出。比如在顶点程序当中,顶点程序计算的数据就会作为片段程序再进一步加工的材料。


为了更形象地理解渲染管线:

image.png

最上面的是:


【3D应用或者游戏】

3D应用或者游戏会直接调用 【3D应用接口】,也就是OpenGL或者DirectX等。OpenGL和DirectX是方便应用程序去进行硬件访问和调用的中间层。如果没有他们,我们就需要为硬件去编写一个非常复杂的专门针对硬件的驱动程序。

再往下,则是:


【CPU和GPU的分界线】

在此之上都是CPU的操作,一下进行GPU的运算。

GPU的运算是 从左往右进行的,最开始是 【GPU前段模块】 到 【图元装配】 这中间如果在过去T&L流水线的过程当中是由硬件设计好的运算过程,也就是集成的,它不能够进行编程控制。


当图形硬件有了可编程能力之后,我们就可以在这个阶段使用 【顶点着色器】 进行编写运算逻辑,用于取代过于直接集成在硬件中的运算。在这个阶段完成之后,会到**【光栅化以及插值】**阶段。


光栅化就是把计算机显卡当中运算的数据进行一个细分,用于去适配屏幕上具体的每一个像素的显示,但是光栅化并不等同于像素显示,像素显示最终反映的是颜色,而光栅化过后得到的结果是 【帧缓存】,在这个过程当中,我们可以插入 【片段着色器】,这个部分就可以使用可编程化运算。所以 【片段着色器】 的目标是为屏幕上最终要显示的每一个像素去计算它最后需要什么样的颜色。


对于Unity而言,上面的流程可以由下面的图表示:

image.png

最上面 【Geometry】 是几何模型,几何模型进入 【Unity】,可以理解为把几何模型Mesh、网格等数据交给Unity,Unity导入后就通过Unity引擎去调用 【Grphics APU】 图形API,调用图形API的过程就是在驱动GPU进行处理运算。


进入GPU运算首先进行的是 【Vertex Processor】 顶点处理器,这个部分就需要我们使用 【Vertex Shader】 顶点着色器,顶点着色器运算的结果会交给 【Pixel Processor】 像素处理器,也就是片段处理器,在这个部分我需要为像素处理编写 【Pixel Shader】 像素着色器程序,这部分计算完后就输出了最终我们可以用于在屏幕上的颜色信息,我们把它叫做 【Frame Buffer】 帧缓冲。帧缓冲存储的是计算机依次显示所要的数据,但也不仅仅是这些数据,它还有其他的附加信息,比如深度值等。


下面是Unity官方手册中的一张渲染管线图示。

渲染管道线中最左边的这个部分中Transform指的是模型的空间变换,主要针对的是顶点的空间几何变换;TexGen即Texture Generator,表示的是纹理坐标的生成,主要用于在顶点当中去取得纹理坐标,再转换为UV取值的范围;Lighting指的是光照。因此这个部分就是过去就是T&L几何变换光照流水线,当图形硬件具有了可编程能力后,这个固定的模块就被 【Vertex Shader】 顶点着色器代替了。


在顶点着色器处理过后,Unity就进入 【Culling & Depth Test】 裁剪和深度测试过程。裁剪和深度测试描述的是如果一个物体在摄像机前展示,它向着摄像机的面会被观察到,它背对着摄像机的面不会被观察到,在这样的情况下,为了减少GPU处理数据量就进行了一个裁剪(Culling),把看不见的面直接剔除,不需要去处理的这些面所涉及的顶点数据,从而加速图形处理。第二个方面深度测试(Depth Test),指的是摄像机有一个特性,在计算机当中没有无限这个概念,计算机处理的数据都是离散化的,它有一个范围,当超过最近和最远这个范围的这部分会被剔除。


接下来就进入到纹理采样(Texturing)和雾化处理(Fog)阶段。在这阶段实际上就是在进行光栅化处理,描述的就是如何在屏幕上显示每一个像素的颜色。这里需要去纹理采样,一张贴图有很多数据,我们去采集纹理上某一点的颜色值,这个就叫做纹理采样。雾化就是根据最后计算的数据后需不需要进行一个雾化处理,近处的很清晰,远处的有种朦胧感,这个部分就是片段着色器可编程的能力范围。


之后还需要 【Alpha Test】,指的是去绘制那些半透明的或全透明的物体。经过【Alpha Test】之后还需要进行 【Blending】 处理,这阶段会混合最终的图像。


以上介绍的是渲染管线的流程,要把握的主要的过程就是我们可编程能力是两个部分,一个就是几何变换和光照使用的顶点着色器部分,另一个就是关于如何去采样,去计算颜色以及雾化处理等使用的片段着色器部分。


这里需要注意的是Unity优化当中有一个主要部分就是减少Draw Call的调用,Draw Call就指的是应用程序去调用图形硬件GPU去进行渲染的调度过程。应用程序需要准备很多的数据,包括顶点数据、矩阵、向量等数据,都需要通过应用程序传递给GPU,这样个调度过程CPU必须要去收集数据以后才产生一个API的调用,这个过程的消耗是高昂的,如果反复地启动这个调用,那么就仅仅收集和传递参数这样的过程相当耗时耗力,就会造成了应用程序或游戏运行的瓶颈。因此要尽量减少Draw Call,尽量减少CPU对GPU这样的调用。


Shader和材质、贴图的关系

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


材质好比引擎最终使用的商品,Shader好比是生产这种商品的加工方法,而贴图就是原材料。


小结

Shader是图形可编程方案的程序片段。主要分为顶点着色器和片段着色器。


渲染管线是一种计算机从数据到最终图形成像的形象描述。


材质可以理解为商品,Shader是加工这种商品的方法,而贴图是加工过程中需要的材料。

————————————————

版权声明:本文为CSDN博主「WhiteJunior」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/lym940928/java/article/details/88382390


Transform
6楼 · 2020-07-06 17:13

定义: 显卡内部处理图像信号的并行处理单元,也称为渲染流水线

发生位置: CPU和GPU

渲染机理: 将图像所具备的图形信息(顶点、纹理、材质、摄像机位置等)经过一系列阶段的处理,最终转换为屏幕上的图像.

渲染流程:

应用阶段

几何阶段

光栅化阶段


3D 游戏以及 3D 模型通过渲染管线来渲染到 2D 的屏幕上。渲染管线的流程是在 GPU 中进行的,它主要占有计算机的显存部分。渲染管线在这个过程中进行了顶点处理、面处理、光栅化、像素处理。

1)顶点处理

顶点处理,是通过一系列坐标系的变换,让各个顶点通过一定的规律在摄像机前位移,最终在屏幕上对应这些顶点的过程。

首先,物体的各个顶点从自身坐标系,通过世界变换矩阵处理转换到世界坐标系,再通过取景变换矩阵变换到观察者坐标系,最后通过投影变换,将顶点转移到屏幕坐标系。

另外需要注意的是在观察者坐标系转换到投影坐标系的过程中,GPU(图形处理单元)还对材质属性和光照属性进行了处理。

2)面处理

三点成一面。面处理有三个部分:面的组装、面的截取、面的剔除。

面的组装:模型中的三个点会组成一个三角形的面(非任意点,因为每个点都有自己的编号)。这些面,面面相接,组成了我们能看到的模型。

面的截取:由于摄像机和人眼一样,可视的区域是一个锥形,模型在摄像机可视范围内可能并不是全覆盖,也就是在摄像机外,这些在摄像机之内的部分就会被截取。

面的剔除:为了模拟肉眼,摄像机前的物体会出现近大远小的现象,那么物体和物体之间会有遮挡,被遮挡的面会被剔除不处理;每个面都有法向量,所以只有在面的法向量和摄像机散射向量夹角大于90度的才会被摄像机捕捉到。

3)光栅化

光栅化,又称之合并阶段。它的主要功能是将面转换成一帧中的像素集合。

这一阶段是不可以编程的,它负责执行多个片段测试,包括:深度测试、alpha 测试和模板测试,程序员可以通过高度配置来实现想要的效果。如果通过了所有的测试,这部分颜色就会与帧缓冲存储的颜色通过 alpha 混合函数进行合并。

4)像素处理

这个阶段将像素区域着色,然后赋予贴图。

相关问题推荐

  • 回答 6

    第一步:对着Assets点击右键,选择ExportPackage第二步:选择场景文件以及和场景相关的资源或者素材,然后点击Export第三步:给导出的资源取名,并且选择要保存的位置即可

  • 回答 87
    已采纳

    玩游戏玩的很好,说明你对于游戏里面的规则、剧情设置还是比较了解的,对于从事游戏相关岗位来说也是优势之一。但是学习游戏开发还是要对游戏开发的工作内容做进一步的了解,游戏开发涉及代码较多,可以通过进一步的了解,判断自己是否适合学习这个方向,另外...

  • 回答 18

    个人觉得如果有一定的技术基础的话还是可以考虑自学,如果零基础的话可能会有些难度

  • 回答 11

    游戏开发入门不难。后期发展需要你有丰富的奇思妙想。游戏开发肯定是培训好,自学学得不系统,并且不易发现自身薄弱之处。游戏开发的学习时长还是要看你自己对知识与技术的掌握能力,一般来说,游戏开发的学习时长大约在五个月左右。...

  • 回答 10

    问题还是出在粒子的sorting fudge。在unity的2d模式下,游戏本身的背景相当于是sorting fudge的0,当你把粒子的sorting fudge设为0以上的时候,粒子就都会被背景盖住。所以在3d模式下给alpha正值来给add垫底的话,到了2d模式下就会通通不显示。所以遇上这样的...

  • 回答 17

    虚幻4引擎,你会看到和平精英加载页面左下角有这个图标。

  • 回答 8
    已采纳

    转载知乎上的两位答友的回答,各有道理。作者:风小锐链接:https://www.zhihu.com/question/322249959/answer/675883379来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。未来Unity有可能出现3A大作吗? 有可能。基于Unity已...

  • 回答 11

    在Assets文件夹里面.点击右键Create/Material即可以创建材质球

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 18

    粒子系统由粒子发射器、粒子动画器和粒子渲染器三部分组成,主要用于游戏场景中一些特殊效果,如水、烟火等等

  • 回答 18

    首先,Python开发游戏非常尴尬,原因是没有好用的游戏开发库。Python开发游戏仅推荐PyGame,PyGame是对多年以前很流行的游戏开发库——SDL的封装。但是说实话功能太简陋了,做个动画都得考虑刷新的问题。楼主要做简单小游戏,只需要画一两周熟悉Unity引擎,然...

  • 回答 9

    1.标记水体碰撞的位置2.计算水波的传递 通过波动公式,3D或者2D 波动公式都行3.水面顶点采样波动传递结果计算结果做顶点Y轴偏移

  • 回答 15

    Unity3D中两种阴影的实现传统的ShadowMapShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中。具体实现分以下几个步骤:如果有平行光开启了阴影,Unity就会为该光源计算它...

  • 回答 18

    Doozy UI是Unity UI视图层的框架,本身使用的还是UGUI的组件,但提供了一套强大的UI管理功能,可以很方便的实现一些炫酷效果,方便的UI系统管理与事件传递机制。

  • 回答 12

    Unity3d更好,因为U3D占有的市场更大,目前cocos大都是用来开发棋牌游戏的,在这方面它有着巨大的优势。而Unity3d既可以用来开发大型3D游戏,也可以用来开发vr游戏、vr应用,这是比较不错的,未来有着巨大的前景。另外ue4也是个不错的选择,近年来用ue4开发的...

  • 回答 11

    当Unity 需要做热更新的时候(2013年开始),而普通的C#又做不到的时候,而对于游戏行业来说Lua脚本热更新已经是很成熟的方案,自然Lua 热更新就成为了Unity热更新的首选。

没有解决我的问题,去提问