1.格式

Shader "Custom/MyShader"				//命名+右键创建shader路径
{
//属性必须在代码里声明才能使用
Properties{ //属性,会出现在inspector面板
_MainTex("Main Tex",2D) = "white"{} //名称("面板显示名称",数据类型) = 初始化
}
//针对不同显卡可以有不同subshader,对应不同品质的渲染
SubShader{
Tags{"LightMode"="ForwardBase"} //tags,定义渲染的设置
ZWrite Off //RenderSetup,渲染设置
Pass{ //通道pass,一个subshader可以有多个pass
Name = "MyPass" //pass可以命名,在其他subshader引用UsePass大写
CGPROGRAM //开始CG代码-和ENDCG成对
#pragma vertex vert //定义渲染函数,顶点
#pragma fragment frag //片元
#pragma surface surf Lambert //表面
#include "Lighting.cginc" //包含方法库 sample2D _MainTex; //声明变量
float4 _MainTex_ST; struct a2v //自定义结构体
{
float4 vertex : POSITION; //变量类型 变量名:语义说明(语言规定)
float3 normal: NORMAL;
} v2f vert (appdata v) //函数体
{ v2f o;
return o;
}
ENDCG
}
}
SubShader{...}
FallBack "Diffuse" //以上subshader显卡都不支持,默认返回漫反射
}

uniform修饰词;

Name = "MyPass"

——UsePass "Unlit/Outline/MYPASS" //必须大写

——GrapPass //抓取屏幕结果存储在一张纹理中

2.属性

属性对应的变量类型,声明变量使用;属性中类型和变量中类型不一定一致;

3.语义

SV_开头表示System-Value——系统定义的语义变量;

4.Tags

1)SubShader可用

Queue——渲染队列

RenderType——渲染类型

(1)”Opaque”:绝大部分不透明的物体都使用这个;

(2)”Transparent”:绝大部分透明的物体、包括粒子特效都使用这个;

(3)”Background”:天空盒都使用这个;

(4)”Overlay”:GUI、镜头光晕都使用这个;

(5)还有其他可参考Rendering with Replaced Shaders;用户也可以定义任意自己的RenderType字符串;

(6)”TransparentCutout“:透明测试使用;

IgnoreProjector = “True”——忽略投影器影响,AlphaTest和AlphaBlend使用;

ForceNoShadowCasting = “True”——表示不接受阴影;

2)Pass可用

"LightMode"="ForwardBase"

5.RenderSetup

1)Cull剔除

Cull Front/Back/Off

2)深度测试和写入

ZWrite Off

ZTest Off

3)Blend——透明混合设置

BlendOp

Blend效果

6.方法

UnityCG.cginc常用结构体

书写建议:

1.移动平台的shader尽可能使用精度低的变量:fixed-half-float

2.错误:片元中大量计算导致寄存器不足——提高shaderTarget等级

3.尽量不要使用分支语句

4.不要除以0

Unity——ShaderLab基础的更多相关文章

  1. Unity ShaderLab学习总结

    http://www.jianshu.com/p/7b9498e58659 Unity ShaderLab学习总结 Why Bothers? 为什么已经有ShaderForge这种可视化Shader编 ...

  2. Unity3D ShaderLab 基础的高光实现

    Unity3D ShaderLab 基础的高光实现 关于高光: 在一个物体表面的高光属性就是为了描述它是如何表现光泽.这种类型的效果在着色器的世界中通常称为视点相关效果. 之所以这样说,是因为为了实现 ...

  3. Unity Shader基础

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

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

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

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

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

  6. Unity Shaderlab: Object Outlines 转

    转 https://willweissman.wordpress.com/tutorials/shaders/unity-shaderlab-object-outlines/ Unity Shader ...

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

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

  8. 第二章 Unity Shader基础

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

  9. Unity UI 基础【译】

    https://unity3d.com/cn/learn/tutorials/topics/best-practices/fundamentals-unity-ui?playlist=30089 理解 ...

随机推荐

  1. JVM——垃圾收集算法及垃圾回收器

    一.垃圾回收算法 1.标记-清除算法 1)工作流程 算法分为"标记"和"清除"阶段:首先标记出所有需要回收的对象(标记阶段),在标记完成后统一回收所有被标记的对 ...

  2. 01 nodejs MVC gulp 项目搭建

    文本内容 使用generator-express创建nodejs MVC DEMO 使用gulp实时编译项目 npm安装二进制包,无须再编译wget https://nodejs.org/dist/v ...

  3. Android Bitmap 全面解析(一)加载大尺寸图片

    压缩原因:1.imageview大小如果是200*300那么加载个2000*3000的图片到内存中显然是浪费可耻滴行为;2.最重要的是图片过大时直接加载原图会造成OOM异常(out of memory ...

  4. RAC中常见的高级用法-过滤

    filter      过滤信号,使用它可以获取满足条件的信号. - (void)filter { //只有当我们文本框内容长度大于5才想要获取文本框的内容 [[_passWord.rac_textS ...

  5. 【Java 8】Optional 使用

    一.前言 如果要给 Java 所有异常弄个榜单,我会选择将 NullPointerException 放在榜首.这个异常潜伏在代码中,就像个遥控炸弹,不知道什么时候这个按钮会被突然按下(传入 null ...

  6. SSM框架整合后使用pagehelper实现分页功能

    一.导入pagehelper-5.1.10.jar和jsqlparser-3.1.jar两个jar包 二.配置pagehelper 2.1 在mybatis配置文件中配置 <plugins> ...

  7. Jenkins获取jar包的快照号

    目录 一.简介 二.脚本 一.简介 主要用于打jar包的工程,显示快照包的名字.当jar打包完成后,会在target目录中,截取快照名. 二.脚本 1.脚本return-version.sh #!/b ...

  8. 转:android相对布局

    android相对布局 Activity布局初步 - 相对布局 1. 相对布局的基本概念 一个控件的位置它决定于它和其他控件的关系,好处:比较灵活:缺点:掌握比较复杂. 2. 相对布局常用属性介绍 这 ...

  9. [BSidesCF 2019]Runit(细心)

    这道题目并不难,甚至很简单,通过这个文章提醒自己一定要细心 例行检查我就不放了 首先程序开启了nx这个保护,但是首先buf却鲜卑mmap映射了 然后程序又调用了buf 所以这道题直接上传shellco ...

  10. AT1381 エンド・オブ・ビギニング 题解

    Content 有 \(n\) 组询问,每组询问给定三个字符串 \(s_1,s_2,s_3\). 如果 \(s_1\) 是 BEGINNING,输出 \(s_3\) 的第一个字符. 如果 \(s_1\ ...