新建一个shader,名为MyShader1内容如下:

1、_MainTex 为变量名

2、“Base (RGB)”表示在unity编辑面板中显示的名字,可以定义为中文

3、2D 表示变量的类型

4、white 表示初始值(默认值),默认为白色

变量名建议下划线开头

我们也来定义几个变量试试:

_My2D ("Base (RGB)", 2D) = "white" {}
_myfloat("浮点数",float)=0.3
_myRange("数值范围",Range(1,10))=3
_MyVector("向量",Vector)=(1,1,1,1)
_MyColor("颜色",Color)=(22,55,66,1)
_MyRect("矩形",Rect)="red" {}

Shader数值类型:

大家尽可能使用占内存小的fixed类型,优化性能,但是某些显卡,特别是手机上对fixed的支持不太好,所以要根据具体的情况来使用!

shader的三种形式,也就是shader的三种写法

Unity中所有渲染都使用着色器完成

unity的shaderlab对cg的程序进行了一个封装,封装的目的是让我们编写脚本的人能够更快的上手,更简单的去编写,用更简洁的代码去实现一个功能,

这里分为三种写法,如下:

1、顶点和片段着色器

2、表面着色器

3、固定功能着色器

固定功能着色器

此着色器写法是非常简单的,但是功能少,Unity官方是不建议大家用这个写法的

优势是能够用在比较陈旧古老的硬件上,在其他着色器的功能不支持之后,才去考虑用固定着色器。

顶点和片段着色器

功能最强大、最自由的形态,但是要编写的代码自然就会增多

特征是在Pass里出现CGPROGRAM和ENDCG块

Pass:通道    Name为通道名称

float2:相当于一个数组,包含两个float值,

float3:包含三个float值,同理float4......

pos为变量名

POSITION为语义,通俗来讲,因为cg里面有很多东西,比如一个颜色color,它是rgba,所以他是float4类型的数值,表示四个数,还有比如说向量,一个坐标(x,y,z),另外再加上一个方向向量,那么它也是一个float4类型的数值,float4不仅可以表示为颜色color,还可以表示为向量,以及UV等,那么为了表明我们声明的这个float4类型的变量是干嘛的,是用来表示颜色的还是向量的?为了说明它的作用,所以采用了语义来描述

显卡会首先调用顶点函数,通过计算得到一个v2f类型的值,这个值再交给片段函数,片段函数返回的是一个语义为Color的half4类型的值

appdata_base是来自于我们引入的包UnityCG.cginc里面定义的!UnityCG.cginc路径大概在Unity\Editor\Data\CGIncludes\下

表面着色器

Unity推荐使用的一种写法,当我们在unity里面create一个shader的时候,unity默认给我们创建的就是表面着色器

因为表面着色器自身会编译为多个通道,所以我们不能为它添加Pass通道,手动添加就会报错!

subshader、fallback、Pass LOD

一个subshader里面至少要包含一个通道Pass(表面着色器除外,因为它自身会编译为多个通道)

由于显卡兼容性存在偏差,如果存在多个subshader,默认情况下,是先执行第一个subshader,如果可以执行的话就执行它

如果第一个sunshader由于兼容性或者其他的问题不可以执行的话,那么会按顺序执行下面的subshader,如果一直到最后一个subshader也不能执行,

那么就使用Fallback指定的shader(diffuse)来执行

Pass的意义在于多次渲染,如果你有一个pass,那么着色器只会被调用一次,

如果你有多个Pass的话,那么就相当于执行多次subshader了,这就叫双通道或者多通道

在编写shader的时候,Pass要尽量的少,每多一个pass,那么dc就会多一次!

但是在实际运用的有些情况当中,是有可能要用到多个pass的,等具体情况具体分析

如果LOD设置为250的话,那么小于等于250的值对应的效果会被显示,而大于250的效果可能就不显示了!

tags

渲染序列Queue:

在场景里面,摄像头看到的物体是有先后关系的,那么它的渲染也是有个顺序的,它是有一个值可以设置的,值越小越先绘制,越大越后绘制(显示在最前面)

可以理解为权重越大,离摄像机越近!

这里定义了一些默认值,例如Background为1000,Geometry为2000等

自己可以定义任意值,但是表达式必须要包含某个默认值,例如"Queue"="1200"直接赋值为一个数字是错误的,会报错的!

只能这样:"Queue"="Geometry+5"

我们来做一个例子:场景中放一个cube盒子,和一个sphere球,把球放在盒子的后面,我们通过操作两者的shader来让盒子后面的球显示在最前面,

根据上面对渲染序列的介绍,那么正确的做法应该就是把球的Queue的值设的比盒子的大就可以了,可是并没有达到预期的效果,如下,盒子还是在最前面显示:

这里就涉及到了一个知识点了:深度缓存,我们只要关闭盒子的深度缓存就可以了(球的深度缓存关不关不受影响)!

默认绘制优先级是以深度缓存进行处理的,

深度缓存可以理解为,摆放物体距摄像机的远近,距离摄像机近的物体越后渲染,权重越大,显示越靠前,反之,显示越靠后!

Zwrite off:关闭深度缓存, 在渲染时,每个模型都有一个深度的,现在有可能球的深度是1,盒子是2,深度越大,绘制在越前面,

