一.Shaderlab语法

1.给Shader起名字

Shader "Custom/MyShader"

这个名称会出现在材质选择使用的下拉列表里

2. Properties (属性)

Properties
{
Name ("display name",ProperType)=DefaultValue
//更多属性
}

Name:用于Shader中访问的名字

display name:出现在材质面板的名字

ProperType:它的类型

3.SubShader

每一个Unity Shader文件可以包含多个SubShader语义块,但至少要有一个

SubShader {
//可选的
[Tags]
//可选的
[RenderSetup]
Pass{
}
//Other Pass
}

Pass尽量不要太多,太多往往会造成渲染性能的下降

(1)状态设置

下面是常见的状态设置选项

(2).Tags:是一个键值对(Key/Value Pair)

用来告诉Unity的渲染引擎:SubShader我希望怎么以及何时渲染这个对象

结构如下:

Tags {"TagName1"="Value1" "TagName2"="Value2"}

支持的标签类型如下:



(3)Pass语义块

Pass{
[Name]
[Tags]
[RenderSetup]
//Other code
}

1.Name:在Pass中定义该Pass的名称,我可以使用ShaderLab中的UsePass命令来直接使用其他Unity Shader中的Pass(使用大写形式的名字)

2.Pass中的标签(Tags):不同于SubShader中的标签

Pass中使用的标签类型如下:



3.Usepass:可以复用其他Unity Shader中的Pass

GrabPass:负责抓取屏幕并结果存储在一张纹理中,以用于后续的Pass处理(截屏)

4.Fallback(留一条后路)

如果上面所有的SubShader在这块显卡上不能运行,那么就使用这个最低级的Shader

Fallback "name"

当然你也可以不指定它(关闭这个功能),然后所有不能跑的话就不执行任何操作

5.CGPROGRAM和ENDCG

CGPROGRAM和ENDCG之间的代码是使用了CG/HLSL编写的,也就是说我们需要把CG/HLSL语言嵌套在ShaderLab语言中.

CG代码片段通常是位于Pass语义内部的

GlSL的代码嵌套在GLSLPROGRAM和ENDGLSL之间

6.#prama 编译指令

#pragma 编译指令:  #pargma 关键词 函数名 光照模型 [其它选项]

每个CG片段必须至少包含一个顶点程序和一个片段程序。因此需要#pragma vertex#pragma fragment指令。

编译指令留着再写一篇博客:暂时还没写

二丶Unity Shader的形式

Shader "MyShader"
{
Properties
{
//所需的各种属性
}
SubShader
{
//真正意义上的Shader代码会出现在这里
//表面着色器(Surface Shader)或者
//顶点/片元着色器(Vertex/Fragment Shader)或者
//固定函数着色器(Fixed Function Shader)
}
SubShader
{
//和上一个SubShader类似
}
}

作者:Ligo丶

出处:https://www.cnblogs.com/Ligo-Z/

本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。

Unity Shader基础(1):基础的更多相关文章

  1. Unity Shader 基础(4) 由深度纹理重建坐标

    在PostImage中经常会用到物体本身的位置信息,但是Image Effect自身是不包含这些信息的,因为屏幕后处其实是使用特定的材质渲染一个刚好填满屏幕的四边形面片(四个角对应近剪裁面的四个角). ...

  2. 【Unity Shader】Shader基础

    目录 Chapter3 Unity Shader 基础 Chapter3 Unity Shader 基础 概述 在Unity需要材质(Material)与Unity Shader配合使用来达到满意的效 ...

  3. Unity Shader基础

    Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ...

  4. Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础

    来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 概述 总体来说,在Unity中我们需要配合使用材质和Unity Shader才能达 ...

  5. 第二章 Unity Shader基础

    [TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ...

  6. Unity Shader 基础

    推荐: https://www.cnblogs.com/nanwei/p/7277417.html 上面链接作者的整个系列都写的不错 https://www.cnblogs.com/nanwei/ca ...

  7. Unity3D学习(六):《Unity Shader入门精要》——Unity的基础光照

    前言 光学中,我们是用辐射度来量化光. 光照按照不同的散射方向分为:漫反射(diffuse)和高光反射(specular).高光反射描述物体是如何反射光线的,漫反射则表示有多少光线会被折射.吸收和散射 ...

  8. Unity Shader 基础(3) 获取深度纹理

    Unity提供了很多Image Effect效果,包含Global Fog.DOF.Boom.Blur.Edge Detection等等,这些效果里面都会使用到摄像机深度或者根据深度还原世界坐标实现各 ...

  9. Unity Shader 基础(1): RenderType & ReplacementShader

    很多Shader中都会定义RenderType这个类型,但是一直搞不明白到底是干嘛的,官方文档是这样结解释的:Rendering with Replaced Shaders Rendering wit ...

  10. Unity Shader入门精要学习笔记 - 第7章 基础纹理

    转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图“黏”在模型表面,逐纹素地控制模型的颜色. 在美术 ...

随机推荐

  1. 《图解HTTP》笔记1

    Web 是建立在 HTTP 协议上通信的. HTTP 通常被译为超文本传输协议,但这种译法并不严谨.严谨的译名应该为“超文本转移协议”. 通过发送请求获取服务器资源的 Web 浏览器等,都可称为客户端 ...

  2. Web缓存Cache、Application、Session与ViewState

    在ASP.NET中,有很多种保存信息的对象.例如:APPlication,Session,Cookie,ViewState和Cache等,那么它们有什么区别呢?每一种对象应用的环境是什么? 方法 信息 ...

  3. 反射基础 System.Reflection

    一.获取程序集Assembly 1.获取当前运行的程序集 System.Reflection.Assembly[] asm = AppDomain.CurrentDomain.GetAssemblie ...

  4. .Net优秀应用界面大PK!DevExpress年度大赛,群雄逐鹿花落谁家

    DevExpress 优秀界面图片火热征集中! 只要您晒出来,慧都就为您颁奖! 角逐前三,百度AI音箱.小米行李箱等惊喜大礼等您Pick! 活动时间:12月1日-12月31日 立即参与 活动详情 活动 ...

  5. 存储过程:SET Transaction Isolation Level Read语法的四种情况

    这几天一直在弄存储过程,现在在这里跟大伙共享下资料: SET Transaction Isolation Level Read UNCOMMITTED 使用这句东东呢可以分为四种情况,现在就在这里逐一 ...

  6. loaction.reload(false)和location.reload(true)的区别

    loaction.reload(false)和location.reload(true)有差别啊,一个是先判断页面有没修改,有的话就从服务器下载页面,没有就直接从缓存里拿(这个会提升响应性能)而把该方 ...

  7. sublime text 3 3126注册码

    —– BEGIN LICENSE —– Michael Barnes Single User License EA7E-821385 8A353C41 872A0D5C DF9B2950 AFF6F6 ...

  8. CF920C Swap Adjacent Elements 贪心

    我也不知道该说啥,水就是了~ code: #include <bits/stdc++.h> #define N 300004 #define setIO(s) freopen(s" ...

  9. NOIP考前总结

    最近出的锅比较多啊,我来总结一下吧 $1.$小心文件名/文件输入输出!别打错了!结束前十分钟一定要检查! $2.$开数组前要算好内存,不要开一个$1e8$或$1e4*1e4$这样的大数组,直接GG $ ...

  10. 为什么我在mysql的my.cnf下找不到bind-address

    在/etc/mysql/mysql.conf.d目录下的mysqld.cnf文件