zoukankan      html  css  js  c++  java
  • 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类型

    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");
    	}
    }
    

    执行前
    mark
    执行后
    mark

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

    结论

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

    引用

    1. unity 替换渲染 ( Rendering with Replaced Shaders )
    2. 官方文档
    3. 浅析Unity shader中RenderType的作用及_CameraDepthNormalsTexture
  • 相关阅读:
    [转]子网掩码与子网划分
    子网划分的两个例子
    浅谈算法和数据结构系列汇总(转)
    拓扑排序和关键路径
    生成树及最小生成树
    图的遍历
    单选按钮的显示与隐藏列项
    CSS3实现鼠标移动到图片上图片变大
    优酷的视频地址获取接口
    提交按钮ajax方式
  • 原文地址:https://www.cnblogs.com/zsb517/p/6637792.html
Copyright © 2011-2022 走看看