一、Unity中Shader的三种基本类型

一、固定功能着色器(Fixed Function Shader)

固定功能着色器为固定功能渲染管线的具体表现。功能较简单兼容比较老的机器

二、表面着色器

存在于Unity3D中由U3D发扬光大的一门技术。Untiy3D为我们把Shader的复杂性包装起来,降低shader的书写门槛,创建了表面着色器

三、顶点着色器和片段着色器

GPU上含有两个组件:可编程顶点处理器和可编程片段处理器,顶点和片段处理器被分离成可编程单元,可编程顶点处理器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个可以运行片段程序的单元。顶点着色器:顶点着色程序从GPU前端(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标),并完成顶点坐标空间变换、法向量空间转换、光照计算等操作,最后将计算数据传送到指定寄存器中。片段着色器片段程序从上述寄存器中获取需要的数据:纹理坐标与光照信息等,并根据这些信息以及从应用程序传递的纹理信息进行每个片段的颜色计算(纹理查询),最后将处理后的数据传送光栅操作模块。

三种着色器的共同点:

都必须从唯一一个根Shader开始
Prooerties参数部分,作用以及语法完全相同。
具体功能都在SubShader里。
都可以打标签
都可以Fallback
都可以处理基本的功能,例如光照漫反射以及镜面反射。但如uv计算效果等高级功能,固定功能着色器无法完成。
三种着色器的不同点
表面着色器没有通道pass{},加了会报错,该着色器已经把具体内容打包在光照模型中了。
固定渲染管线每句代码之后都没有“;”
核心结构不同:

固定渲染管线的核心是:

Material{}以及SetTexture[_MainTex]{}

顶点与片段着色器的核心是:

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
ENDCG

表面着色器的核心是:

1.表面着色器使用Unity3D自带光照模型Lambert,也不做顶点处理,只需要一个表面处理函数surf即可。
CGPROGRAM
#Pragma surface surf Lambert
ENDCF
2.这套表示使用的是自己写的光照模型lsyLightModel,并且使用了顶点处理函数vert
CGPROGRAM
#pragma surface surf lsyLightModel vertex:vert
ENDCG

二、shader整体框架

1、从这幅图可以看到,Unity中的shader可以分为以下三个模块:

Properties一般定义中着色器的起始部分。属性模块可以定义一些属性,用来指定那个这段代码有哪些输入。在使用shader 的时候可以直接中材质面板里编辑这些属性。Properties块内的语法都是单行的。属性的定义格式如下所示:

属性可以划分为以下几类:

1)、数字与滑动条
name ("display name", Range (min, max)) = number //滑动条调节
name ("display name", Float) = number//数字调节
name ("display name", Int) = number//数字调节
颜色与向量(注意是四元数)
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
2)、贴图
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}//立方体贴图
name ("display name", 3D) = "defaulttexture" {}
3)、细节
Range与float的属性只能是单精度值。
在后面的着色器程序中,属性值通过[name]来访问。而display name将显示在材质检视器中。
可以使用在属性定义加上等号为每个属性提供缺省值。
对于纹理(2D, Rect, Cube) 缺省值既可以是一个空字符串也可以是某个内置的缺省纹理:"white", "black", "gray" or"bump"
使用示例
// properties for a water shader
Properties
{
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color
_ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}

2、子着色器SubShader

这个我会在下一篇文章中详细说明

3、回滚FallBack
Shader基本框架的最后是指定一个回滚函数Fallback,用来处理所有的子着色器都不能运行时的情况(当目标设备太老时,所有的设备都有其不支持的特性时使用了Fallback),可以认为是一种defult。

时间: 2024-08-11 22:12:12

一、Unity中Shader的三种基本类型的相关文章

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

Jquery中each的三种遍历方法

Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(data) { $.each(data, function(n,value) { });}); 1.选择器+遍历 $('div').each(function (i){ i就是索引值 this 表示获取遍历每一个dom对象 }); 2.选择器+遍历 $('div').each(function (index,dom

Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的

bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使用Boolean类型. 这四种类型的布尔值占用内存的数量如下: Boolean 1 Byte ByteBool 1 Byte WordBool 2 Bytes(1 Word) LongBool 4 Bytes(2 Words) 对于ByteBool,WordBool和LongBool三种类型True

zz存储系统中缓存的三种类型

三种基本类型的缓存:绕写式(write-around),直写式(write-through)和回写式(write-back). 绕写式(write-around)缓存意味着所有数据首先被写入到硬盘区,当它成为合格的后,再基于读操作将它复制(注意不是移动)到闪存区.这意味着数据总是驻留在硬盘层,通常由RAID或镜像功能进行数据保护.其结果是,缓存区的闪存并不需要像上述分层模型中所要求的高可靠性.此外,由于所有数据首先被写入硬盘,闪存的使用寿命应该会延长.只有真正值得闪存“缓存”的数据才会被写到闪存

java中 this 的三种用法

Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 (3)this调用构造方法只能在本构造方法中调用另一个构造方法(4)this 调用构造方法必须写在第一行 eg: 1 public class ThisDemo { 2 private int id; 3 private String name; 4 public ThisDemo(){ //(1)

Python中逗号的三种作用

最近研究python  遇到个逗号的问题 一直没弄明白 今天总算搞清楚了 1.逗号在参数传递中的使用: 这种情况不多说  没有什么不解的地方 就是形参或者实参传递的时候参数之间的逗号 例如def  abc(a,b)或者abc(1,2) 2.逗号在类型转化中的使用 主要是元组的转换 例如: >>> a=11>>> b=(a)>>> b11>>> b=(a,)>>> b(11,)>>> b=(a,22)

Sql Server删除数据表中重复记录 三种方法

本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1.生成一张临时表new_users,表结构与users表一样:2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录:3.把users表改为其它的名称,把new_use

当今商业中使用的三种十分重要的IT应用系统

本文为读书笔记,其中内容摘自<信息时代的管理信息系统>第八版第二章 当今商业中使用的三种十分重要的IT应用系统: 供应链管理(SCM) 客户关系管理(CRM) 电子协同(e-collaboration) 供应链管理系统中的几个重要概念:分销链.JIT及时生产.多式联运.信息合作关系 客户关系管理系统中几个重要概念:多渠道服务传递.销售自动化.客户服务支持.市场营销活动及管理分析 电子协同的几个方面: 集成协同环境中的工作活动:虚拟团队.工作流系统.文件管理系统 知识管理系统 社交网络系统 电子