什么是Shader

着色器(英语:shader)应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务时使用的指令,用于计算图像的颜色或明暗。但近来,它也能用于处理一些特殊效果,或者视频后处理。通俗地说,着色器告诉电脑如何用特有的一种方法去绘制物体。

程序员将着色器应用于图形处理器(GPU)的可编程流水线,来实现三维应用程序。这样的图形处理器有别于传统的固定流水线处理器,为GPU编程带来更高的灵活性和适应性。以前固有的流水线只能进行一些几何变换和像素灰度计算。现在可编程流水线还能处理所有像素、顶点、纹理的位置、色调、饱和度、明度、对比度并实时地绘制图像。着色器还能产生如模糊高光有体积光源、失焦、卡通渲染色调分离畸变凹凸贴图边缘检测运动检测等效果。

着色器的种类

Direct3D和OpenGL都使用了以下三种着色器:

  • 顶点着色器 处理每个顶点,将顶点的空间位置投影在屏幕上,即计算顶点的二维坐标。同时,它也负责顶点的 深度缓冲 (Z-Buffer)的计算。顶点着色器可以掌控顶点的位置、颜色和 纹理坐标 等属性,但无法生成新的顶点。顶点着色器的输出传递到流水线的下一步。如果有之后定义了 几何着色器 ,则几何着色器会处理顶点着色器的输出数据,否则, 光栅化器 继续流水线任务。

  • 几何着色器 可以从 多边形网格 中增删顶点。它能够执行对CPU来说过于繁重的生成几何结构和增加模型细节的工作。Direct3D版本10增加了支持几何着色器的API, 成为Shader Model 4.0的组成部分。OpenGL只可通过它的一个插件来使用几何着色器,但极有可能在3.1版本中该功能将会归并。几何着色器的输出连接光栅化器的输入。

  • 像素着色器 (Direct3D),常常又称为 片断着色器 (OpenGL),处理来自光栅化器的数据。光栅化器已经将多边形填满并通过流水线传送至像素着色器,后者逐像素计算颜色。像素着色器常用来处理场景光照和与之相关的效果,如 凸凹纹理映射调色 。名称片断着色器似乎更为准确,因为对于着色器的调用和屏幕上像素的显示并非一一对应。举个例子,对于一个像素,片断着色器可能会被调用若干次来决定它最终的颜色,那些被 遮挡 的物体也会被计算,直到最后的 深度缓冲 才将各物体前后排序。

统一着色器模型将上述三种着色器统一起来,发布于OpenGL和Direct3D 10里面。

由于这些类型的着色器终究会用在GPU的流水线中,下面简述它们是如何被安排在流水线中的。



Unity Shader的类型(它并不是真正的Shader)

  • Sureface Shaders (表面着色器)
  • Vertex/Fragment Shaders (顶点/片元着色器)
  • Fixed Function Shaders (固定函数着色器)

参考:A gentle introduction to shaders in Unity3D



参考资料:


推荐阅读:


推荐书籍:


PDF

[PDF] Real-Time Rendering.3rd.pdf

[PDF] Shaders for Game Programmers and Artists



results matching ""

    No results matching ""