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

Rendering with Replaced Shaders

shader通过camera中 Camera.RenderWithShader 和 Camera.SetReplacementShader实现替换功能,这两个方法都接受两个参数:Shader和replacementTag ,根据情况:

  • replacementTag 为空,场景中所有物体都会使用replacement shader进行渲染
  • replacementTag 不为空,如果物体不存在tag则不进行渲染。
  • replacementTag 不为空,如果物体shgader中存在、与之placement shader中相同的tag',则使用placement shader中对应subshader进行渲染,否则不渲染。

RenderType类型

  1. Opaque: most of the shaders (Normal, Self Illuminated, Reflective, terrain shaders).
  2. Transparent: most semitransparent shaders (Transparent, Particle, Font, terrain additive pass shaders).
  3. TransparentCutout: masked transparency shaders (Transparent Cutout, two pass vegetation shaders).
  4. Background: Skybox shaders.
  5. Overlay: GUITexture, Halo, Flare shaders.
  6. TreeOpaque: terrain engine tree bark.
  7. TreeTransparentCutout: terrain engine tree leaves.
  8. TreeBillboard: terrain engine billboarded trees.
  9. Grass: terrain engine grass.
  10. GrassBillboard: terrain engine billboarded grass.

测试

  1. 随便写个两个shader,建立对应的材质:
Shader "Unlit/BlueShader"
{
Properties
{
_Color("Color",Color) = (0,0,0,1)
}
SubShader
{
Tags { "RenderType"="transparent" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {float4 vertex : POSITION;}; struct v2f{
float4 vertex : SV_POSITION;
}; fixed4 _Color ; v2f vert (appdata v){
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);return o;
} fixed4 frag (v2f i) : SV_Target{
fixed4 col = _Color;return col;
}
ENDCG
}
}
}
  1. 另一个shader与之相似,修改名字为"RedShader", 同时修改RenderType为"transparent":
Shader "Unlit/RedShader"
{
Properties
{
_Color("Color",Color) = (0,0,0,1)
}
SubShader
{
Tags { "RenderType"="transparent" }
pass
{}
}
}
  1. 建议一个Replacement shader,和rendshader相似,并将输出颜色修改为固定黄色。之修改下名字:
Shader "Unlit/ReplacementShader"
{
Properties
{
_Color("Color",Color) = (0,0,0,1)
}
SubShader
{
Tags { "RenderType"="transparent" }
pass
{
...
//输出为黄色,如果替换了输出为黄色
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = fixed4(1,1,0,0);
return col;
}
...
}
}
}
  1. 写一个相机上的脚本,在启动时替换shader
public class ReplaceMent : MonoBehaviour {

	public Shader rpShader;
// Use this for initialization
void Start ()
{
//全部替换渲染
//GetComponent<Camera> ().SetReplacementShader(rpShader,"");
//RenderType="rpShader中RenderType"的sunshader进行渲染,
GetComponent<Camera> ().SetReplacementShader(rpShader,"RenderType");
}
}

执行前



执行后

如果在SetReplacementShader函数中tag为空,则输出为全黄色。

结论

  1. 不知道啥时候可以用到

引用

  1. unity 替换渲染 ( Rendering with Replaced Shaders )
  2. 官方文档
  3. 浅析Unity shader中RenderType的作用及_CameraDepthNormalsTexture

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

  1. Unity Shader基础

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

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

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

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

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

  4. 第二章 Unity Shader基础

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

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

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

  6. Unity Shader 基础

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

  7. Unity Shader基础(1):基础

    一.Shaderlab语法 1.给Shader起名字 Shader "Custom/MyShader" 这个名称会出现在材质选择使用的下拉列表里 2. Properties (属性 ...

  8. Unity Shader 基础(2) Image Effect

    Unity中 Image Effect 是Post Processing的一种方,Unity自身也提供很多Effect效果供使用.Image Effect的使用官方文档做了很多介绍,这里重点Post ...

  9. Unity Shader基础:编译指令

    UntiyShader中,编译指令分为两种: 1.顶点片元着色器(Vetex & Fragment Shader)使用的编译指令 2.表面着色器(Surface Shader)使用的编译指令 ...

随机推荐

  1. Redis主从复制、多实例、高可用(三)--技术流ken

    Redis主从复制 在开始实现redis的高可用之前,首先来学习一下如何实现redis的主从复制,毕竟高可用也会依赖主从复制的技术. Redis的主从复制,可以实现一个主节点master可以有多个从节 ...

  2. does not support SSL connections

    语言:C# 开发工具:Visual Studio 2017 问题场景介绍: nuget引用的MySql.Data版本是6.10.5,MySQL的数据库连接串如下: Server=xxx;Databas ...

  3. ife2018 零基础学院 day 3

    ife2018 零基础学院 第三天:让简历有点色彩 什么是CSS,CSS是如何工作的! 摘自CSS如何工作 什么是CSS CSS是一种用于向用户指定文档如何呈现的语言 - 它们如何被指定样式.布局等. ...

  4. [转]Laravel - Where null and Where not null eloquent query example

    本文转自: https://hdtuto.com/article/laravel-where-null-and-where-not-null-eloquent-query-example- if yo ...

  5. TypeError: value.getTime is not a function (elementUI报错转载 )

    "TypeError: value.getTime is not a function" 2018年07月02日 16:41:24 leeleejoker 阅读数:2091 标签: ...

  6. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  7. 异常: Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ResourceManager: NodeManager from localhost doesn't satisfy minimum allocations, Sending SHUTDOWN s

    异常: Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ...

  8. 为什么越来越少的人用jQuery

    摘要:JQuery该退役了. 原文:为什么越来越少的人用jQuery 作者:Lemonade Fundebug经授权转载,版权归原作者所有. 最早期的开发,大多都使用jQuery,它给我们带来了很多的 ...

  9. 5; XHTML图像

    1.背景图案的设置 2.将图片插入到网页中去 3.用图像作为超链接 4.使用工具建立地图索引 5.切片索引 6.为网站添加图标 5.1 背景图案的设置 格式:<body background=” ...

  10. 1970年// iPhone “变砖”后可继续正常使用的解决方案

    0.解决方案 说话先说重点,“变砖”后的iphone怎么正常使用. 拆开后盖,给电源和处理器之间断下电就OK了. 1.事件来源 对于iPhone和iPad,把时间手动设置到1970年5月以前会出现“变 ...