Unity3d之Shader开发介绍

Shader是为渲染管线中的特定处理阶段提供算法的一段代码。shader是伴随着可编程渲染管线出现的,它的出现使得游戏开发者可以对渲染过程加以控制,拥有更大的创作空间,因此Shader的出现可以看作是实时渲染技术的一次革命。

为了方便游戏开发者使用,Unity提供了大量的内建Shader,包括从最简单的顶点光照效果到高光,法线,反射等游戏中最常用的材质效果。

内建的shader根据应用对象可以分为以下几大类:

v  普通Normal Shader Family:用于不透明的对象。

v  透明Transparent Shader Family:用于透明的对象。

v  透明镂空效果Transparent Cutout Shader Family:用于包含完全透明部分的半透明对象。

v  自发光Self-illuminated Shader Family:用于有发光效果的对象。

v  反射Reflective Shader Family:用于能反射环境立方体贴图的不透明对象。

如何在效果各异的内建Shader中选择最合适的Shader是开发者需要考虑的问题,毕竟视觉效果越好的Shader,一般渲染开销也越大,同时对硬件的要求也越高。游戏开发者需要在游戏画面和游戏性能之间做出平衡。

以下是不同的光照效果从低到高的计算开销排序;

Unlit:仅适用纹理颜色,不受光照影响。

VertexLit:顶点光照。

Diffuse:漫反射。

Specular:在漫反射基础上增加高光计算。

Normal mapped:法线贴图,增加了一张发现贴图和几个着色器指令。

Normal mapped Specular:带高光法线贴图。

Parallax Normal Mapped:视差法线贴图,增加了视差贴图的计算开销。

Parallax Normal Mapped Specular:带高光视差法线贴图。

三种自定义的Shader

Unity中,开发者可以编写3种类型的Shader:

ü  表面着色器Surface Shaders:通常情况下用户都会使用这种Shader,它可以与灯光,阴影,投影器进行交互。表面着色器的抽象层次比较高,它可以容易地以简洁方式实现复杂的着色器效果。表面着色器可同时正常工作在前向渲染及延迟渲染模式下。表面着色器以Cg/HLSL语言进行编写。

ü  顶点和片段着色器Vertex and fragment Shaders:如果需要进行一些表面着色器无法处理的酷炫效果,或者编写的Shader不需要与灯光进行交互,或者想要的只是全屏图像效果,那么可以使用顶点和片段着色器。这种Shader可以非常灵活地实现想要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。顶点和片段着色器同样是用Cg/HLSL语言编写。

ü  固定功能管线着色器Fixed Function Shaders:如果游戏运行在不支持可编程管线的老旧硬件上,那么就需要编写这种Shader。固定功能管线着色器可以作为片段或表面着色器的备用选择,这在当硬件无法运行那些炫酷Shader的时候哦,还可以通过固定功能管线着色器来绘制出一些基本的内容。固定功能管线着色器完全以ShaderLab语言编写,类似于微软的Effects或者是Nvidia的CgFX。

无论编写哪种Shader代码,都需要嵌在ShaderLab代码中,Unity需要通过ShaderLab代码来组织Shader结构。

shader Language目前主要有三种语言:基于OpenGL的GLSL,基于Direct3D的HLSL,还有NVIDIA公司的Cg语言。

HLSL全称是"High Level Shading Language"

cg全称是"C for Graphic"

GLSL全称是"OpenGL Shading Language"

Shader language原理

使用shader language编写的程序被称之为shader program着色程序。着色程序分为两类:vertex shader program顶点着色程序和fragment shader program片段着色程序。

GPU上有两个组件:Programmable vertex processor可编程点处理器,又称为顶点着色器;Programmable fragment processor可编程片段处理器,又称为片段着色器。

顶点和片段处理器都拥有非常强大的并行计算能力,并且非常擅长于矩阵(不高于4阶)计算,片段处理器还可以高速查询纹理信息(目前顶点处理器还不行,这是顶点处理器的一个发展方向)。

顶点着色器控制顶点坐标转换过程,片段着色器控制像素颜色计算过程。前者的输出是后者的输入。

现阶段可编程图形硬件的输入/输出。输入寄存器存放的是输入的图元信息,输出寄存器存放的是处理后的图元信息,纹理Buffer存放的是纹理数据,目前大多数的可编程图形硬件只支持片段处理器处理纹理;从外部宿主程序输入的常量放在常量寄存器中;临时寄存器存放着色程序在执行过程中产生的临时数据。

shader language被定位是高级语言,但是却没有独立于硬件,而是完全依赖于GPU架构,所以GPU编程技术的发展本质上还是图形硬件的发展。

eg:

 1 Shader "MyShader"{//Shader的名称
 2
 3 Properties{
 4
 5 _MyTexture("My Texture",2D) = "White"{}
 6
 7 //在这里定义Shader中使用的属性,例如颜色,向量,纹理
 8
 9 }
10
11 SubShader{
12
13 //在这里编写Shader的实现代码
14
15 //包括表面着色器,顶点和片段着色器的Cg/HLSL代码
16
17 //或者是固定功能管线着色器的ShaderLab代码
18
19 }
20
21 SubShader{
22
23 //在这里实现简化版的备选Shader,用于在不支持高级Shader特性的老硬件上运行
24
25 }
26
27 }

创建Shader

