渲染中的GPU流水线
Posted Z_hongli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渲染中的GPU流水线相关的知识,希望对你有一定的参考价值。
渲染中的GPU流水线
简述:
(1)CUP通过调用Draw call来命令GPU进行渲染,GUP的渲染过程就是GUP流水线。
(2)对于概念阶段的后面两个阶段:几何阶段和光栅化阶段,开发者没有绝对的控制权,但是GPU还是向开发者开放了很多控制权限,其实现的载体是GPU。
几何阶段和光栅化阶段可以分成若干更小的流水线阶段,这些流水线阶段由GPU来实现,每个阶段GPU提供了不同的可配置性或可编程性。图2.6中展示了不同的流水线阶段以及它们的可配置性或可编程性。
GUP流水线的渲染过程(结合上图):
几何阶段:
(1)顶点数据:GUP的渲染流水线接收顶点数据作为输入。这些顶点数据是由应用阶段加载到显存中,再由Draw Call制定,随后被传递给顶点着色器。
(2)顶点着色器:顶点着色器是完全可编程的,它通常用于实现顶点的空间变换、顶点着色等功能。
(3)曲面细分着色器:一个可选的着色器,它用于细分图元。
(4)几何色器:一个可选的着色器,它可以被用于执行逐片元的着色操作,或者被用于产生更多的图元。
(5)裁剪: 这一阶段的透视除法后的是将那些不在摄像机视野内的顶点裁剪掉,并剔除某些三角图元的面片。这个阶段是可配置的。例如,我们可以使用自定义的裁剪平面来配置裁剪区域,也可以通过指令控制裁剪三角图元的下面还是背面。
(6)屏幕映射:这一阶段是不可配置和编程的,它负责把每个图元的坐标转换到屏幕坐标系中。
几何阶段的任务:用于处理我们要绘制的几何相关的事情,例如要绘制的图元是什么,怎么绘制;重要任务是把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。
光栅化阶段:
(1)三角形设置:固定函数(Fixed-Function) 的阶段。
(2)三角形遍历:固定函数(Fixed-Function) 的阶段。
(3)片元着色器:完全可编程的,它用于实现逐片元(Per-Fragment) 的着色操作。
(4)逐片元操作:负责执行很多重要的操作,例如修改颜色、深度缓冲、进行混合等,它不是可编程的,但具有很高的可配置性
。
光栅化阶段的任务:这一阶段将会使用上一个阶段传递的参数来生产像素,并渲染出最终的图像;主要任务是决定每个渲染图元中那些像素应该被绘制在屏幕上。
顶点着色器
特点:
(1)处理单位是顶点,输入进来的每个顶点都会调用一次顶点着色器。
(2)其本身不能够创建或者摧毁一个顶点,而且无法得到顶点与顶点之间的关系。
(3)每个顶点独立并行处理,处理速度很快。
需要完成的工作:
1)坐标变换;2)逐顶点光照;3)输出后续阶段所需要的数据
坐标变换
对顶点的坐标(即位置)进行某种变换。项点着色器可以在这一步中改变顶点的位置,这在顶点动画中是非常有用的。
例如,我们可以通过改变顶点位置来模拟水面、布料等。但需要注意的是,无论我们在顶点着色器中怎样改变项点的位置,一个最基本的顶点着色器必须完成的一个工作是:把顶点坐标从模型空间转换到齐次裁剪空间
o.POs=mul (UNITY_MVP, V.position);
类似上面这句代码的功能,就是把顶点坐标转换到别齐次裁剪坐标系下, 接着通常再由硬件做透视除法后,最终得到归一化的设备坐标(Nomalied Device Cordinates,NDC).图28展示了这样的一个转换过程。
需要注意的是:
(1)图2.8给出的坐标范围是OpenGL同时也是Unity使用的NDC,它的Z分量范围在[1,1]之间,而在Direex中,NDC 的z分量范围是[0, 1]。
(2)项点着色器可以有不同的输出方式。最常见的输出路径是经光栅化后交给片元着色器进行处理。而在现代的Shader Model中,它还可以把数据发送给曲面细分着色器或几何着色器。
裁剪
(1)完全在摄像机视野范围中的图元保留、部分在摄像机视野范围中的图元裁剪
、完全不在摄像机视野范围中的图元不会再向下传递。
(2)不可编程,可配置。
以上是关于渲染中的GPU流水线的主要内容,如果未能解决你的问题,请参考以下文章