ShaderLab开发实战——Shader基本概念

书中第一章介绍了Shader的基本概念以及实现语言,内容很少,能够用一下几点归纳第一章内容,html

1,Shader是运行在GPU上对三维物体,进行着色处理、光影计算以及纹理颜色的呈现。程序员

2,Shader的编程方式经历了从最初的固定管线到可编程管线的发展。在可编程管线中Shader分为顶点Shader和片断Shader。顶点Shader具备处理变换网格物体顶点的功能,网格通过硬件的格栅化后,片断Shader会对每个片断(预备像素),进行各类测试,最终渲染成可见像素。编程

3,目前Shader实现语言包括3种,微软提供的HLSL(High Level Shading Language),OpenGL提供的GLSL(OpenGL Shading Language)以及NIVIDIA提供的Cg(C for graphics)。在Unity中对Shader的编程语言支持的重点是Cg。后端

以上就是第一章中的所有内容,这里还有几个重要的知识点值得思考和拓展:网络

  1. Shader为何针对是三维物体?
  2. DirectX和OpenGL
  3. OpenGL渲染流程?
  4. 固定管线和可编程管线的区别?
  5. Cg语言的参考学习?

下面将对上诉四个问题进行逐一的分析解答,答案来结合网上搜集的资料以及自身的理解。编程语言

1.Shader为何针对是三维物体?学习

    在书中对Shader的定义中特地提到Shader是对三维物体完成着色、光影以及纹理颜色的呈现。其实这个问题有两点能够很好的解释,测试

    首先说是三维物体不如说成是三维空间中的物体,这个物体能够是一个2D平面也能够是一个3D物体,在Unity3D中不管3D、2D物体以及UI等都是经过Shader来进行处理渲染和显示效果的。这里不是说2D的平面或者UI就不能使用Shader,而是全部在三维空间中的物体都是经过Shader来完成渲染的显示的。3d

    其次,Shader主要完成的工做是对物体进行着色、光影以及纹理的呈现,这里要拿二维空间和三维空间进行对比,在二维空间中,物体能够简单的理解为一个平面一张纸,和三维空间相比,二维明显少了光和影的变换,而光和影的处理是shader中最为关键的一点。光和影的呈现是须要光源和物体的朝向,在二维空间中,物体和光源永远都是平行的,看不到纹理以及颜色的变化,甚至连物体都看不到,更别谈Shader对物体的处理了。htm

    因此Shader主要是运行在GPU中对三维物体进行处理的。

2.DirectX和OpenGL?

     OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库,OpenGL是个与.硬件无关的软件接口,能够在不一样的平台如Windows 9五、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。所以,支持OpenGL的软件具备很好的移植性,能够得到很是普遍的应用。在专业高端绘图领域,OpenGL是不能被取代的。

    OpenGL仍然是惟一可以取代微软对3D图形技术的彻底控制的API。游戏开发人员是一个有着独立思想的群体,不少重要的开发人员目前仍然在使用Open GL。所以,硬件开发商正在设法增强对它的支持。Direct3D目前还不能支持高端的图形设备和专业应用; Open GL在这些领域占据着统治地位。

    DirectX是一种应用程序接口(API),按照性质分类,能够分为四大部分,显示部分、声音部分、输入部分和网络部分。

    其中,DirectDraw(DDraw)和Direct3D(D3D),前者主要负责2D图像加速。它包括不少方面:咱们播放mpg、DVD电影、看图、玩小游戏等等都是用的DDraw,你能够把它理解成全部划线的部分都是用的DDraw。后者则主要负责3D效果的显示,好比 CS中的场景和人物、FIFA中的人物等等,都是使用了DirectX的Direct3D。

    表面上好像D3D比OpenGL支持更多的功能,其实因为D3D不支持硬件扩展,如硬件全景阴影,硬件渲染顺序无关半透明材质等新技术根本没法使用,而D3D(特指D3D8)自己提供的功能只有一小部分能在使用HAL且硬件不支持时模拟,你要用大量代码分析硬件能力和采起不一样策略。

