[原]Unity3D深入浅出 - Shader基础开发
概述
简单来讲,shader是为渲染管线中的特定处理截断提供算法的一段代码。Shader是伴随着可编程渲染管线出现的,开发者可使用Shader对渲染过程加以控制,拥有更大的创作控件,因此Shader的出现可以看作是实时渲染技术的一次革命。
在现代主流3D引擎中,Shader已经无处不在,例如镜头景深,动态模糊,卡通渲染,以及各种特殊材质效果和光照效果等等。
Unity中所有的渲染都需要通过Shader来完成,开发者可以自己编写Shader,也可以使用Unity提供的内建Shader来完成各种画面效果。
内建Shader介绍
为了方便开发者使用,Unity3d已经提供超过60个的内建Shader,包括最简单的定点光照到高光、法线、反射等常见的材质效果。这些内建的Shader代码都可Unity3d官网中下载,开发者还可以基于这些代码开发出更多个性化的Shader。(内建Shader下载地址:http://unity3d.com/unity/download/archive )
内建Shader根据应用对象可分为如下几类:
- 普通(Normal Shader Family):用于不透明的对象
- 透明(Transparent Shader Family):用于透明对象
- 透明镂空效果(Transparent Cutout Shader Family):用于包含完全透明部分的半透明对象
- 自发光(Self-Illumination Shader Family):用于有发光效果的对象
- 反射(Reflective Shader Family):用于能反射环境立方体贴图的不透明对象
Unity里的三种自定义Shader
尽管Unity3d提供了丰富的内建Shader,开允许也可自定义Shader。编写Shader需要对OpengGL或者Direct3D的渲染状态有基本的了解,以及一些关于固定功能管线、可编程管线、Cg/HLSL/GLSL编程语言的基础知识。在Nvidia和AMD的网站上可以找到很多这方面的资料。(Nvidia:https://developer.nvidia.com/,AMD:http://developer.amd.com/tools-and-sdks/)
在Unity中,开发者可以编写以下三种Shader:
- 表面着色器(Surface Shaders):通常情况下开发者会用的Shader,可与灯光,阴影,投影器进行交互。表面着色器的抽象层次较高,可以容易地以简洁方式实现复杂的着色器效果。表面着色器以Cg/HLSL语言进行编写。
- 顶点和片段着色器(Vertex and fragment Shaders):如果不需要与灯光进行交互,只想要图像的效果,可使用顶点和片段着色器,但需要编写更多的代码。同样是使用Cg/HLSL语言来编写。
- 固定功能管线着色器(Fixed Function Shaders):如果项目运行在不支持可编程渲染管线的老旧硬件上,那么就需要编写这种Shder。以ShaderLab语言来编写,类似微软的Effects或者是Nvidia的CgFX。
使用哪种Shader需要根据项目需求,以及运行在的硬件平台来觉得,这三种Shader也可一起使用,以满足不同的需求,无论编写那种Shader,实际的Shader代码(比如Cg/HLSL代码)都需要嵌在ShaderLab(通道渲染命令)代码中,Unity需要通过ShaderLab代码来组织Shader的结构。
示例:
Shader "MyShader"{
Properties{
_MyTexture("My Texture",2D) = white {}
//在这里定义Shader中使用的属性,例如颜色,向量,纹理
}
SubShader{
//这里编写Shader的实现代码
//包括表面着色器,顶点和片段着色器的Cg/HLSL代码
//或者是固定功能管线着色器的ShaderLab代码
}
SubShader{
//在这里实现简化版的备选Shader,用于在不支持高级Shader特性的老硬件上运行
}
}
ShaderLab基础语法
此语言语法类此Cg语言,该语言能描述材质所需要的各种属性,可以很方便的通过编辑器的Inspector视图来查看和修改。具体参阅相关书籍。
[原]Unity3D深入浅出 - Shader基础开发的更多相关文章
- [原]Unity3D深入浅出 - 脚本开发基础(Scripts)
常用脚本事件: Update:每帧调用一次 Start:在第一次Update执行前调用 Awake:脚本实例在创建时调用 FixedUpdate:每个固定物理时间间隔调用一次 LateUpdate:每 ...
- [原]Unity3D深入浅出 - 认识开发环境中的自带的Package资源包
Character Controller:角色控制器 Glass Refraction(pro only):玻璃反射资源包 Image Effects :图像效果资源包 Light Cookies:光 ...
- [原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单
Component(组件)是用来添加到GameObject对象上的一组相关属性,本质上每个组件都是一个类的实例,比如在Cube上添加一个Mesh网格,即面向对象的思维方式可以理解成Cube对象里包含了 ...
- [原]Unity3D深入浅出 - 认识开发环境中的GameObject菜单栏
Create Empty:创建空对象 Create Other:创建其他对象 Particle System:创建粒子系统 Camera:创建相机 GUI Text:GUI文本 GUI Texture ...
- [原]Unity3D深入浅出 - 认识开发环境中的Project面板
前面几个是用来创建脚步的,从Prefab说起: Prefab:预设物体,若一个Object在Scene中多处用到,即可选择为改对象创建一个Prefab.创建一个Prefab后,将源Object拖拽 ...
- [原]Unity3D深入浅出 - 认识开发环境中的RenderSettings面板
点击菜单栏的Edit项里的RenderSettings即可打开该面板. Fog:在Scene中开启雾效果 Fog Color:雾的颜色 Fog Mode:雾效果的模式,Linear(线性雾效果) Ex ...
- [原]Unity3D深入浅出 - 认识开发环境中的Layers面板
Layers(分层)下拉列表:用来控制Scene视图中游戏对象的显示,在下拉菜单中为勾选状态的物体将显示在Scene视图中. Everything:显示所有的游戏对象 Nothing:不显示任何游戏对 ...
- [原]Unity3D深入浅出 - 天空盒(Skyboxes)
Unity3D中自带了9中天空盒,在Assets - Import Package - Skyboxes 即可导入天空盒资源. 为Scene添加Skybox:在Edit菜单项里的Render Sett ...
- [原]Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh)
NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路..导航时,只需要给导 ...
随机推荐
- DB2分区表删除和添加分区
1.数据库版本 2.具体procedure DROP PROCEDURE DB2USER.TOOLS_PARTITION_TABLE_SHOW (VARCHAR ()); )) /********** ...
- Centos6.4 安装NLTK
NLTK 安装链接 http://www.nltk.org/install.html 不知道什么原因打不开pypi 的网站 http://pypi.python.org/pypi/setuptool ...
- [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍
注:为了看上去比较清晰这里只转载了中文 原地址: [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍 本章将引导您完成安装和设置开发环境,然后你就可 ...
- Xubuntu 安装mentohust
对于路由器上网到用户来说,自动分配IP上网。 对于校园网用户,首先下载mentohust_0.3.4-1_i386.deb,双击安装程序 然后在命令窗口中输入sudo -s 密码:user来获得roo ...
- [译] ASP.NET 生命周期 – ASP.NET 上下文对象(五)
ASP.NET 上下文对象 ASP.NET 提供了一系列对象用来给当前请求,将要返回到客户端的响应,以及 Web 应用本身提供上下文信息.间接的,这些上下文对象也可以用来回去核心 ASP.NET 框架 ...
- Linux:crontab命令学习
一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cro ...
- 过滤菜鸟的iOS面试题-b
网上已经有很多针对各种知识点的面试题,面试时有些人未必真正理解也能通过背题看上去很懂.我自己总结了4道面试题,好快速的判断这个人是否是一个合格的工程师,欢迎大家点评. 1.struct和class的区 ...
- 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR)
1 HDR基本概念 高动态范围光照(High Dynamic Range Imaging,简称HDRI或HDR),是一种表达超过了显示器所能表现的亮度范围的图像映射技术,已成为目前游戏应用不可或缺的 ...
- 实时数据处理环境搭建flume+kafka+storm:0.环境依赖
storm需要java和Python 部署依赖环境 --- 要求Java 6+ .Python 2.6.6+ java,python安装配置完成
- robots.txt协议-互联网robots搜索规范
最近在看搜索爬虫相关的,挺有趣的,记录一些信息备用. robots.txt官方说明网站 http://www.robotstxt.org/ robots.txt原则 Robots协议是国际互联网界通行 ...