UnityShader之Shader分类篇【Shader资料2】
关于ShaderLab,从我个人的理解上来看应该是分为三种类型。
1、Fixed function shader
固定渲染管线Shader,基于用于高级Shader在老显卡无法显示时的Fallback,使用的是ShaderLab语言,属于真正的ShaderLab语言,和我们平时看到的shader的区别后面细说。
2、Vertex and Fragment Shader
可编程渲染管线,这种Shader包含Vertex Shader和Fragment Shader,也就是顶点着色器和片段着色器。顶点着色器会根据你自己的定义自动获取顶点一些相关信息。使用CG/HLSL语法,小伙伴们平时应该都注意到了有时候在Shader中会出现#include "UnityCG.cginc"这类声明,这里面就是Unity给我们做好的一个库,你可以想像成C语言程序中的include,C#程序员可以想象成代码文件开头的Using引用,Android程序员可以将其想象成代码开头的import引用。
3、Surface Shader
unity自己最为推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。也是使用CG/HLSL。
Unity的三种Shader对比相同点:
1、都必须从唯一一个根的Shader开始,也就是本系列资料1中解释的调用函数。
2、Properties参数部分,作用和语法完全相同,没有任何区别,没有万一。
3、具体的功能都在SubShader里去实现,如果有多个Subshader,那么机器不会全部执行,而是最多只执行一个,执行方式是从上自下开始运行硬件能够支持的第一个SubShader,这样做的目的主要是为了兼容不同类型的显卡。
4、都可以贴上标签,也就是Tags块,例如Tags { "RenderType" = "Opaque" } LOD 200 以及Lighting On等,这些的具体用法咱们后面细说。
5、结束的时候都可以用Fallback来进行对备胎Shader的使用,备胎的意思也就是如果所有的SubShader都不被硬件支持,就会去使用Fallback所指定的Shader。
6、都可以处理基本的功能,例如光照反射镜面反射等。但是顶点片段着色器和表面着色器都可以实现固定管线实现不了的高级功能,例如基于UV计算的效果等。
Unity的三种Shader对比不同点:
1、固定管线和顶点片段着色器的SubShader下面还有pass{}通道,但是表面着色器已经将具体内容打包在光照模型里面了,所以不能加上pass{}通道。
2、固定管线每句代码之后没有分号,但是V&F着色器Sur着色器的每句代码之后都必须加上分号,这种设计也许更符号码农们的期望吧。
3、核心结构不同,
固定管线的核心:
Material{} 以及 SetTexture[_MainTex]{}
V&F着色的核心:
CGPROGRAM //声明使用CG语言
#pragma vertex vert //声明顶点函数vert
#pragma frament frag //声明片段函数frag
#include "UnityCG.cginc" //导入unity的CG库
ENDCG
Surface Shader的核心:
CGPROGRAM //声明使用CG语言
#pragma surface surf Lambert //声明一个表面着色器函数surf,并使用Unity自己的光照模型和顶点函数
//Lambert为Unity自带的光照模型函数,我们也可以使用自己写的光照模型函数,并且使用自己写的顶点函数
// surface 表面处理函数 光照模型函数 顶点处理:函数
//#pragma surface surf lsyLightModel vertex:vert
//执行顺序 顶点处理函数 -> 表面处理函数 -> 光照模型函数 ->颜色值
ENDCG
UnityShader之Shader分类篇【Shader资料2】的更多相关文章
- [Unity Shader]Shader分类
Shader的分类: Shader按管线分类一般分为固定渲染管线与可编程渲染管线 (1)固定渲染管线 ——这是标准的几何&光照(Transforming&Lighting)管线,功能是 ...
- 「游戏引擎 浅入浅出」4.1 Unity Shader和OpenGL Shader
「游戏引擎 浅入浅出」从零编写游戏引擎教程,是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book 4.1 ...
- UnityShader之Shader格式篇【Shader资料1】
关于Shader,在Unity里面我们一般叫做ShaderLab,只要你的职业是与渲染搭边,Unity就与ShaderLab有着直接的关联,你都应该试着去学会它,其实我们在新手未有入门的时候,我们总是 ...
- [Unity Shader]ShaderForge制作Shader
什么是ShaderForge ShaderForge的目标是推动统一的视觉质量提升到了新的高度, 给你自由的材质创建在一个视觉和直观的方式——不需要代码! ShaderForge的特性 •实时着色器预 ...
- GLSL写vertex shader和fragment shader
0.一般来说vertex shader处理顶点坐标,然后向后传输,经过光栅化之后,传给fragment shader,其负责颜色.纹理.光照等等. 前者处理之后变成裁剪坐标系(三维),光栅化之后一般认 ...
- Stage3d 由浅到深理解AGAL的管线vertex shader和fragment shader || 简易教程 学习心得 AGAL 非常非常好的入门文章
Everyday Stage3D (一) Everyday Stage3D (二) Triangle Everyday Stage3D (三) AGAL的基本概念 Everyday Stage3D ( ...
- Game shader or System shader is busy ::VS CSG
this error means The GPU is freezen Phyre::PSemaphoreOrbis::wait()//callstack something illegal in c ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
随机推荐
- Maven进价:eclipse中集成maven
一.M2Eclipse插件 m2eclipse是一个在Eclipse中集成Maven的插件,有了该插件,用户可以方便的在Eclipse中执行Maven命令.创建Maven项目.修改POM文件等. 下载 ...
- 后端码农谈前端(HTML篇)第三课:常见属性
一.HTML全局属性 1.核心属性 属性 描述 id 设置元素的唯一 id. class 设置元素的一个或多个类名(引用样式表中的类). style 设置元素的行内样式(CSS内联样式). title ...
- Java 时间日期系列目录
下面是Java的时间和日期相关文章目录: 01. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(1) Calendar 02. ...
- EPANET源码中用到的几个简单C语言函数介绍三
引自input2.C int getfloat(char *s, double *y)/***---------------------------------------------------- ...
- 敏捷个人手机应用iOS和Android公开注册
敏捷个人手机应用iOS出炉了,现在免费公开注册,截止时间到4月20日,注册时的邀请码是7个字符: 1.admin Android下载地址:http://agileme-download.qiniudn ...
- ASP.NET MVC 使用 IOC框架 AutoFac 自动释放数据库资源
每次使用using或者dispose来释放资源会比较麻烦,作为一个会偷懒的程序员来说当然不能接受了. 一.引用 autofac.dll和autofac.integration.mvc.dll 二.打开 ...
- 设计模式之Interator模式(1)
interator是java容器遍历的一种手段,当然遍历容易你可以使用普通的for(;;)或者for(Object o : new Arraylist<Object>()),都是可以的. ...
- Velocity魔法堂系列三:模板与宿主环境通信
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- JS 函数--Date()函数
1.JavaScript没有基本的日期数据类型,所以只能显式的创建Date对象.例如:var myDate=new Date(); 2.为了创建一个存储了特定日期的,或者时间的Date对象,可以简单的 ...
- js用正则表达式验证用户和密码的安全性,生成随机验证码
制作了一个表单,表单验证用户.密码.随机验证码 html页面