6
\$\begingroup\$

After rendering onto a RenderTexture, is there a way to make areas of the RenderTrexture transparent again? I.e. cutting out a transparent window to see what's behind the RenderTexture?

The scene's setup looks like this:

  1. RenderTexture with Color Format set to ARGB32.
  2. Dedicated camera to render onto the RenderTexture.
    • Clear Flags is set to Solid Color
    • Background is set to a color with 0x00 Alpha.
  3. The RenderTexture is mapped onto a GUI Panel using a RawImage component.

This works pretty well. The content of the RenderTexture is composed every frame and shown at the GUI Panel. The only difficulty is how to delete/clear parts of the RenderTexture to expose what's behind it.

Ideal would be using an image as mask - where every opaque (or transparent - either one is fine) pixel from the mask gets deleted (fully transparent) on the RenderTexture. Do you have any ideas how this can be done?

\$\endgroup\$
1
\$\begingroup\$

I'd create a depth mask for that.

Follow this tutorial, i've used this one in the past and it would produce your desired result.

https://www.youtube.com/watch?v=uxXEV91xsSc

Code from the video (credits for video: https://www.blog.radiator.debacle.us/2012/08/how-to-dig-holes-in-unity3d-terrains.html)

Custom Depth Shader

//Place onto the object you want to see things through i.e. window / hole


    Shader "Custom/CustomDepthShader" {
      SubShader {
        Tags {"Queue" = "Geometry+10" }
        Lighting Off
        ZTest LEqual
        ZWrite On
        ColorMask 0
        Pass {}
      }
    }

Custom Depth Shader Terrain

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
// Unity Standard terrain shader + custom "Queue" = "Geometry+100"

Shader "Custom/CustomDepthShader(Terrain)" {
    Properties {
        [HideInInspector] _Control ("Control (RGBA)", 2D) = "red" {}
        [HideInInspector] _Splat3 ("Layer 3 (A)", 2D) = "white" {}
        [HideInInspector] _Splat2 ("Layer 2 (B)", 2D) = "white" {}
        [HideInInspector] _Splat1 ("Layer 1 (G)", 2D) = "white" {}
        [HideInInspector] _Splat0 ("Layer 0 (R)", 2D) = "white" {}
        [HideInInspector] _Normal3 ("Normal 3 (A)", 2D) = "bump" {}
        [HideInInspector] _Normal2 ("Normal 2 (B)", 2D) = "bump" {}
        [HideInInspector] _Normal1 ("Normal 1 (G)", 2D) = "bump" {}
        [HideInInspector] _Normal0 ("Normal 0 (R)", 2D) = "bump" {}
        // used in fallback on old cards & base map
        [HideInInspector] _MainTex ("BaseMap (RGB)", 2D) = "white" {}
        [HideInInspector] _Color ("Main Color", Color) = (1,1,1,1)
    }

    CGINCLUDE
        #pragma surface surf Lambert vertex:SplatmapVert finalcolor:SplatmapFinalColor finalprepass:SplatmapFinalPrepass finalgbuffer:SplatmapFinalGBuffer noinstancing
        #pragma multi_compile_fog
        #include "TerrainSplatmapCommon.cginc"

        void surf(Input IN, inout SurfaceOutput o)
        {
            half4 splat_control;
            half weight;
            fixed4 mixedDiffuse;
            SplatmapMix(IN, splat_control, weight, mixedDiffuse, o.Normal);
            o.Albedo = mixedDiffuse.rgb;
            o.Alpha = weight;
        }
    ENDCG

    Category {
        Tags {
            "Queue" = "Geometry+100"
            "RenderType" = "Opaque"
        }
        // TODO: Seems like "#pragma target 3.0 _TERRAIN_NORMAL_MAP" can't fallback correctly on less capable devices?
        // Use two sub-shaders to simulate different features for different targets and still fallback correctly.
        SubShader { // for sm3.0+ targets
            CGPROGRAM
                #pragma target 3.0
                #pragma multi_compile __ _TERRAIN_NORMAL_MAP
            ENDCG
        }
        SubShader { // for sm2.0 targets
            CGPROGRAM
            ENDCG
        }
    }

    Dependency "AddPassShader" = "Hidden/TerrainEngine/Splatmap/Diffuse-AddPass"
    Dependency "BaseMapShader" = "Diffuse"
    Dependency "Details0"      = "Hidden/TerrainEngine/Details/Vertexlit"
    Dependency "Details1"      = "Hidden/TerrainEngine/Details/WavingDoublePass"
    Dependency "Details2"      = "Hidden/TerrainEngine/Details/BillboardWavingDoublePass"
    Dependency "Tree0"         = "Hidden/TerrainEngine/BillboardTree"

    Fallback "Diffuse"
}

Hide Object

//Add to any object you want to hide when looking through the depthmask (DOES NOT WORK ON TERRAIN, USE CUSTOM TERRAIN SHADER)

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

public class HideObject : MonoBehaviour {

    void  Start (){
        // get all renderers in this object and its children:
        var renders = GetComponentsInChildren<Renderer>();
        foreach(Renderer rendr in renders){
            rendr.material.renderQueue = 3000;
        }
    }
}
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.