在Unity中开始编写Shader代码前,需要在项目工程中创建一个Shader文件,着点和编写脚本一样。

ShaderLab基础语法

在Unity中提供了一种名为ShaderLab的着色器语言来编写Shader,语法类似Cg语言,该语言能够描述材质所需要的各种特性,并且可以很方便地通过Inspector视图来查看和修改。

eg:

 1 Shader "Simple colored lighting"{
 2
 3 Properties{//定义一个名为Main Color的颜色属性
 4
 5 _Color("Main Color",Color) = (1,0.5,0.5,1)
 6
 7 }
 8
 9 SubShader{//Shader的实现代码
10
11 Pass{
12
13 Material{
14
15 Diffuse[_Color]
16
17 }
18
19 Lighting On
20
21 }
22
23 }
24
25 }

示例运行效果如下:

注意:Unity中的游戏体不能为默认材质添加Shader。要想使用自定义的Shader,首先需要自定义一个材质球,然后才可以使用自定义的Shader。

时间: 2024-10-13 22:46:18

Unity3d之Shader开发介绍的相关文章

《Unity3D/2D游戏开发从0到1》正式出版发行啦

书籍信息:   书籍的名称: <Unity3D/2D 游戏开发从0到1>   书号(ISBN): 978-7-121-26239-5    出版社: 电子工业出版社   发行时间:2015年7月1日 写作背景:    2015年6月30日我收到电子工业出版社张迪老师寄来,正式发行的<Unity3D/2D游戏开发从0到1>书籍.这本凝结着大半年心血的作品让我感慨万千.   本人从事游戏.软件与教学十多年,一直梦想可以进一步服务于全国广大的游戏与软件从业开发人员.14年下半年电子工业出

Unity3D手游开发实践

<腾讯桌球:客户端总结> 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: 架构设计 原生插件/平台交互 版本与补丁 用脚本,还是不用?这是一个问题 资源管理 性能优化 异常与Crash 适配与兼容 调试及开发工具 项目运营 ? 1.架构设计 好的架构利用大规模项目的多人团队开发和代码管理,也利用查找错误和后期维护. 框架的选择:需要根据团队.项目来进行选择,没有最好的框架,只有最合适的框架. 框架的使

《Unity3D/2D游戏开发从0到1》正式出版发行

去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息: 书籍的名称: <Unity3D/2D 游戏开发从0到1> 书号(ISBN): 978-7-121-26239-5 出版社: 电子工业出版社 发行时间:2015年7月1日 写作背景: 2015年6月30日我收到电子工业出版社张迪老师寄来,正式发行的<Unity3D/2D游戏开发从0到1>书籍.这本凝结着大半年心血的作品让我感慨万千. 本人从事游戏.软件与教学十多年,一直梦想可以进一步服务于

Unity3D Compute shader 新解粒子堆积矩阵【二】

Unity3D Compute shader 新解粒子堆积矩阵[二] 1.Compute Shader都出来了好些年了,幸好Unity3D 加入了该特性,当然U3D本着易开发操作平台,在u3d中实现compute shader起来是相当轻松的. 2.除了Compute Shader,还有 Vertex shader,Geometry shader,Fragment shader ; Tesselation shader,Domain shader,Hull Shader ,如果你觉得有一种都想学

关于《Unity3D/2D游戏开发从0到1》书籍再版说明

关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于Unity4.6版本的教学知识体系,则略显滞后.    随着2017年7月份,Unity2017.1正式版本的推出,<Unity3D/2D游戏开发从0到1>书籍的再版,则正式提上日程. 目前2017年8月份再版工作已经进行过半,现在给各位小伙伴汇报一下工作,希望得到更好的建议.现在说说第二版本的总体

Qt Quick应用开发介绍 1-5

Qt Quick应用开发介绍 Introduction to Application Development with Qt Quick Release 1.0 Chapter1 Introduction 介绍 1.1 谁应该阅读这份教程 本教程解释了Qt Quick应用开发的基础以及使用示例代码帮助全面了解; 教程包含标准Qt Quick文档和基础概念, API以及详细的源码信息; 本教程是为了新接触Qt Quick的你准备的, 虽然从基础开始, 但你还是要熟悉编程的概念, 有JavaScri

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

OC多文件开发介绍

OC多文件开发介绍: 1.为什么要使用多文件? 在工作中,通常把不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h头文件中,实现写在相应的.m文件中去,类名是什么,文件名的前缀就是什么.假设有两个类,分别是Person类和Dog类,则通常有下面五个文件: (1)Person.h Person类的声明文件 (2)Person.m Person类的实现文件 (3)Dog.h Dog类的声明文件 (4)Dog.m Dog类的实现文件 (5)Main.m 主函数(程序入口)在主函数以及类的实

[原]Unity3D深入浅出 - 认识开发环境中的Layers面板

Layers(分层)下拉列表:用来控制Scene视图中游戏对象的显示,在下拉菜单中为勾选状态的物体将显示在Scene视图中. Everything:显示所有的游戏对象 Nothing:不显示任何游戏对象 Default:显示没有任何控制的游戏对象 TransparentFX:显示透明的游戏对象 Igonore Raycast:显示不处理投射事件的游戏对象 Water:显示水对象 EditLayers:编辑层 尊重他人劳动成功,转载请注明出处:http://www.cnblogs.com/tong