Unity Shader 基础(1): RenderType & ReplacementShader
很多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类型
- Opaque: most of the shaders (Normal, Self Illuminated, Reflective, terrain shaders).
- Transparent: most semitransparent shaders (Transparent, Particle, Font, terrain additive pass shaders).
- TransparentCutout: masked transparency shaders (Transparent Cutout, two pass vegetation shaders).
- Background: Skybox shaders.
- Overlay: GUITexture, Halo, Flare shaders.
- TreeOpaque: terrain engine tree bark.
- TreeTransparentCutout: terrain engine tree leaves.
- TreeBillboard: terrain engine billboarded trees.
- Grass: terrain engine grass.
- GrassBillboard: terrain engine billboarded grass.
测试
- 随便写个两个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
		}
	}
}
- 另一个shader与之相似,修改名字为"RedShader", 同时修改RenderType为"transparent":
Shader "Unlit/RedShader"
{
	Properties
	{
		_Color("Color",Color) = (0,0,0,1)
	}
	SubShader
	{
		Tags { "RenderType"="transparent" }
		pass
		{}
	}
}
- 建议一个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;
			}
			...
		}
	}
}
- 写一个相机上的脚本,在启动时替换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为空,则输出为全黄色。
结论
- 不知道啥时候可以用到
引用
- unity 替换渲染 ( Rendering with Replaced Shaders )
- 官方文档
- 浅析Unity shader中RenderType的作用及_CameraDepthNormalsTexture
Unity Shader 基础(1): RenderType & ReplacementShader的更多相关文章
- Unity Shader基础
		Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ... 
- Unity Shader 基础(4) 由深度纹理重建坐标
		在PostImage中经常会用到物体本身的位置信息,但是Image Effect自身是不包含这些信息的,因为屏幕后处其实是使用特定的材质渲染一个刚好填满屏幕的四边形面片(四个角对应近剪裁面的四个角). ... 
- Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础
		来源作者:candycat http://blog.csdn.net/candycat1992/article/ 概述 总体来说,在Unity中我们需要配合使用材质和Unity Shader才能达 ... 
- 第二章 Unity Shader基础
		[TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ... 
- Unity Shader 基础(3) 获取深度纹理
		Unity提供了很多Image Effect效果,包含Global Fog.DOF.Boom.Blur.Edge Detection等等,这些效果里面都会使用到摄像机深度或者根据深度还原世界坐标实现各 ... 
- Unity Shader 基础
		推荐: https://www.cnblogs.com/nanwei/p/7277417.html 上面链接作者的整个系列都写的不错 https://www.cnblogs.com/nanwei/ca ... 
- Unity Shader基础(1):基础
		一.Shaderlab语法 1.给Shader起名字 Shader "Custom/MyShader" 这个名称会出现在材质选择使用的下拉列表里 2. Properties (属性 ... 
- Unity Shader 基础(2) Image Effect
		Unity中 Image Effect 是Post Processing的一种方,Unity自身也提供很多Effect效果供使用.Image Effect的使用官方文档做了很多介绍,这里重点Post ... 
- Unity Shader基础:编译指令
		UntiyShader中,编译指令分为两种: 1.顶点片元着色器(Vetex & Fragment Shader)使用的编译指令 2.表面着色器(Surface Shader)使用的编译指令 ... 
随机推荐
- Web笔记(二)Tomcat 使用总结
			Tomcat 介绍 Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaSe ... 
- C#计算字符串长度,汉字算两个字符
			在C#中的字符串类String中,有个Length属性表示字符串的长度,但该字段返回的是字符的个数,如果字符串中含有中文字符的话,一个汉字占用两个字符的长度,此时获取的长度就不够精确,当然也看具体业务 ... 
- nginx ssl证书
			server { listen ; server_name xxx.com; root "/home/www/website"; ssl on; ssl_certificate / ... 
- springMVC_06数据的处理
			一.提交数据的处理 *springmvc是单例的 1. 提交的域名称和处理方法的参数一致即可 提交的数据 处理方法 2.如果域名城和参数名不一致,在方法内加上域名称eg.(RequestParam(“ ... 
- Java学习笔记之——继承
			父类(基类):动物 子类:猫.狗.狼.老虎 如果子类继承于父类,则会自动拥有父类的所有非私有属性和方法,不会继承构造方法 父类和子类要满足一种关系:子类是父类的一种 Java中只支持单继承:一个子类只 ... 
- Spring 与 SpringMVC (或许不完整)
			一.什么是Spring Spring是一个开源的控制反转和面向切面(AOP)的容器框架.它的主要目的是使现有技术更加易用,推荐编码最佳实现,从而简化企业的开发. 提:使用Spring的好处有以下几项: ... 
- 数据库sql语句常见面试题
			转载:本文转载自:https://blog.csdn.net/woshinidedege/article/details/78659202 一.有以下几张表及表结构Student(Sid,Sname, ... 
- mysql给root开启远程访问权限
			MySql-Server 出于安全方面考虑默认只允许本机(localhost, 127.0.0.1)来连接访问. !!!所以必须给root修改可以远程访问的权限 1.在连接服务器后,操作mysql系统 ... 
- js正整数正则表达式
			function testNumber(){ var yourinputValue=$("#yourinputId").val(); var reg = /^[1-9]\d*$/; ... 
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
			题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ... 
