Unity Shader概述(一)

Unity Shader概述

渲染流水线

渲染流水线的目的是将3D->2D
在这里插入图片描述
图元的概念: 基本图形元素(图元)是任何一个图形表达都是由若干不同的点、线、面图案或相同的图案循环组合而成的。这些点、线、面图案即为基本图形元素

CPU应用阶段

  • 准备场景数据
  • 设置渲染状态
  • 不可见剔除
  • 调用Drawcall
    ①该阶段将数据加载到显存当中
    在这里插入图片描述
    将渲染所需的数据从硬盘加载到内存当中,网格纹理等数据又被加载到显存当中。(一般加载到显存当中后,内存中的数据就会被移除)在渲染时,GPU可以快速地访问到显存中的数据,提高效率。
    ②设置渲染状态
    **这些状态定义了场景中的网格是怎样被渲染的。**例如,使用哪个顶点着色器,片元着色器,光源属性,材质等。请添加图片描述
    ③调用DrawCall
    CPU通过调用Draw Call来告诉GPU开始进行一个渲染过程。一个Draw Call会指向本次调用需要渲染的图元列表,而不会包含任何材质信息。
    请添加图片描述

GUP流水线(包含几何阶段和光栅化阶段)

几何阶段和光栅化阶段,开发者无法拥有绝对的控制权,其实现的载体是GPU。GPU通过实现流水线化来加快渲染速度。虽然无法掌握绝对的控制权,但是GPU仍然向我们提供了许多控制权,如下图:
绿色的表示可编程控制
黄色代表着可配置但是不可编程
蓝色代表GPU固定实现,不可编程
实线表示该shader必须由开发者编程实现
虚线表示该Shader是可选的。
请添加图片描述
顶点数据:顶点数据是由应用阶段加载到显存当中的,再由Draw Call指定的。这些数据随后都会传入到顶点着色器钟。
顶点着色器:顶点着色器是完全可编程的,常用来实现顶点的空间变换,需要时还可以计算和输出顶点的颜色。例如,我们可能需要进行逐顶点的光照。
曲面细分着色器:是一个可选着色器,用于细分图元。
几何着色器:是一个可选着色器,可以被用于逐图元的着色操作,或者被产生于更多的图元。
裁剪: 这一阶段是将那些不在摄像机视野中的顶点裁剪掉,剔除某些三角图元的面片。这个阶段是可配置的。
屏幕映射:这一阶段是不可配置和编程的,负责把每个图元的坐标转换到屏幕坐标当中。

三角形设置 :计算来自三角网格顶点数据。
三角形遍历:检查每个像素是否被 个三角网格所覆盖。如果被覆盖的话,就会生成一个片元 (fragment) 。三角形遍历的过程。根据几何阶段输出的顶点信息,最终得到该三角网格覆盖的像素 位置。对应像素会生成一个片元,而片元中的状态是对三个顶点的信息进行插值得到的。
片元着色器:完全可编程的,用于实现逐片元的着色操作。
逐片元操作:负责相当重要的操作,如修改颜色、深度缓冲、进行混合等,不可编程,但是可配置。

几何阶段详解

顶点着色器

顶点着色器是完全可编程的,常用来实现顶点的空间变换,需要时还可以计算和输出顶点的颜色。顶点着色器本身不可创建或者销毁任何顶点,而且无法得到顶点与顶点之间的关系。GPU可以利用本身的特性快速处理每一个顶点。
顶点着色器主要工作:坐标变换和逐顶点光照,除此之外还可以输出后续阶段所需的数据等。
在这里插入图片描述

裁剪

一个图元与摄像机的关系有三种:完全在视野内,完全在视野外,部分在视野内。完全在视野内的图元就继续传递给下一个流水线阶段,完全在视野外的图元则剔除不会传递给下一个流水线阶段。部分在视野内的则需要进行剔除,形成新的顶点坐标传递给下一个流水线阶段。

屏幕映射

每个图元裁剪后的齐次坐标(NDC) 转换到屏幕坐标系 (Screen Coordinates) 下,屏幕坐标系是一个二维坐标系,和用于显示画面的分辨率有很大关系。
屏幕映射如下图所示,将齐次坐标下(-1,1)的坐标范围转换到(x1,y1),(x2,y2)。这个过程实际上就是一个缩放的过程。在这个处理中Z轴不做处理。屏幕坐标系和Z轴构成了窗口坐标系。这些坐标会被传到光栅化阶段。
在这里插入图片描述

光栅化阶段详解

三角形设置

计算来自几何阶段提供的三角网格顶点数据,得到三角形的表示。

三角形遍历

检查每个像素是否被一个三角网格完全覆盖,如果被覆盖了就会产生一个片元。而这个过程就叫做三角形遍历,也称作扫描变换。片元中的状态是对三个顶点的信息进行插值得到的。请添加图片描述

片元着色器

在DirectX中叫作像素着色器(Pixel Shader),是完全可编程的,用于实现逐片元的着色操作。片元着色器的输入是上一个阶段对顶点信息插值得到的结果,具体来说是根据那些从顶点着色器中输出的数据插值得到的。而其输出是一个或者多个颜色值。请添加图片描述
这个阶段可以完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。为了在片元着色器中进行纹理采样,外面通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角网格的三个顶点对应的纹理坐标进行插值后,就可以得到覆盖的片元的纹理坐标。

逐片元操作

逐片元操作是OpenGl中的叫法,在DirectX中叫做输出合并阶段
作用:决定每个片元的可见性,涉及很多测试工作,如深度测试,模板测试。如果一个片元通过了所有测试之后 ,就需要把这个片元的颜色值和已经存储在颜色缓冲区的色彩进行合并,或者说混合。
在这里插入图片描述
测试的过程也是一个复杂的过程,而且不同的图形接口的实现细节也不相同。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值