版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/java3182/article/details/80357756
前言
Shader的介绍有很多,在这里,将从以下几个方面来介绍:
- 什么是Shader
- Shader的主要作用
- Shader的种类
- Shader的结构
什么是Shader
Shader的意思是着色器,是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行,语法类似C语言,有自己的编译器。编译,链接后,由CPU送入GPU中执行。Shader的执行入口也是从main()函数开始执行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出
Shader的主要作用
Shader的主要作用就是能让开发人员更好的发挥出自己的创作能力去实现想要的效果。每一步的渲染管道都可以自定义。
Shader的种类
以OpenGL来说:目前已经支持5种不同类型的shader
- Vertex Shader,顶点Shader,简称VS
- TESS Control Shader(D3D11 叫Full shader),简称TCS
- TESS Evaluation Shader(D3D叫Domain shader),简称TES
- Geometry Shader,简称GS
- Fragment Shader(D3D叫Pixel Shader),简称PS
根据输入,输出和功能做一下简单的对比如下:
名称 | 输入 | 输出 | 功能 |
---|---|---|---|
Vertex Shader | 顶点坐标 | 经过几何变换的坐标 | 把输入 的顶点坐标乘以变换矩阵,VS只知道处理顶点,但不知道顶点是做什么用的,不知道会被装配成什么图元,当然VS也可以接收颜色,纹理坐标,雾坐标,法线,切线等属性,计算光照或变换贴图 |
TESS Control Shader | Patch,一个Patch可以看作多个顶点的集合。 | Patch | 根据需求把Patch自己的属性及内部的顶点属性做修改。最重要的是设置图元接下来细分的度(TCS不做分割动作),输出Patch. |
TESS Evaluation Shader | 三角形被分割后产生的新顶点(三角形或其他类型的图元) | 也是一系列顶点 | 在TCS和TES之间有个过程叫Tessellation Primitive Generator(简称TGP),它首先会查看TES的输入是什么,比如是三角形,那么TGP就会把TCS传入的Patch内部的顶点看成是若干个三角形。然后TGP每次从当前Patch里面取出三个顶点做一个三角形分割,直到Patch里面的顶点全部被取出,TES并不知道这些顶点组成什么图元,只要求TGP把patch内部的顶点当成什么图元去分割。TES和VS一样,输入是顶点,输出也是顶点。 |
Geometry Shader | 一个图元 | 一个或者多个图元 | 无论是否有VS,TCS或TES,在GS前面都会有一个图元装配的过程,即传给GS的是图元而不是顶点,根据新图元,生成一个或多个新图元,如输入三角形,输出一个三角带。 |
Fragment Shader | 输入是顶点 | 输出颜色 | 主要是处理光栅化后的片段,每片段执行一次,各种效果一般是在FS中进行。 |
Shader的结构
以OpenGL的GLSL为例:一个典型的着色器有如下结构组成:
#version version_number //着色器版本号
in type in_variable_name;//输入变量名
out type out_variable_name;//输出变量名
uniform type uniform_name;//从CPU中的应用向GPU中的着色器发送数据的方式,uniform是全局的(Global)
int main()
{
// 处理输入并进行一些图形操作
...
// 输出处理过的结果到输出变量
out_variable_name = weird_stuff_we_processed;
}
总结
本次主要大概说了一下Shader是什么,Shader的主要功能,代码结构,之后进入到Unity的ShaderLab学习