3.OpenGL渲染流程

    在详细介绍OpenGL渲染流程以前,建议先查询下GPU相关知识,对OpenGL工做流程的理解会有较大的帮助。   

    这里列举下GPU图形处理过程当中几个关键的阶段:

    Tessellation过程

    Tessellation过程其实说白了就是GPU肯定几何模型构造的过程,还需根据改变几何模型构造,例如更改顶点位置、添加新的顶点以及细分曲面的功能,细分曲面能够这样理解,在一个三角形中添加一个顶点并与原三角形顶点相连,这样就会增长三个三角形,适当调整中间顶点的位置,就使得以前的曲面形状更加平滑。下图体现了Tessellation确认几何模型构造的过程。

    GPU大百科全书第一集 图形与装修的关系

    TMU单元

    在GPU中,TMU单元负责材质库以及显存中的纹理进行定址和抓取,程序员会预先烘焙好一些材质,这些材质拥有基本的色彩及形貌特征,TMU单元会根据几何表面的须要从材质库中定位并抓取合适的材质,以便构成物体表面的基本外貌,方便后续的Shader单元对颜色进行正确的计算,同时减轻整个渲染过程的压力。

    基本材质操做:

GPU大百科全书第一集 图形与装修的关系

    材质抓取过程

    GPU大百科全书第一集 图形与装修的关系

    US单元

    GPU的US单元会根据程序的须要对每个像素的RGB值进行计算,不论光影仍是色泽,最终均可以经过这些数值表达的颜色来正确的进行反映。US单元中的ALU在完成对RGB值的计算以后会把它传输给ROP单元与纹理进行混合。

    ALU:

                    GPU大百科全书第一集 图形与装修的关系

    延迟渲染(Deferred shading)

    GPU渲染过程当中会根据图形的须要,将光照之类的操做从传统的Pixel Shader前段直接转移到整个流水线后端的MRT(多目标渲染)里。这种延迟改变了shader操做的顺序,将其延续到了紧贴混合以前

    Deferred shading过程

    GPU大百科全书第一集 图形与装修的关系

    ROP单元

    GPU图像处理的最后一步,所有像素填充进纹理,并使得纹理最终得到正确的表现效果。具体步骤上ROP会将ALU中计算的RGB值与TMU单元抓取的纹理进行混合并进行输出。

    shader及texture混合过程:

    GPU大百科全书第一集 图形与装修的关系

    这里就不继续介绍GPU的图形处理,感兴趣的能够到上面连接中自行查看。

    回归主题接着介绍OpenGL中的渲染管线。

    管线这个术语描述了opengl渲染的整个过程。openGL采用cs模型:c是cpu,s是GPU,c给s的输入是vertex信息和Texture信息,s的输出是显示器上显示的图像。

    下面两张图比较清楚的讲述了OpenGL中的渲染管线:

    

    Vertex Processing为OpenGL的顶点处理阶段,由顶点处理管线负责,主要完成了将三维物体顶点转换到屏幕空间坐标的过程。主要分为顶点数据处理、模型视图变换、投影变换、裁剪处理、透视除法处理、试点处理最终输出成屏幕坐标。

    2015-2-4 16-46-38

    Rasterization光栅化处理。在OpenGL的顶点处理阶段完成后,以图元为基本单位,生成图元的位置坐标以及属性,以后光栅化会利用图元顶点经过差值的方式计算图元覆盖全部像素的属性。这个过程就被成为OpenGL的光栅化过程。这一过程分为两步,第一决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二分配一个颜色值和一个深度值到各个区域。

    Fragment Processing片断处理。光栅化处理将图元映射到屏幕的像素后,会生成片断处理所须要的片断(fragment),片断处理会对片断进行裁剪并结合光照、阴影以及光的颜色等计算像素最终的颜色值。以后还会深度测试以及混合测试阶段判断像素是否须要丢弃等。最终显示在屏幕上。    

    最后附上一个连接,详细介绍了OpenGL原理。

4.固定管线和可编程管线的区别

    OpenGL渲染管线经历了从固定管线到可编程管线的发展。

    固定管线和可编程管线最大的区别在因而否有Shader来参与OpenGL的绘制。

    可编程管线中利用了顶点Shader以及片断Shader完成了OpenGL的渲染过程。其中顶点Shader从cpu中读取顶点信息,包括顶点位置、颜色以及纹理坐标等。以后输出的顶点组合,进入图元装配阶段(Primitive Assembly),将顶点转化一个个图元(三角形、直线、点精灵等元素),通过光栅化的操做,生成能够在屏幕上可绘制的二维像素片断,以后经过片断Shader结合光照等处理计算像素最终的颜色值,通过逐片断处理后,把生成的片断放入到framebuffer中,最终产生屏幕上的像素。

    在固定管线中没有使用Shader来完成OpenGL的绘制,具体的流程能够参考下图,这里就不着重说明了。

    

5.Cg语言的参考学习

    对于Cg语言的介绍会在下一篇文章中学习介绍。

相关文章
相关标签/搜索