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 作者:毛星云(浅墨) ...
随机推荐
- iOS8 VPN 应用内连接
iOS8 开放了关于VPN的API,开发者能够在应用中创建VPN配置,并控制VPN的连接.不过只支持了IPSec和IKEv2两种协议. 关于这方面资料,很少,在这里要感谢一下 今晚打老虎,是在他得帮助 ...
- andriod手机签到应用服务器设计
最近导师要求我和另一个同学开发一个手机上课签到应用,我负责客户端和服务器之间的通信架构编写和数据的存储 本人大学四年只用过汇编和C/C++,因此对andriod开发还是一窍不通,花了一个星期写出来了基 ...
- Drupal 7.23版本升级笔记
转载请注明出处:http://blog.csdn.net/panjunbiao/article/details/9860849 今天将尝试将Drupal网站从7.22升级到7.23,下面是升级笔记. ...
- 【转载】Grunt常用插件介绍
项目名称 grunt-contrib v0.8.0 项目地址 https://github.com/gruntjs/grunt-contrib 项目介绍 此项目是对grunt常用插件的集合,刚接触gr ...
- solrcloud使用中遇到的问题及解决方式
首先声明,我们团队在使用solrcloud过程中踩了一些坑,同事(晓磊和首富)进行了总结,我列到我的博客上做记录用: Q:为什么Solr里面的时间比数据库里面早8小时? Solr默认采用的时区是UTC ...
- Hekaton是如何影响你数据库的目标恢复时间(RTO)的
这个周末我发现了SQL Server 2014里Hekaton的一个有趣副作用,很遗憾它会负面影响你数据库的目标恢复时间(Recovery Time Objective,RTO).你已知道,对于每个本 ...
- sublime 插件zen coding
sublime的插件Zen Coding是一个编写html的神器,现在已经更名为Emmet了. 在sublime中的package需要搜索的是Emmet 相关网站: 官网 Zen Coding: 一种 ...
- Sql Server来龙去脉系列 必须知道的权限控制核心篇
最近写了<Sql Server来龙去脉系列 必须知道的权限控制基础篇>,感觉反响比较大.这可能也说明了很多程序猿对数据库权限控制方面比较感兴趣,或者某些技术点了解的没有很透彻. 有些人看 ...
- JavaScript常用代码
页面的按钮全选: function CheckBoxAll() { //得到页面上所有input表单元素:document.getElementsByTagName( ...
- *nix下传统编程入门之GCC
准备工作 注意:本文可能会让你失望,如果你有下列疑问的话:为什么要在终端输命令啊? GCC 是什么东西,怎么在菜单中找不到? GCC 不能有像 VC 那样的窗口吗?…… 那么你真正想要了解的可能是 a ...