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


声明:本文转载自https://my.oschina.net/u/3227483/blog/1807862,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

书中第一章介绍了Shader的基本概念以及实现语言,内容不多,可以用一下几点概括第一章内容,

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来完成渲染的显示的。

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

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

2.DirectX和OpenGL?

     OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库,OpenGL是个与.硬件无关的软件接口,可以在不同的平台如Windows 95、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语言的介绍会在下一篇文章中学习介绍。

    

    

本文发表于2018年05月07日 01:23
(c)注:本文转载自https://my.oschina.net/u/3227483/blog/1807862,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2088 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1