【Unity Shaders】学习笔记之Shader简介(一)

来源:互联网 发布:php书籍推荐知乎 编辑:程序博客网 时间:2024/05/21 09:23

一、Shader简介

  Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出

  先看看着色器能干什么file:///C:/Program%20Files/Unity/Editor/Data/Documentation/en/Manual/index.html,搜索Surface Shader ExamplesUnity中已经内置了一些Shader可以直接使用,会随程序一起安装支持自定义shader,也可以在内置shader的基础上进行修改。


二、着色器

   2.1着色器类型

计算机图形学的渲染管线一般可以分为两种类型:

  • 固定功能渲染管线(fixed-functionrendering pipelines)
  • 可编程渲染管线(programmablerendering pipelines)

Unity支持三种类型的shader:

  • 固定功能着色器(Fixed Function Shaders),完全使用ShaderLab编写
  • 表面着色器(Surface Shaders),关键代码使用Cg/HLSL语言编写
  • 顶点片段着色器(Vertex And Fragment Shaders),它包括顶点程序(Vertex Programs)和片段程序(fragment Programs),使用Cg/HLSL来编写核心的实现代码

固定功能着色器便是我们所说的固定功能渲染管线(fixed-functionrendering pipelines)的具体表现,而表面着色器、顶点着色器以及片段着色器便属于可编程渲染管线,固定功能着色器可以说是Unity为Shader的书写自带的一层壳,Unity已经在内部为我们做了大量的工作,我们只要稍微记住一些关键字、一些规范就可以实现出很多不错的效果。
表面着色器这个概念更多的只是在Unity中听说,可以说是Unity自己发扬光大的一项使Shader的书写门槛降低和更易用的技术。
顶点着色器:产生纹理坐标,颜色,点大小,雾坐标,然后把它们传递给裁剪阶段。
片段着色器:进行纹理查找,决定什么时候执行纹理查找,是否进行纹理查找,及把什么作为纹理坐标。

   2.1着色器语言区分

固定功能着色器:没有嵌套CG语言,也就是代码段中没有CGPROGARAM和ENDCG关键字的
表面着色器:嵌套了CG语言,代码段中有surf函数的
顶点着色器&片段着色器:嵌套了CG语言,代码段中有#pragma vertex name和  #pragma fragment frag声明的


三、ShaderLab简介

  Unity中Shader编程的语言HLSL:高阶着色器语言(High Level Shader Language,简称HLSL),由微软拥有及开发的一种语言,HLSL 独立的工作在 Windows 平台上,只能供微软的Direct3D使用。 HLSL是微软抗衡GLSL的产品,同时不能与OpenGL标准兼容CG:即C for graphics,是微软Microsoft和英伟达NVIDIA相互协作在标准硬件光照语言的语法和语义上达成的一种一致性协议。Microsoft和NVIDIA联手推出CG语言,想在经济和技术上实现双赢,从而通过这种方式联手打击他们共同的对手GLSL。
官方网站:https://developer.nvidia.com/cg-toolkit
用HLSL写的代码可以直接当作Cg代码使用,CG语言又约等于HLSL语言。即,在Unity中写Shader就是用CG/HLSL写Shader,也就约等于给DirectX写Shader。

   3.1语法结构

Shader 着色器名称(使用/做菜单分隔符){Properties{属性}SubShader{Pass{…}}Fallback “Diffuse”}


   3.2属性

语法:_Name("Display Name", type) = defaultValue[{options}]
Properties块内的语法都是单行的
属性类型如下表格:



1.对于Range和Float类型的属性只能是单精度值 
2.对于Color和Vector类型的属性将包含4个由括号围住的数描述
3.对于纹理(2D, Rect, Cube) 缺省值既可以是一个空字符串也可以是某个内置的缺省纹理:"white", "black", "gray" or"bump"
4.随后在着色器中,属性值通过[name]来访问
5.{option}是可选的,对2D、Rect、Cube贴图有关,在写输入时最少要在贴图之后写一对空白{},当需要打开特定选项时可以把选项写在这对花括号内

0 0
原创粉丝点击