美文网首页
2018-12-03Shader基础篇

2018-12-03Shader基础篇

作者: Nmao | 来源:发表于2018-12-03 15:32 被阅读0次

    1.什么是Shader?

    2.GPU和Cg语言?

    3.Unity中使用Cg语言如何编写Shader?

    一、什么是Shader?

    1.1 shader的概念:Shader极为着色器,是一款  运行在GPU上的程序, 用以对  三维物体进行着色处理,光和影的计算,纹理颜色的呈现等。  从而将游戏引擎中的一个个作为抽象的几何数据存在模型、场景和特效,以和真实世界类似的光和影的形式呈现与人们眼中。

    1.2 Shader和Material的关系:Shader负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合起来输出,绘图单元可以依据这个输出来将图像绘制到屏幕上。 输入的贴图或者颜色,加上对应的Shader以及Shader的特定的参数设置,将这些打包存储在一起就得到了一个Material。              姑且:可以这么认为Shader就相当于高级语言里面的一个类,当我们需要对某一具体物体使用此Shader时,我们就需要先    实例化Shader ,      从而得到一个它的对象,其实Material就相当于Shader的一个对象。 这样我们就能理解在Unity中同样的材质球在被修改后,其他物体挂载了材质球也会被修改。  而如果是使用相同Shader新建的别名材质球,就不会受影响。

    二、GPU和Cg语言

    2.1 GPU图形绘制管线分为三个主要阶段:

    2.1.1 应用程序阶段:使用高级编程语言(C\C++\Java)进行开发,主要和CPU进行打交道,诸如:碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等经典算法在此阶段执行

    2.1.2 几何阶段: 主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU进行运算,在该阶段之后得到了经过变化和投影之后的顶点坐标、颜色以及纹理坐标————<<实时计算机图像学>>.

    2.1.3 光栅化阶段: 基于几何阶段的输出数据,为像素正确配色,以便绘制完整的图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器(Color buffer或者 Frame buffer)中,光栅化得到的屏幕坐标值通常都是浮点型的而 像素都是整数表示, 通常最后绘制到屏幕上的都是这两个整数点之间进行插值得到线段上某些点上。   (光栅化:将几何图元变为二维图像的过程)

    2.2 GPU 上的两个组件:  Vertex Program 和 Fragment Program

    2.2.1 VertexProgram:从GPU中提取图元信息(顶点位置、法向量、纹理坐标等)完成顶点坐标空间转换,法线向量空间转换光照计算等操作。

    2.2.2 Fragment Program:将VertexProgram的输出作为输入对每个片段的颜色进行计算,最后将处理后的数据送到光栅操作 模块进行光栅化。           什么是片段。 它和像素有什么不一样:片段其实就是所有的三维顶点在光栅化之后得到的数据集合,这些数据没有经过深度值的比较,而在屏幕上显示的像素都是经过深度值比较的。        (Fragment Program 还有一个突出的特点就是拥有检索纹理的能力,纹理就是数组)

    2.3 坐标空间

    屏幕是二维的,GPU所需要的就是将三维的数据绘制到二维的屏幕上,这样就有坐标空间的转换。根据顶点坐标变换的先后顺序,主要有如下几个坐标空间

    2.3.1 Object Space:模型坐标空间:这个过程才有真正意义的投影,投影主要有两种方法:正投影(也叫平行投影)和透视投影。而裁剪是一个比较大的概念,为了减少需要绘制的顶点个数,而识别指定区域内或外的图形部分的算法都称之为裁剪,裁剪算法包括:视域剔除、背面剔除、遮挡剔除和视口裁剪。

    2.3.2 World Space:世界坐标空间,顶点法向量的计算再次过程

    2.3.3 Eye Space:观察坐标空间,在Unity中即为虚拟摄像机坐标空间,以虚拟摄像机为原点,有视线方向,视角和远近平面共同组成一个梯形的三维空间

    2.3.4 Clip and Project Space:屏幕坐标空间

    *并非是先裁剪在投影,因为在不规则的物体中进行裁剪并非容易的事情,裁剪被单独安排在一个单位立方体中进行,这个立方体被称为CVV,CVV的近平面的X,Y坐标对应屏幕像素坐标,Z坐标则代表画面像素深度。视点坐标到屏幕坐标由三部分组成:用透视变换矩阵把顶点从视锥中变换到裁剪空间的CVV中,在CVV进行图元裁剪、屏幕映射。

    2.3 Cg语言

    2.3.1 Cg支持7中数据类型: 

    1.Float,32位浮点数据    2.Half,16位浮点数据  3.Int,32位整形数据  4.Fixed,12位定点数  5.Bool,布尔数据   6.Sampler:纹理对象,sampler、samlper1D、2D、3D、samplerCUBE\RECT  7.String,字符串

    2.3.2 内置的向量类型是基于上述数据类型

    1、float4为float类型的4元向量,bool3为bool类型的三元向量,向量最长不能超过4元向量

    2、Cg中向量、矩阵与数据是完全不同的、向量和矩阵是内置的数据类型,而数据是一种数据结构,在其他高级语言中数组,向量和矩阵都是一种数据结构

    2.3.3 Cg语言的其他一些特性

      1、数组形参:Cg中不存在指针机制,数组作为函数形参传递的是数组的完全拷贝       注意:形参数组不必指定长度,如果指定了长度在调用函数是实参数组的长度和形参数组的长度必须一致,最好不要指定长度。

    2、CG函数重载方式 和C++基本一致

    3、由于着色程序分为定点程序和片段程序,两者对用的图像流水线上的不同阶段,所以两个程序各有且只有一个入口函数,当程序今夕编译时必须要指定入口函数,除非入口函数为Main。

    4、如何确定定点和片段程序的入口函数?顶点程序:接收应用程序传递的顶点数据(通常位于模型坐标空间)进行坐标空间转换和光照处理,输出投影坐标和计算得到的光照颜色   片段程序:接收从顶点程序输出的数据并进行像素颜色计算。

     5、所以通常通过观察程序的输入输出语义绑定就可以区分函数对应的是定点程序还是片段程序

    相关文章

      网友评论

          本文标题:2018-12-03Shader基础篇

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