所以造成这种情况,只要关闭深度缓存,就会应用我们指定的渲染序列了!

Tags { Queue="Geometry+5" RenderType=Opaque }
LOD
Zwrite off

效果图:

如果有这样一个需求:即使被其他物体遮住,也要显示在这些物体的最前面,那么除了调整自己的渲染序列Queue值
大于那些在它前面的物体的Queue值,还要把遮住它的那些物体的深度缓存给关闭就可以了!
如果你不把那么遮挡你的物体的深度缓存给关闭了,那么即使你的渲染序列大于他们,也是没有用的!
关闭深度缓存的目的就是把被自己挡住的并且渲染序列大于自己的那些物体给去除遮挡

2、shader基本语法、变量类型、shader的三种形式、subshader、fallback、Pass LOD、tags的更多相关文章

  1. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)  ...

  2. JS 中对变量类型判断的几种方式

    文章整理搬运,出处不详,如有侵犯,请联系~   数据类型判断和数据类型转换代码工具 在 JS 中,有 5 种基本数据类型和 1 种复杂数据类型,基本数据类型有:Undefined, Null, Boo ...

  3. Java语言支持的变量类型有哪几种

    Java语言支持的变量类型有: 类变量:独立于方法之外的变量,用 static 修饰. 实例变量:独立于方法之外的变量,不过没有 static 修饰. 局部变量:类的方法中的变量. 实例: publi ...

  4. 【环境变量】Linux 下三种方式设置环境变量与获取环境变量

    1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错误. 2.那么什么是环境变 ...

  5. linux 环境变量PATH路径的三种方法

    转:http://www.jb51.net/LINUXjishu/150167.html 总结:修改1.#PATH=$PATH:/etc/apache/bin  或者#vi /etc/profile ...

  6. Linux系统下修改环境变量PATH路径的三种方法

    这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...

  7. 【环境变量】Linux 下三种方式设置环境变量

    1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错误. 2.那么什么是环境变 ...

  8. js函数只执行一次,函数重写,变量控制与闭包三种做法

    一.情景需求 调用后台接口需要附带token信息,那么在每个请求的头部添加token的做法就不太优雅了:一个网站请求100次,那就得写添加100次token,假设某天接口有所变动,改起来就十分麻烦了. ...

  9. Java变量类型识别的3种方式

    内容导览 反射方式,成员变量的类型判断 isInstance用法 利用泛型识别类型 测试类: package com.cxyapi.oo; import java.util.Date; import ...

随机推荐

  1. C#后台unxi时间戳转换为前台JS时间的方法

    后台返回的时间是一个格式为 /Date(1530153274362)/ 的unxi时间戳前台转换代码:var matchResult = data.match(/(\d+)/);if (matchRe ...

  2. 使用selenium grid的hub做分发,且可查看分发后的服务器IP地址

    背景:借助selenium 的grid做分布式运行,进行分发任务,(目前不做多浏览器的操作,只对谷歌浏览器进行操作) 目前在A服务器(http://10.40.6.24:4444)上注册了一个hub, ...

  3. React的安装

    创建: 2019/05/01 完成: 2019/05/01 create-react-app  学习及创建单页app npx create-react-app my-app cd my-app npm ...

  4. 【转】普及一下ARM和X86的区别,鉴于ATOM已经入驻手机,AMD也会…

    这里简单来谈一下,ARM和X86之间为什么不太具有可比性的问题.要搞清楚这个问题首先要明白什么是架构,之前也有很多人提到了架构不同,但架构是什么意思?它是一个比较抽象的概念,不太容易用几句话就解释清楚 ...

  5. 中小学信息学奥林匹克竞赛-理论知识考点--ASCII

    ASCII表说白了就是一张表. 表中记录着:字符 和 数字 的对应关系.比如:字符0对应的ASCII码是48,A对应的是65,a对应的是97. 只要记住这三个,其它的数字,大写,小写字母的ASCII码 ...

  6. Ext4.2 select 和 query 区别与联系

    Ext.query和Ext.select的作用是一致的,同是根据CSS选择符查找出一个或多个元素.区别在于返回类型上.分别是:query方法返回的是JavaScript标准的数组类型:select方法 ...

  7. Java Web入门经典扫描版

    全书共分4篇19章,其中,第一篇为“起步篇”,主要包括开启JavaWeb之门.不可不知的客户端应用技术.驾驭JavaWeb开发环境.JavaWeb开发必修课之JSP语法等内容:第二篇为“核心篇”,主要 ...

  8. orale 10g和11g中的自动统计任务

    orale 10g和11g中的自动统计任务 博客分类:  数据库相关/oracle   1)  先来看下oracle 10g中的自动统计任务的问题. 从Oracle Database 10g开始,Or ...

  9. dicom和dicomdir

    转载http://blog.sina.com.cn/s/blog_4bce5f4b01019ix5.html DICOM 文件内容在 Part 3 DICOM IOD 里定义.CT, MR, CR, ...

  10. springBoot支持PageHelp插件使用学习笔记

    首先在springboot项目的maven中加入依赖(版本可能需要自己选择合适的) <dependency> <groupId>com.github.pagehelper< ...