shader入门精要笔记(2)

本文详细解析了CPU与GPU在渲染过程中的通信机制,从数据加载到显存,设置渲染状态,再到调用DrawCall。GPU流水线包括顶点着色器、裁剪、屏幕映射、光栅化等多个阶段,每个阶段都有其特定功能,如顶点变换、深度测试、混合等。理解这些概念有助于优化图形渲染效率。
摘要由CSDN通过智能技术生成

  CPU和GPU之间的通信

渲染流水线的起点是CPU(应用阶段)应用阶段可分为:1.把数据加载到显存中。2.设置渲染状态。3.调用Draw Call

1.把数据加载到显存中

所有的渲染所需的数据来自硬盘,然后加载到系统内存中,之后网格和纹理等数据又被加载到显存中,显卡对于显存的访问速度更快,大多数显卡对于RAM没有直接的访问权利。加载到显存的数据为:顶点位置信息,法线方向,顶点颜色,纹理坐标等。吧数据加载到显存中后,RAM中的数据便可移除,对于一些数据我们可能不希望被移除,因为从硬盘到RAM的过程很耗时。而这需要通过CPU来设置渲染状态,指导CPU如何工作。

2.设置渲染状态

(使用什么纹理,开不开启混合,使用哪个顶点着色器,哪个片元着色器)泛指如何进行渲染

3.调用Draw Call

Draw Call 就是一个命令,它由CPU发起,GPU接收,这个命令只会指向需要被渲染的图元列表,不会包涵材质信息(已经在渲染状态中设置好了)如果给定一个 Draw Call时,GPU就会根据渲染状态(材质,纹理,着色器)和所有被输入的顶点数据来进行计算,最终输入到屏幕上的像素。计算过程即为GPU流水线。

GPU流水线:当GPU收到CPU的渲染命令,进行的一系列流水先操作,最终把图元渲染到屏幕上。具体流程如下:顶点数据   》{(  顶点着色器 》 曲面细分着色器 》几何着色器 》 裁剪 》屏幕映射 )几何阶段 } 在几何阶段 ,顶点着色器,曲面细分着色器,几何着色器是可编程的,其中曲面细分着色器,几何着色器是该shader是可选的。裁剪是流水线可以配置但不可编程的。屏幕映射是由GPU固定实现的,开发者没有任何控制权。

由几何阶段 》 (三角形设置 》 三角形遍历 》片元着色器 》逐片元操作)光栅化阶段  》 屏幕图像 。在光栅化阶段,三角形设置,三角形遍历是由GPU固定实现的,开发者没有任何控制权。片元着色器是可编程的且是该shader是可选的。逐片元操作是流水线可以配置但不可编程的。

概念:1.顶点着色器(完全可编程,实现顶点变换,顶点着色等功能)2.曲面细分着色器(可选的着色器,用于细分图元)3.几何着色器(可选着色器,用于逐图元操作或产生更多的图元)4.裁剪(可配置,将不在摄像机视野的顶点裁剪掉,剔除某些三角面的面片)自定义:通过指令控制裁剪区域,通过指令控制裁剪正面还是背面。 5.屏幕映射(无法控制,负责把每个图元坐标转换到屏幕坐标系中)6.三角形设置和三角形遍历(固定函数)7.片元着色器(完全可编程,逐片元的着色操作)8.逐片元操作(可配置性极高:修改颜色,深度缓冲,进行混合)

详细解释:1.顶点着色器:它是流水线的第一个阶段,从CPU输入,它对顶点进行处理,输入进来的每一个顶点都会调用一次顶点着色器,但是顶点着色器不能够创建和销毁任何顶点,而且无法得到顶点和顶点之间的关系,无法得知两个顶点是否属于同一个三角网格,由于其相互独立性,GPU可以快速优化每一个顶点。顶点着色器主要完成的工作为坐标变换和逐顶点光照,其还可以输入后续阶段所需的数据。

