1.渲染流水线

什么是渲染流水线?

渲染流水线的目的:有一个三维场景出发、生成(或者说渲染) 一张二维图像。

各个工作通常由CPU和GPU共同完成

渲染流程可以分为三个阶段:应用阶段(Application Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage)

注意这里是概念阶段,每个概念阶段包含了子流水线阶段。它是为了给一个渲染流程进行基本的功能划分而提出来的。

应用阶段

该阶段由CPU负责实现,由开发者主导

任务:

1.准备好场景数据(摄像机的位置、视锥体、场景中包含了哪些模型、使用了哪些模型等)

2.为了提高渲染性能,做粗粒度剔除,把不可见物体剔除,不需要再交给几何阶段处理

3.设置好每个模型的渲染状态材质(漫反射颜色、高光反射颜色)、纹理,shader

这一阶段最重要的是输出渲染所需要的几何信息,即渲染图元(点、线、面等),渲染图元传递个几何阶段

几何阶段

用于处理所有和我们要绘制的几何相关的事情。如:绘制的图元是什么?怎样绘制它们?在哪里绘制它们?在GPU运行。

对每个渲染图元逐顶点,逐多边形的操作

任务:

  1. 把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。
  2. 通过对输入的渲染图元进行多步处理后,这一阶段将输出屏幕的二维顶点坐标,每个顶点对应的深度值、着色等相关信息,传递给下一阶段

光栅化阶段

产生屏幕像素,渲染最终图像  在GPU运行

任务:

  1. 决定每个渲染图元中的哪些像素应该被绘制在屏幕上。
  2. 对上一个阶段得到的顶点数据(纹理坐标、顶点颜色等)进行插值,再进行像素处理

注意:以上三个流水线阶段与GPU流水线不同。这里的流水线均是概念流水线,是为了给渲染流程进行基本的功能划分而提出来的。而GPU流水线,则是硬件上真正用于实现上述概念的流水线。

CPU和GPU之间的通信

渲染流水线的起点是CPU,即应用阶段,应用阶段大致分为三个阶段:

1)把数据加载到显存中

2)设置渲染状态

3)调用Draw Call

把数据加载到显存中

所有渲染所需要的数据都需要从硬盘(HDD)中加载到系统内存(RAM)。然后网格和纹理等数据又被加载到显卡的存储空间——显存(VRAM)。因为显卡对显存的访问速度特别快,而大多数显卡对系统内存是没有直接访问权力。

注意:

  1. 真实的渲染中需要加载到显存中的数据要复杂的多。如,顶点位置信息,法线方向,顶点颜色,纹理坐标等。
  2. 数据加载到显存中后,RAM中的数据可以移除。但对于一些数据来说,CPU仍然需要访问它们。就不希望这些数据被移除,因为从硬盘到RAM十分耗时。

在这之后,开发者要通过CPU来设置渲染状态

设置渲染状态

什么是渲染状态?

定义场景中的网格怎样被渲染。如使用哪种顶点着色器/片元着色器,光源属性,材质等。

如果没有更改渲染状态,那么所有网格都将使用一种渲染状态。

上述完成后,调用渲染命令Draw Call

Draw Call

DrawCall是一个命令,发起方CPU 接受方GPU。

作用:

  1. 指向一个需要被渲染的图元列表,而不会再包含任何材质信息。
  2. 给定一个DrawCall时,GPU会根据渲染状态(材质、纹理、着色器等)和所有输入的顶点数据来进行计算,最终输出成屏幕上的像素。

GPU流水线

当GPU从CPU那里得到渲染命令后,会进行一系列流水线操作,最终把图元渲染到屏幕上。

顶点着色器(vertex shader):完全可编程的,用于实现顶点的空间变换,顶点着色

曲面细分着色器:可选着色器,用于细分图元

几何着色器:可选着色器,用于执行逐图元的着色操作或用于生成更多图元

裁剪(Clipping):将不再摄像机视野内的顶点剪裁掉,剔除某些三角图元的面片,可配置的。

屏幕映射:负责把每个图元的坐标转换到屏幕坐标系上。

三角形设置和三角形遍历:固定函数阶段

片元着色器:实现逐片元的着色操作

逐片元操作:修改颜色、深度缓冲、进行混合等。

顶点着色器

流水线的第一个阶段、输入来自CPU、处理单位时顶点、每输入一个顶点都会调用一次、本身不创建或销毁任何顶点、无法得到顶点之间的关系。

作用:

  1. 坐标变换
  2. 逐顶点光照
  3. 输出后续阶段所需的数据

坐标变换

把顶点坐标从模型空间转换到齐次裁剪空间。

接着由硬件做透视剔除法后,最终得到归一化的设备坐标(NDC)

注意:

  1. 图中给出的坐标范围时OpenGL同时也是unity使用的NDC,z分量范围[-1,1]之间,而DirectX种NDC的z分量范围时[0,1]。
  2. 顶点着色器可以有不同的输出方式。最常见的输出路径时经过光栅化后交给片元着色器处理。在现代shader model中,可以把数据发给曲曲面细分着色器或几何着色器。

裁剪 

屏幕映射

这一步的坐标仍是三维坐标系下的坐标,而屏幕映射的任务就是把每个图元的x,y坐标转换到屏幕坐标系下,屏幕坐标是一个二维坐标,和用于显示画面的坐标系有关。 

如果你发现图像是倒转的,可能就是这个原因造成的。

三角形设置

从这里开始进入光栅化阶段。

