利用unity和steamVR完成场景漫游(六)unity中的shader

Shader

1: Shader是给GPU执行的程序,中文叫做着色器;
2: 着色器是运行在图形处理单元上,可以让开发人员直接操作图形硬件渲染功能;
3: shader能开发出很多好的效果,UV动画,水, 雾 等一些特效, 这些用程序开发出来(cpu)比较困难,性能还不好;
4: 渲染流水线, 模型投影, 定点着色;
5: shader一般主要有: 固定管线着色器, 顶点片元着色器, 表面着色器;
固定管线着色器(慢慢会被淘汰);
顶点shader: 干预模型形态的shader; 
像素shader: 干预像素着色的shader;
6: 模型定点运算的时候,可以加入顶点shader来干预顶点的位置;
顶点着色的时候,加入像素shader来干预像素的上色;

 

UV动画:在模型上面再贴一张图,不断地改变这个新贴图的纹理坐标,就产生不断滚动的效果,就像cocos案例里面乌龟在水里游,身体被波光覆盖的那个动画效果。

渲染流水线:一个3D模型拿到GPU里面渲染,有一个工作流水线,正是因为有了这些流水线,GPU才公开一些接口出来,方便程序员在流水线通道里面插入自己的代码。也就是说支持用户自己写代码插入流水线通道里面,来实现用户需要的特殊效果。

顶点shader:模型顶点进来了以后,我们可以通过shader把顶点变换成另外一种形状,比如我们有一个网格,是直来直去的那种,我们可以让shader干预一下这个网格上的顶点,让它变得弯弯的像波浪那种的样子,再贴上纹理。     

      正弦波

像素shader:当我们成像上去后,要对点进行上色,哪个点要贴哪个纹理,所以需要对它们进行上色,上色的时候也可以用shader进行处理,比如刚才的乌龟的UV动画,把另外一个纹理和原来纹理结合。

      岩浆,本来做好了纹理的,但是是静态的,我们可以通过动态地改变纹理坐标,让岩浆流动起来,实际上是改变了每个顶点着色的纹理坐标

 

 

扫描二维码关注公众号,回复: 163990 查看本文章

Direct3D和opengl

1: 什么是Direct3D和opengl;
2: 目前面向GPU的编程语言主要有三种:
HLSL 语言 通过Direct3D编写的着色器程序,只能在Direct3D里面使用;
Cg 语言 NVIDIA和微软合作提供的语言,与C相似,Direct3D和opengl都支持;
GLSL语言 支持OpenGL上编写Shader程序;
3: Unity使用ShaderLab来进行着色程序的编写,对不同的平台进行编译,重点支持Cg语言;

 

显卡要支持Direct3D什么什么的......

Direct3D和opengl:PC发展史,PC实际上是继承在操作系统上面的,PC上面有各种各样的硬件在发展,如显卡,显卡就提出越来越多的把很多的图形单元放在GPU上面运算,可是我的显卡虽然支持这种计算,但是怎样告诉程序,所以要把显卡的功能做出一组API出来,公布给程序使用。

 

现在有两个端口,一个是操作系统是OS:Windows,Linux,一个是显卡产商Nvidia,AMD,两个显卡产商,它们之间要怎么统一标准,所以微软提出来一个叫DirectX的标准,图形的标准,里面定义很多硬件加速的接口,显卡产商就负责在显卡驱动里面来实现支持这些接口,所以当DirectX装好了以后,我们的代码使用DirectX的API,由于显卡的驱动接好了底层的API的实现,所以API就能够使用显卡加速,来获得很好的图形性能,这就是为什么显卡总要装一个驱动,因为它装好驱动以后要把图形图像的接口统一起来接好,这样通过DirectX就能访问得到显卡的硬件加速。

 

微软DirectX不开源的,而Linux的OpenGL是开源的,安卓,Linux,IOS,都支持OpenGL,而不支持DirectX,微软也支持OpenGL,大家在Windows上面习惯使用DirectX,在Linux上面习惯使用OpenGL

而Unity是跨平台的游戏引擎,所以在Windows上使用DirectX,,在Linux上使用OpenGL。

 

有了这两个标准以后,显卡产商就通过驱动的形式,把标准接入到标准库里面去,这样应用程序只要调用API就能够使用显卡加速,如果有的话。

同时DirectX和OpenGL也支持用户直接塞程序,比如塞shader给显卡执行,所以GPU显卡也有编程语言,有三种HLSL,Cg,GLSL语言

由于Unity是跨平台的游戏引擎,所以它重点支持cg语言,但是它又不直接使用cg语言,而是自己搞一个shaderLab语言来做着色程序的编写,这样我们就可以使用Unity的shaderLab的语法来生成各种各样平台不同的着色程序。

我们所说的shader就是使用Unity的shaderLab来编写的着色程序。


Shader和Material

如果是进行3D游戏开发的话,想必您对着两个词不会陌生。Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。

所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。

Shader大体上可以分为两类,简单来说

  • 表面着色器(Surface Shader) - 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果。类比卡片机,上手以后不太需要很多努力就能拍出不错的效果。
  • 片段着色器(Fragment Shader) - 可以做的事情更多,但是也比较难写。使用片段着色器的主要目的是可以在比较低的层级上进行更复杂(或者针对目标设备更高效)的开发。

因为是入门文章,所以之后的介绍将主要集中在表面着色器上。

Shader程序的基本结构

因为着色器代码可以说专用性非常强,因此人为地规定了它的基本结构。一个普通的着色器的结构应该是这样的:一段Shader程序的结构

首先是一些属性定义,用来指定这段代码将有哪些输入。接下来是一个或者多个的子着色器,在实际运行中,哪一个子着色器被使用是由运行的平台所决定的。子着色器是代码的主体,每一个子着色器中包含一个或者多个的Pass。在计算着色时,平台先选择最优先可以使用的着色器,然后依次运行其中的Pass,然后得到输出的结果。最后指定一个回滚,用来处理所有Subshader都不能运行的情况(比如目标设备实在太老,所有Subshader中都有其不支持的特性)。


来源自:https://www.cnblogs.com/HangZhe/p/7220969.html

              https://onevcat.com/2013/07/shader-tutorial-1/   


猜你喜欢

转载自blog.csdn.net/carotadream/article/details/80160313