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 作者:毛星云(浅墨) ...
随机推荐
- WPF中模板选择和DataContext的一些使用
如图样: View结构 MainView(MainViewModel)|---Guide1View(Guide1ViewModel)|---Guide2View(Guide2ViewModel) |- ...
- bootstrap插件学习-bootstrap.carousel.js
先看bootstrap.carousel.js的结构 var Carousel = function (element, options){} //构造器 Carousel.prototype = { ...
- ECMASCRIPT 6中字符串的新特性
本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...
- [Python] Remote debugging by Pycharm
From: http://blog.csdn.net/u013088062/article/details/50170551 虚拟环境配置 配置远程解释器 设想这样一种情况,你在一个平台上操作你的工程 ...
- [Python] Basic operations in Pycharm
From: http://learnpythonthehardway.org/book Comment with line comment: Ctrl + slash Run: Shift + F10 ...
- ASP.NETC#通用扩展函数之TypeParse 类型转换方便多了
用法: var int1 = "2".TryToInt();//转换为int失败返回0 var int2 = "2x".TryToInt(); var int3 ...
- Python 3.x自定义迭代器对象
Python 3.x与Python 2.x之间存在着较多的语法细节差异.今天在看Python核心编程的时候,说到了自定义迭代器对象.于是动手将源码打了一遍,原书代码如下: class AnyIter( ...
- MVC bundle(包扎)CSS或是JS文件
以前写asp.net网页时,会在<head>节点中引用很多样式文件或是javascript文件,如下图左大括号的引用语句. 现在在MVC应用程序中,可以使用使用Bundle来捆一起, 在S ...
- 在C#后端处理一些结果然传给前端Javascript或是jQuery
在C#后端处理一些结果然传给前端Javascript或是jQuery,以前Insus.NET有做过一个例子<把CS值传给JS使用 >http://www.cnblogs.com/insus ...
- 发现自己喜欢了移动端开发--Android
喜欢.net一直到现在了,但是自己做过的项目都不是让我自己很满意,不知道为什么,可能是自己的要求比较高吧! 下面自己记录自己的学习 src专门存放我们java源代码的包 Android 4.2.2存放 ...