光栅化的两个目标:

  1. 计算每个图元覆盖了哪些像素
  2. 为这些像素计算它们的颜色

三角形设置的任务:计算光栅化一个三角形网格所需的信息。

上一阶段我们只得到三角网格每条边的两个端点。但要知道三角网格对像素的覆盖情况,就必须计算每条边上的像素。计算三角网格表示数据的过程就是三角形设置。

三角形遍历:

作用:检查每一个像素是否被一个三角网格所覆盖。如果覆盖,则生成一个片元(fragment)。找到哪些像素被三角形玩个覆盖的过程就是三角形遍历,也被成为扫描变换。

该阶段使用三角网格3个顶点的顶点信息对整个区域的像素进行差值。

片元着色器

在此阶段,片元还并不是一个真正意义上的像素。

前面阶段不会影响像素的颜色值,只是会产生一系列的数据信息,来表述一个三角形网格是怎样被覆盖每个像素的。真正对像素产生影响的是下一阶段——逐片元操作。

输入:片元着色器的输入是上一阶段对顶点信息插值得到的结果,是根据顶点着色器输出的数据插值得到的。

输出:一个或多个颜色值。

纹理采样:纹理采样是该阶段的重要任务之一,通常会在顶点着色器阶段输出每一个顶点对应的纹理坐标,经过光栅化阶段对三角网格3个顶点对应的纹理坐标进行插值后,就可以得到器覆盖的片元的纹理坐标了。

逐片元操作

这一步骤的目的是:合并  这一阶段的操作对象是:片元

1.决定每个片元的可见性。这涉及很多测试工作,深度测试、模板测试

2.如果一个片元通过了所有测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并,或者说混合

模板测试和深度测试

混合

OpenGL和DirectX

什么是OpenGL和DirectX?

图像应用编程接口。用于渲染二维或三维图形。这些接口架起了上层应用程序和底层GPU的沟通桥梁。

一个应用程序向这些接口发送渲染命令,而这些接口会依次向显卡驱动发送渲染命令,这些显卡驱动是真正知道如何和GPU通信的角色,它们把OpenGL和DirectX的函数调用翻译成GPU能听懂的语言,同时还复杂把纹理等数据转换成GPU所支持的格式。

应用程序运行在CPU上,应用程序调用OpenGL和DirectX的图形接口渲染所需求的数据如顶点数据、纹理数据、材质参数等数据存储在显存在的特定区域。开发者通过图像编程接口发出渲染命令,这些命令也被称为DrawCall,它们被显卡驱动翻译成GPU能理解的代码,进行真正的绘制。

什么是HLSL、GLSL、CG

编写着色器代码的高级着色器语言

GLSL(OpenGL):跨平台性

HLSL(DirectX):微软,平台有限

CG(NVIDIA):真正意义跨平台

unity中的着色器语言并非真正的着色器语言,尽管语法相同

DrawCall

什么是DrawCall?

CPU调用图像编程接口,如OpenGL中的glDrawElements命令或Directx中的DrawIndexPrimitive命令,以命令GPU进行渲染操作。

误区

DrawCall中造成性能问题的元凶是GPU,认为GPU上的状态切换是耗时的,其实不是的,真正拖后腿的是CPU。

问题一:CPU和GPU是如何实现并行工作的?

没有流水线,CPU就要等GPU上的渲染任务完成才能再次发出渲染命令。这种方式是效率低下的。解决方法是命令缓冲区

命令缓冲区:包含一个命令队列,CPU添加命令,GPU读取命令,添加和读取相互独立。这使得CPU与GPU相互独立。CPU需要渲染就向其中添加命令,GUP完成上一个渲染任务后,就从中再取一个命令执行。

命令缓冲区有很多种类,而DrawCall是其中一种,其他命令还有改变渲染状态等(如改变使用的着色器,使用不同的纹理等)。

问题二:为什么DrawCall多了会影响帧率?

每次调用DrawCall之前,CPU需要向GPU发送很多内容,包括数据、状态和命令等。这一阶段CPU要完成很多工作,如检查渲染状态等。CPU完成准备工作,GPU开始渲染。GPU渲染很强,200个和2000个没有区别,渲染速度是快于CPU提交命令速度的。如果DrawCall数量太多,CPU会把大量时间花费在提交DrawCall上,造成CPU过载。

问题三:如何减少DrawCall?

批处理:

把很多小的DrawCall合并成一个大的DrawCall,这就是合批的思想。

注意:批处理更加适合静态物体如大地、石头等,对于静态物体只需要合批一次即可。对动态物体也可以合批,但每一帧都要重新进行合批再发给GPU,这对空间和时间会造成一定影响。

为了减少DrawCall的开销,要注意两点:

  1. 避免使用大量很小的网格。当不可避免地需要使用很小的网络结构时,考虑是否可以合并它们。
  2. 避免使用过多的材质。尽量在不同的网格之间共用同一个材质。

固定管线渲染

固定函数流水线(固定管线),指在较旧的GPU上实现的渲染流水线。只给开发者提供一些配置操作,没有对流水线阶段的完全控制权。

总结

shader是什么:

  • GPU流水线上的一些可高度编程的阶段,而由着色器编译出来的最终代码是会在GPU上运行的(对于固定管线来说,着色器有时等同于一些特定的渲染设置)
  • 有一些特定类型的着色器,如顶点着色器,片元着色器等
  • 依靠着色器我们可以控制流水线中的渲染细节,例如用顶点着色器来进行顶点变换以及传递数据,用片元着色器来进行逐像素的渲染
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值