Unity Shader编程 基础总结

发表于2018-01-06
评论0 6.6k浏览

Shader编程一直是一个比较难入门难上手的主题,本篇文章主要是对Unity Shader编程的一些基础和要点做了总结。包括Shader编程相关知识图谱、Shader编程相关数据类型、Shader核心结构体等(后续继续补充)。每个部分相互独立,可以单独参考,亦可作为一个整体参考,希望可以帮到大家。


一、Shader编程知识图谱


(.xmind源文件下载地址:http://www.duzixi.com/doc/ShaderStudy.xmind)


之所以屏幕上能够看到一个模型物体,一个是要有这样的“形”,这个信息保存在网格(Mesh)里,另一方面就是有颜色,也就是材质(Material)材质。

当然还有一个前提,就是这个物体在可视范围之内,也就是Camera(摄像机)。

决定材质如何上色的方式,就是Shader(着色器),Shader编程中涉及到的一些基本概念与这三者紧密相关。


首先,网格的顶点坐标会直接影响像素着色的位置,法线和切线会影响光照阴影的呈现方式,而uv坐标决定了贴图采样的颜色等。

其次,Unity引擎中用脚本对Shader复制的方式是通过Material类(材质)的SetXXXX系列方法来实现的,它是脚本与Shader的重要接口之一。

最后,摄像机的位置决定了视线和世界坐标转视图坐标的矩阵值,而组件属性中渲染路径的选择也会决定Shader渲染所选择的通道。


即使没有编写过Shader,我们都在有意无意的使用Shader。

Unity引擎内置的Shader主要依据用途和呈现效果划分,

普通(Nromal)、透明(Transparent)、自发光(Self Illuminated)、反射(Reflective)这一部分内容官方文档已经解释得很详细了。

此外,粒子(Particle)这个系列的Shader特别值得一提。

为什么粒子特效会如此靓丽炫酷,带来视觉效果呢?

其实粒子材质,即Shader和贴图发挥了很大的作用。

Shader中的颜色模型是大家熟知的RGBA模型,单一颜色光的取值范围在0~1之间。

值越大,说明光越强,也就越亮;反之越暗。(0,0,0,1)为黑色,(1,1,1,1)为白色。

这决定了两种基本的颜色叠加模式:加法(Additive)和乘法(Multiply)。

前者越叠加越亮,后者越叠加越暗(可在Particle的内置Shader中找到)。


一个立体的3D模型,在一定的光照情况下,会是什么样子?

画面对“光”的呈现,是靠“影”来完成的。而英文中的“影”就是shade,是指有影的东西,按照英文语法习惯就是shader了。

所以着色器(Shader)的出发点和本元,应该是如何更好的产生阴影。

在计算机中,阴影的计算是靠光照模型完成的。

光照模型有很多,最基本的是以下两种:

  • Lambert
  • Blinn-Phong 

二、Shader编程数据类型

有了基本的Shader编程知识之后,就可以尝试自己动手写Shader了。

Shader编程中比较麻烦的一点是,同一个变量在不同的语法阶段表示的方式不同,常用变量类型对照如下:

硬件平台

CPU

(Inspector面板设置)

GPU

变量类型

C#脚本语言

ShaderLab 属性

Cg语言

纹理贴图

Texture

2D

sampler2D

颜色

Color

Color

fixed4 / half4

3D贴图

Cubemap

Cube

sampleCUBE

4元素向量

Vector4

Vector

float4

浮点数

float

Float

float

浮点范围

float 

Range

float

矩形纹理

Texture

Rect

sampleRect


Cg语言中颜色类型使用4维向量表示的,根据精度选择,可选用fixed4或者half4等。


三、Shader核心结构体

(1)顶点着色器输入结构体

结构体也可以自定义,但是必须有位置信息

成员类型

成员名

结构体名:

appdata_base

appdata_tan

appdata_full

appdata_img

float4

vertex

位置

1

1

1

1

float3

normal

法线

1

1

1


float4

tangent

切线


1

1


fixed4

color

顶点颜色



1


float4

texcoord

纹理坐标0

1

1

1

1

fixed4

texcoord1

纹理坐标1



1



(2)表面着色器输出结构体

SurfaceOutput

half3

Abedo

反射光

half3

Normal

法线

half3

Emission

自发光

half

Specular

高光

half

Alpha

透明度


参考资料:
Shader编程参考资料整理如下:

【1】Unity 官方文档: Manual -> Graphics -> Graphics Reference -> Shader Reference 

【2】Unity内建Shader下载地址:http://unity3d.com/unity/download/archive

【3】Nvidia开发者入口:https://developer.nvidia.com

【4】AMD开发者入口:http://developer.amd.com/tools-and-sdks/

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引