Unity Shader认识

本文介绍了Unity引擎中的Shader概念,包括基于Mono的ShaderLab和两种主要类型:表面着色器和片段着色器。文章详细讲解了Shader的基本结构,并通过创建第一个Shader示例Diffuse_Texture来解析其组成部分,如属性定义、SubShader、Pass和回滚。此外,还提到了Shader在不同平台的适应性和光照模型的应用。

Unity引擎是一个非常强大的支持跨平台开发的游戏引擎,基于Mono这个开源.Net的框架设计而成,在Unity中定义了ShaderLab来组织Shader的内容,针对不同平台进行编译。了解了Shader和Cg的一些基础知识之后,接下来我们要做的就是:学会如何在Unity中使用Cg编写Shader并实现一些简单的Shader效果。

Unity Shader:

说到底,Shader其实只是一段规定好输入(颜色,贴图等)和输出(渲染器能读懂的点和颜色的对应关系)的程序。那么,设计一个Shader的过程其实就是根据输入,进行计算变换从而产生输出而已。

1.分类:

在Unity中的Shader分为两类:

表面着色器(Surface Shader):已经为我们完成了大部分的工作,只需要简单的操作即可得到不错的效果;

片段着色器(Fragment Shader):可以自己设计出很多东西,因为可自行设置的内容更多,但也更加难写。使用片段着色器的目的是可以在更加底层进行更复杂(或者针对目标设备更高效)的开发。

2.Shader程序基本结构:

使用Unity中的框架来编写Shader程序,其实相对于其他游戏引擎要简单一些,在Cocos2d中还得从OpenGL层面开始编写逻辑,但是在Unity只需要往框架中填入需要控制的内容即可,一个Shader程序的基本结构如下图所示:

Shader(着色器)

Property Definition(属性定义)

SubShader(子着色器:开始)

Pass

Pass

......

SubShader(子着色器:结束)

Fallback(回滚)

首先,定义一些属性,用来指定代码将有哪些输入;

其次,会有一个或者多个子着色器,但是在实际运行中哪一个子着色器被使用是由运行的平台所决定的;

子着色器是代码的主体,每个子着色器包含一个或多个Pass;

最后指定一个回滚,用来处理所有Subshader都不能运行的情况(比如设备太老)。

执行着色时,平台选择最优先可以使用的子着色器,然后依次执行该子着色器中的Pass,然后输出结果。

3.Unity创建第一个Shader:

在Unity的Project面板中,右键-Create-Shader,取名为Diffuse_Texture,使用VS打开可以查看新建的Shader的内容如下所示:

Shader "Custom/Diffuse_Texture" {

Properties {

_MainTex ("Base (RGB)", 2D) = "white" {}

}

SubShader {

Tags { "RenderType"="Opaque" }

LOD 200

CGPROGRAM

#pragma surface surf Lambert

sampler2D _MainTex;

struct Input {

float2 uv_MainTex;

};

void surf (Input IN, inout SurfaceOutput o) {

half4 c = tex2D (_MainTex, IN.uv_MainTex);

o.Albedo = c.rgb;

o.Alpha = c.a;

}

ENDCG

}

FallBack "Diffuse"

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

接下来我们要做的,就是解析这个Shader中每一行的含义和作用,包括了属性、Tags、LOD、光照模型等。

参考链接:

了解Shader的基础知识:猫都能学会的Unity3D Shader入门指南(一)

Unity官方关于Shader的一些资料:Materials, Shaders & Textures

了解Shader的机制:【Unity Shaders】初探Surface Shader背后的机制

推荐书籍:

《Unity Shader and Effect Cookbook》,中文版:《Unity着色器和屏幕特效开发秘笈》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值