坐标变换:对顶点坐标(位置)进行某种变换,可以进行顶点动画,其必须完成的工作是把顶点坐标从模型空间转换到齐次裁剪空间下来:o.pos = mul(UNITY_MVP,v.position);由硬件做透视除法后,最终得到归一化的设备坐标。顶点着色器有不同的输出方式,常见输出方式为:经过光栅化后交给片元着色器进行处理。

2.裁剪:由于场景很大,摄像机视野不可能完全覆盖场景,经过裁剪剔除不在摄像机视野内的物体。图元与摄像机视野由三种关系:完全在视野内,部分在视野内,完全在视野外。完全在视野内的图元被渲染,视野外被剔除,视野边缘生成新的顶点。

3.屏幕映射:这一阶段仍是三维坐标系下的坐标,屏幕映射的任务是把每个图元的X和Y坐标转换到屏幕坐标系,屏幕坐标系是二维坐标系与显示画面分辨率有关。屏幕映射得到的屏幕坐标决定了这个顶点对于屏幕上哪个像素以及距离像素有多远

4.三角形设置:自此进入光栅化阶段,计算目标:计算每个图元覆盖了哪些像素,以及为这些像素计算他们的颜色,作为光栅化的第一 阶段,其会计算光栅化一个三角网格所需的信息,上一阶段输出的是三角网格的顶点,而这一阶段得到三角网格每条边上的两个端点,为了计算边界像素的坐标信息需要得到三角形边界的表示方式,这样一个过程叫做三角形设置。

5.三角形遍历:此阶段将检查每个像素是否会被一个三角网格所覆盖,被覆盖则生成一个片元,找到哪些像素被三角网格覆盖的过程是三角形遍历,此阶段也为扫描变换。一个片元是包涵很多状态的集合,包括法线信息,屏幕坐标,纹理坐标,深度信息等。

6.片元着色器:是非常重要的可编程着色器阶段,在DX中被称为像素着色器,其相当于又一次存储了一系列数据(产生一系列数据信息以此表述一个三角网格是怎样覆盖每个像素的)这一阶段便可进行纹理采样通过光栅化阶段对三角网格的3个顶点对应的纹理坐标进行插值,得到覆盖片元的纹理坐标

7.逐片元操作:OPGL的说法,在DX中被称为输出合并阶段,主要任务:决定每个片元的可见性。涉及深度测试,模板测试。如果一个片元经过所有的测试,需把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并(或者混合)。通常其过程为:片元 》》模板测试 》》深度测试》》混合 》》颜色缓冲区。模板测试对应的便是模板缓冲,开发者可进行修改操作进行指定,如果开启模板测试,GPU会读取掩码中片元设置的模板值,然后让该值和读取(掩码)的参考值进行比较,函数由开发者制定,小于时舍弃,或者大于时舍弃,取决于开发者。通常高级使用(渲染阴影,轮廓渲染)。 通过模板测试后进行到深度测试,开启深度测试后将该片元的深度值与已经存在深度缓冲区中的深度值进行比较,与上一过程类似,其由开发者进行设置。若没有通过测试便会被舍弃,如果通过测试,开发者还可判断是否通过此片元深度值覆盖原有的深度值,通过开启/关闭写入而达到,透明效果和深度测试深度写入关系密切。 不透明物体,开发者可以关闭混合操作,半透明则使用混合湿气看起来是透明的。混合操作也是可以高度配置的。为了避免我们看到正在进行的光栅化的图元,GPU会使用双重缓冲的策略,对场景的渲染是在幕后发生的,即在后置缓冲中。一旦场景已经被渲染到了后置缓冲中,GPU就会交换后置缓冲区和前置缓冲区中的内容,而前置缓冲区是之前显示在屏幕上的图像,因此我们看到的图像是连续的。

总结:这是渲染的基本全流程,而在Unity 中,它已经封装好了大部分操作,我们只需修改和编写顶点着色器和片段着色器设置一些状态即可,掌握其背后原理明白一些错误原因也是尤其重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值