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 作者:毛星云(浅墨) ...
随机推荐
- ArcGIS Server注册地理数据库报machine:机器名[Oracle:(null)]错误的修改
环境介绍:本机安装了ArcGIS Server10.2,ArcGIS Desktop10.2,64位Oracle11g以及Oracle32位客户端.直连和服务连接都能成功. 问题:我要进行服务发布的时 ...
- 进阶学习js中的执行上下文
在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文. 1.当遇到变量名和函数名相同的问题. var a = 10; functio ...
- js中的执行上下文,菜鸟入门基础。
console.log(a); //Uncaught ReferenceError: a is not defined 因为没有定义a所以报错了. var a = 52; console.log(a) ...
- win7激活
应亲戚要求,装了次win7系统,重新删除分区,格盘,重新划分好分区.完毕.发现系统分区全自动变成动态磁盘.使用win7激活工具时,注意选择使用 小马通用版激活工具. 动态磁盘 稍后解释 小马工具
- 使用uploadify上传控件无法进入后台问题分析
分别在.net mvc 和java struts2中使用到 uploadify上传 文件,遇到同样的问题,选中文件上传后,文件无法上传,打上断点后发现没有进入后台. 逐步断点发现 项目共同点是加入了 ...
- 2014 网选 广州赛区 hdu 5023 A Corrupt Mayor's Performance Art
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #d ...
- 使用的 SQL Server 版本不支持数据类型“datetime2”的错误解决方法
THE VERSION OF SQL IN USE DOES NOT SUPPORT DATATYPE ‘DATETIME2′ 主要错误原因,在使用ado.net entity的时候,entity使用 ...
- python进阶学习笔记(四)--多线程thread
在使用多线程之前,我们首页要理解什么是进程和线程. 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期.进程( ...
- Centos7 禁止firewalld并使用iptables 作默认防火墙
一.停止并禁用firewalld [root@test ~]# systemctl stop firewalld [root@test ~]# systemctl disable firewalld ...
- .NET ORM 哪家强
ORM到底哪家强? 很多人都想知道这个问题,自已也没测试过,只能道听途说. 闲的无聊就将几个ORM拿出来比一比,假如怀疑测试代码有问题可以将它下载下来慢慢研究. 参赛ORM 1.SqlSugar:是一 ...