美文网首页
可编程管线简介

可编程管线简介

作者: XY9264 | 来源:发表于2019-04-03 12:33 被阅读0次
    可编程管线流程

    Application Stage:

    输入primitive(点,线段,几何体)即vertex data。

    Vertex Data包括:

        \bullet  Vertex Position

        \bullet Vertex Normal

        \bullet Vertex Color

        \bullet Texture coordinate(UV)

    Geometry Stage:

    Vertex Shader :

        \bullet 改变顶点位置

        \bullet  Vertex Transformation (Model-View-Projection)

        \bullet  纹理坐标转换

        \bullet Per-vertex Lighting

        \bullet  ……

    MVP Matrix:

    MVP矩阵转换过程

    Clip space是视锥空间,然后会由硬件进行透视除法(NormalizedDevice Coordinates, NDC),换算成归一化坐标的立方体空间中(-1,-1,-1)到(1,1,1),方便调整深度与位置。

    Primitive Assembly:

    图元组装,把零散定点组装成三角形

    Tessellation Shader (Optional for DX11,OpenGL4,OpenGL ES3.2):

    把Primitive细分成更精细,更多三角面。

    Geometry Shader(Optional for DX10,OpenGL3.2,OpenGL ES3.2 ):

    输入单个primitive,进行顶点和图元的增减

    Clipping:

    把NDC空间外的部分剔除,卡在中间的用新顶点补齐。

    Screen Mapping:

    把3D空间转换到2D屏幕,即屏幕映射。

    Rasterizer Stage:

    Rasterization & Interpolation:

    把三角形区域转化成一片一片fragment(不是Pixel),根据深度与位置其颜色做插值运算。

    Fragment data:

    \bullet Screen coordinate

    \bullet  Color

    \bullet  Depth

    \bullet  Normal

    \bullet  Texture coordinate(UV)

    \bullet  ……

    Fragment shader:

    输入一个个的fragment,改变其颜色值和纹理映射(Texturemapping)

    Raster Operations:可以用选项来控制

    Raster Operations

    \bullet  Pixel Ownership Test:当两个视窗(物体)重叠时,确定pixel的所有权

    \bullet  背面剔除(不在图上)

    \bullet  Scissor(剪刀) Test:设定一个长方形区域,物体只能在里面渲染

    \bullet  Alpha Test:透明度测试,当透明度大于某值或小于某值才渲染

    \bullet Stencil(模板) Test:使用一个参考值做比较,满足参考值的可以渲染,即用来限制渲染范围

    在说明模板测试之前,我们需要先介绍一下模板缓存。

    模板缓存与深度测试缓存、后台缓存(或颜色缓存,最终显示在屏幕上的缓冲区)的大小(分辨率)完全一致,模板缓存中的像素点与后台缓存的像素点是一 一对应的。模板缓存允许我们动态地、有针对性地决定是否将某个像素写入后台缓存中。模板缓存用与获得某种特效,如镜面效果或阴影效果。在实现镜面效果时,我们在“镜子”这块区域中绘制某个特定物体的映像,而使用模板缓存来阻止物体映像在“非镜子”的区域中进行绘制。为了进行这种阻止,就需要使用模板测试。判断是否将某个像素写入后台缓存的决策过程,称为模板测试

    \bullet  Depth Test:距离Camara越远深度越高,一般设定深度小的才会被渲染出来

    \bullet  Blending:颜色值混合,把fragment shader输入的颜色值和当前画面的颜色值混合,一般用来做半透明

    融合技术能使我们将当前要进行的光栅化的像素的颜色与先前已经光栅化并处于同一位置的像素的颜色进行合成,即将正在处理的图元颜色值与存储中后台缓存中的像素颜色值进行合成。利用该技术,我们可以获得各种各样的效果,尤其是透明效果。不过值得注意的是,为了中场景中绘制透明物体,通常需要对物体按照由后到前的顺序进行混合处理,如果按照任意顺序进行处理将会产生严重的失真。所以在blending(混色)操作之前要来一次Depth test

    \bullet  Dithering:用抖动的方式把颜色值算得更精确

    在低位深度的图象中,由于颜色总数的限制,有些颜色无法显示出来,为了模拟出那些颜色以提高显示效果,广泛采用了一种称作抖动处理(dithering)的方法,也称半色调处理(Halftoning)。它是指用交替的点图案去模拟在图象中不能使用的颜色的过程。单色图象是最简单的格式,一般由黑色和白色组成,在一些单色图象如黑白照片和有深浅的图案中,会使用各种灰度,这种图象常被称为灰度图象(Grayscale Image)。由于人眼会把一个很细致的黑白相间的图案解释成灰色,所以灰度图象也可使用单色文件格式,数据仍然可以是黑和白。使用黑色或某一种单色的点获得连续的该色灰度的过程就是抖动处理。抖动处理被更多的用在那些低位数彩色图象文件中,与不采用这种处理相比,它具有更好的显示效果。

    \bullet  Logic OP:用&,||,!来进行一些数值比较,最后输出颜色值到color buffer

    相关技术:

        \bullet  Early Z:把Depth Test放到fragment shader之前,可以去掉一些不必要的fragment,节约时间

        \bullet  Double buffering:渲染需要时间,所用用front,end两层buffer,front用来显示,end用来渲染

        \bullet  ……

    Direct3D和OpenGL

    CG是如何跨平台的:

    CG位于OpenGL和DX上层

    Material,Shader和Texture 的关系

    Material是渲染的结果,Shader是Material使用的渲染过程,Texture是shader的参数

    Forward Rendering 和Deferred Rendering

    鉴于传统的Forward Rendering对于多光源渲染时的低效问题,各种Deferred Rendering的方法被提出并且广泛使用。比如DeferredShading以及其之后的Deferred Lighting。Deferred方法相对于传统Forward Rendering最主要区别都是提高了对多光源渲染时的效率,它是是将光源的计算转到屏幕空间来进行,进而不浪费无效的光源着色。DeferredRendering的方法已经已经成为现在游戏引擎的主流。但是,DeferredShading与Deferred Lighting又是有所不同的:DeferredShading是一股脑儿将所有的Shading全部转到Deferred阶段进行,而Deferred Lighting则是有选择地只将Lighting转到deferred中进行,两种方法的不同也就导致了算法的不同的特点及各自的优劣。

    传统的Forward Rendering在外理多光源时基本上需要一个与光源数量及待绘制物体数量相关密切相关的复杂程度,这样就导致效率很低。而DeferredRendering就是将这种与光源相关的计算转到屏幕空间来进行,这样最大程度上减少无关的计算浪费。为了将传统的ForwardRendering转移到Deferred上进行操作需要对光照方程进行分析或改动,并生成相应所需的辅助Buffer来完成最终的着色操作。

    Render Target

    一个Renter Target即一个渲染出来的场景buffertexture, multiple render target是现在 GPU的一种特性,在可编程管线中同时渲染多张贴图,例如法线贴图,光照贴图,深度图等等,被广泛用于deferredshading,deferred lighting中,因为这些技术需要把深度,法线等等信息(在GPASS中计算)储存于GBUFFER中

    Reference:https://blog.csdn.net/bugrunner/article/details/7436600

    相关文章

      网友评论

          本文标题:可编程管线简介

          本文链接:https://www.haomeiwen.com/subject/wcbabqtx.html