您的位置:首页 > 移动开发 > Unity3D

Unity_Shader开发_Shader和渲染管线(二)

2016-01-05 20:35 204 查看
一 、什么是Shader?

    Shader 着色器,一种较为短小的程序片段,用于告诉图形硬件如何计算和输出图像(可编程图形管线的算法片段),主要两类Vertex Shader 和 Fragment Shader

二 、什么是渲染管线?   

    渲染管线 ,也称渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。一个流水线是一序列可以并行和按照固定顺序进行的阶段。每个阶段都从它的前一阶段接受输入,然后把输出发给随后的阶段,就像一个在同一时间内,不同阶段不同的汽车一起制造的装配线,传统的图形硬件流水线以流水的方式处理大量的顶点,几何图元和片段。

结合图理解


OpenGL DirectX 是为应用程序对硬件进行访问和调用的中间层,

GPU前段模块到图元装备阶段,即可进行顶点着色器的编程。

光栅化指把计算机显卡中运算的数据,进行细分,用来适配计算机屏幕每一个像素的显示。但是光栅化不等于像素显示。像素显示最终反应的是颜色,光栅话后的到得结果是帧缓存。

片段程序最终的目标是为屏幕上的每一个像素计算他应该是什么颜色。



Geometry模型导入unity ,将Mesh 网格这些信息交给unitu,unity通过unity引擎调用图形API,其过程就是驱动GPU进行运算。进入GPU运算后先是进行顶点运算(也就是顶点Shader),其结果交给像素运算器(片段处理器),这里就可以为像素编写像素处理器的Shader。最终输出屏幕可显示像素信息,Frame Buffer 帧缓存,它所描述的是计算机一次显示使用的数据



unity中渲染通道线

  Transform 模型空间变换,针对顶点的空间顶点变换。

  TexGen 纹理坐标的生成,在顶点中取得纹理坐标,将纹理坐标转换为UV取值的范围

  Lighting 光照

以上是早期的TL 变换光照流水线,现在图形硬件有了可编程能力后,就由Vertex Shader所取代,用户可影响TL的运算。

经过TL 和 顶点Shader后 Culling 裁剪,减少GPU处理数据量,把看不见的面剔除。不处理这些面所涉及的顶点数据。

Depth Test 深度测试,摄像机的最近可看到的地方,摄像机的近切面,最远可看到的距离。超过最近最远的地方会被踢除。

(光栅化处理阶段,他所描述的是如何在屏幕上显示每一个像素的颜色,进行采样,从纹理中找到屏幕一个对应的点该在这张纹理图中取它的哪个值)

Texturing 纹理采样 ,fog 雾化处理 是否需要进行雾化处理。 这个阶段就是shader的片段编程 

  Alpha Test 绘制半透明 全透明的物体

  Blending 汇合最终的图像

以上三幅图阐述了渲染管线的流程,

总结:可编程范围两个方面 TL 顶点 shader,采样计算颜色雾化等的 片段shader。在unity中优化减少drawcall的调用,指的是unity中调用GPU进行渲染的调度过程(CPU收集数据顶点信息,纹理等,传入GPU,这个过程费时耗能的,反复的启动调用在、会造成游戏的瓶颈,因此要减少drawcall,减少CPU对GPU的调度)

三 、Shader 和 材质、贴图的关系? 

      Shader 是一小段程序,也可以看作是一段算法,它负责将输入的顶点数据以指定的方式和输入的贴图或者颜色等组合起来(也就是顶点shader 和 片段shader阶段的对顶点光照像素的影响),然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的shader,以及对shader的特定参数设置,将这些内容(shader 以及输入参数,包括贴图,颜色,向量,矩阵等)打包存储在一起,得到的就是一个 Material 材质。之后我们便可以将材质赋予三维物体进行渲染了。

    材质就好比引擎最终使用的商品,shader好比是生产者中商品的加工方法,而贴图就是原材料。如果不使用unity引擎或别的引擎,直接使用DirectX, 那么要手动组织shader程序和给这个程序传入参数,以及把数据集成以方便复用。Unity以材质的形式解决了这些问题。

总结 Shader是图形可编程方案的程序片段

渲染管线是一种计算机从数据到最终图形成像的形象描述

材质是商品,Shader是方法,贴图是材料
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: