简单控制节点透明度

227 阅读1分钟
  • 问题 控制一个节点整个的透明度
  • 用刚学到的渲染纹理
  • 对想要控制透明的节点 添加layer 在相机上cull
  • C#
using UnityEngine;
using System.Collections;

public class PostEffectsFade : PostEffectsBase {

    public Shader fadeShader;
    private Material fadeMat = null;

    public Material material {
        get {
            fadeMat = CheckShaderAndCreateMaterial(fadeShader, fadeMat);
            return fadeMat;
        }
    }

    [Range(0F, 1F)]
    public float m_fade;
    
    
    void OnRenderImage(RenderTexture src, RenderTexture dest) {
        if (material != null) {
            material.SetFloat("_Fade", m_fade);
            float a = material.GetFloat("_Fade");
            Debug.Log("fade:" + a);

            Graphics.Blit(src, dest, material);
        } else {
            Graphics.Blit(src, dest);
        }
    }
}

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System.Collections.Generic;

[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]
public class PostEffectsBase : MonoBehaviour {

	// Called when start
	protected void CheckResources() {
		bool isSupported = CheckSupport();
		
		if (isSupported == false) {
			NotSupported();
		}
        //UnityEngine.UI.Button b = new UnityEngine.UI.Button();
        //b.onClick.RemoveAllListeners
	}

	// Called in CheckResources to check support on this platform
	protected bool CheckSupport() {
		if (SystemInfo.supportsImageEffects == false || SystemInfo.supportsRenderTextures == false) {
			Debug.LogWarning("This platform does not support image effects or render textures.");
			return false;
		}
		return true;
	}

	// Called when the platform doesn't support this effect
	protected void NotSupported() {
		enabled = false;
	}
	
	protected void Start() {
		CheckResources();

    }

	// Called when need to create the material used by this effect
	protected Material CheckShaderAndCreateMaterial(Shader shader, Material material) {
		if (shader == null) {
			return null;
		}
		
		if (shader.isSupported && material && material.shader == shader)
			return material;
		
		if (!shader.isSupported) {
			return null;
		}
		else {
			material = new Material(shader);
			material.hideFlags = HideFlags.DontSave;
			if (material)
				return material;
			else 
				return null;
		}
	}
}
  • shader
Shader "Custom/TestFade" {
	Properties {
		_MainTex("Base (RGB)",2D) = "white" {}
		_Fade("fade",Range(0,1)) = 1.0
	}
	SubShader {
		// We must be tranparent,so other objects are drawn before this one
		Tags { "RenderType"="Opaque" "Queue"="Transparent"}
		Pass {
			Tags { "LightMode" = "forwardBase" }

			Blend SrcAlpha OneMinusSrcAlpha

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			#include "Lighting.cginc"

			fixed _Fade;
			sampler2D _MainTex;

			struct v2f {
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
			};

			v2f vert(appdata_img v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.texcoord;
				return o;
			}

			fixed4 frag(v2f i) : SV_Target {
				fixed4 color = tex2D(_MainTex,i.uv);
				return fixed4(color.r,color.g,color.b, _Fade);
			}

			
			ENDCG
		}
	}
	Fallback Off
}
  • 发现选了depth only之后还是会渲染全部 达不到要求 看看后面怎么解决