Shader的含义
Shader(着色器)应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务时使用的指令,用于计算图像的颜色或明暗。但近来,它也能用于处理一些特殊效果,或者视频后处理。通俗地说,着色器告诉电脑如何用特有的一种方法去绘制物体。
程序员将着色器应用于图形处理器(GPU)的可编程流水线,来实现三维应用程序。这样的图形处理器有别于传统的固定流水线处理器,为GPU编程带来更高的灵活性和适应性。以前固有的流水线只能进行一些几何变换和像素灰度计算。现在可编程流水线还能处理所有像素、顶点、纹理的位置、色调、饱和度、明度、对比度并实时地绘制图像。着色器还能产生如模糊、高光、有体积光源、失焦、卡通渲染、色调分离、畸变、凹凸贴图、边缘检测、运动检测等效果。
。
简单描述
着色器是描述顶点或像素特征的简单程序。顶点着色器描述顶点的属性(位置、纹理坐标、颜色等),而像素着色器描述像素的特征(颜色、z深度和alpha值)。
着色器的基本图形管线
基本图形管线如下所示:
• 中央处理器(CPU)发送指令(已编译的着色器程序)和几何数据到位于显卡内的图形处理器(GPU)。
• 顶点着色器执行几何变换。
• 若几何着色器位于图形处理器内并已激活,它便会修改一些场景中的几何结构。
• 若细分着色器位于图形处理器内并已激活,场景中的几何结构会被细分。
• 计算后的几何结构被三角化(分割为三角形)。
• 三角形被分解为2 × 2的像素块。
• 像素块通过片段着色器被修改。
• 进行深度测试;通过的片段将被写入屏幕,并可能被混合到帧缓冲区中。
顶点变换 → 图元装配和光栅化 → 片元纹理映射和着色 → 写入帧缓存
Shader的种类
shader按管线分类一般分为固定渲染管线与可编程渲染管线。固定渲染管线就是功能固定的管线,比如物体表面光的折射,反射的算法是固定无法修改的,我们只能对这些功能进行配置,比如开启或关闭反射效果,雾化效果等。因为这种管线功能固定,无法在程序上对物体细节的表现给予更多更自由的控制,无法达到更多我们想要的画面效果。所以现在的显卡都是可编程渲染管线,也就是曾经那些我们固定无法修改的部门现在可以编程去修改,自由度高了之后,我们也就能实现更多自己想要的特效了
二维着色器
二维着色器处理的是数字图像,也叫纹理,着色器可以修改它们的像素。二维着色器也可以参与三维图形的渲染。目前只有“像素着色器”一种二维着色器。
像素着色器
主条目:像素着色引擎
像素着色器(英语:pixel shader)也叫片段着色器(英语:fragment shader),用于计算“片段”的颜色和其它属性,此处的“片段”通常是指单独的像素。最简单的像素着色器只有输出颜色值;复杂的像素着色器可以有多个输入输出[4]。像素着色器既可以永远输出同一个颜色,也可以考虑光照、做凹凸贴图、生成阴影和高光,还可以实现半透明等效果。像素着色器还可以修改片段的深度,也可以为多个渲染目标输出多个颜色。
三维图形学中,单独一个像素着色器并不能实现非常复杂的效果,因为它只能处理单独的像素,没有场景中其它几何体的信息。不过,像素着色器有屏幕坐标信息,如果将屏幕上的内容作为纹理传入,它就可以对当前像素附近的像素进行采样。利用这种方法,可以实现大量二维后期特效,例如模糊和边缘检测。
像素着色器还可以处理管线中间过程中的任何二维图像,包括精灵和纹理。因此,如果需要在栅格化后进行后期处理,像素着色器是唯一选择。
三维着色器
三维着色器处理的是三维模型或者其它几何体,可以访问用来绘制模型的颜色和纹理。顶点着色器是最早的三维着色器;几何着色器可以在着色器中生成新的顶点;细分曲面着色器(英语:tessellation shader)则可以向一组顶点中添加细节。
顶点着色器
顶点着色器是最常见的一种 3D 着色器,对每个交给图形处理器的顶点都运行一次。目的是将每个顶点在虚拟空间中的 3D 坐标变换到在屏幕上显示的 2D 坐标(深度缓冲(Z-Buffer)的深度值也是如此)。顶点着色器可以掌控顶点的位置、颜色和纹理坐标等属性,但无法生成新的顶点。顶点着色器的输出传递到流水线的下一步。如果有之后定义了几何着色器,则几何着色器会处理顶点着色器的输出数据,否则,光栅化器继续流水线任务。
几何着色器
几何着色器在 OpenGL 3.2 和 Direct3D 10 中被引入, 以前可在带扩展的 OpenGL 2.0+ 中使用。改类型的着色器可以生成新的图形基元,比如点,线和三角形。几何着色器可以从多边形网格中增删顶点。它能够执行对 CPU 来说过于繁重的生成几何结构和增加模型细节的工作。Direct3D 10 增加了支持几何着色器的API,成为 Shader Model 4.0 的组成部分。OpenGL 只可通过它的一个插件来使用几何着色器,但极有可能在3.1版本中该功能将会归并。几何着色器的输出连接光栅化器的输入。
曲面细分着色器
曲面细分着色器作为一类新的着色器,在 OpenGL 4.0 和 Direct3D 11 中被引入,并在着色器的模型增加了两个阶段:曲面细分控制着色器(或外壳着色器)和曲面细分评估着色器(或域着色器)。这允许了较简单的网格借由特定函数计算,实时被细分成更细腻的网格。这个函示可以与多种变量相关,包含与视点的距离,因此可以主动调整细节层次,使较接近相机的物体有着较多细节。借由在着色器单元中才加上细节,这还可以大幅降低网格所需的带宽,也不需要降采样存储器中的网格。有些计算方式可以上采样任意的网格,有些则允许“提示”网格所要凸显的顶点和边缘。
图元和网格着色器
大约 2017 年, 图元着色器做为新的着色器阶段被 AMD Vega 微体系结构所支持。类似可以访问必要数据的计算着色器来处理几何体。
光线追踪着色器
光线追踪着色器被微软的 DirectX 光线追踪,Khronos Group 的 Vulkan,GLSL 和 SPIR-V,苹果的 Metal 所支持。
计算着色器
计算着色器并不仅限于图形应用程序,还有使用相同的通用图形处理单元执行资源的程序。它们可能在图形管线中被使用,比如额外的动画阶段或光照算法。 一些渲染 API 允许计算着色器轻松的与图形管线共享数据资源。
Unity中shader的类型
①Fixed function shader :属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的回滚。使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似。
②Vertex and Fragment Shader:最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。
③Surface Shader:Unity3d推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。使用的也是CG/HLSL语法
在Unity的项目面板中直接创建一个Stander surface shader,默认生成的代码如下
解释:
Properties {}
Properties{}是定义着色器属性的,在这里定义的属性将被作为输入提供给所有的子着色器。属性定义的格式如下
_Name(“Display Name”, type) = defaultValue[{options}]
_Name代表的是属性名,如Color,MainTex,Glossiness ,Metallic 等
”Display Name”则是在Inspector中显示的名字
type代表属性:
Color - 一种颜色,由RGBA(红绿蓝和透明度)四个量来定义;
2D - 一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来;
Rect - 一个非2阶数大小的贴图;
Cube - 即Cube map texture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样;
Range(min, max) - 一个介于最小值和最大值之间的浮点数,一般用来当作调整Shader某些特性的参数(比如透明度渲染的截止值可以是从0至1的值等);
Float - 任意一个浮点数;
Vector - 一个四维数;
这是shader的基本概念。框架信息解释。有一些来自于维基百科以及一些专业解释。添加链接描述