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?


1 Answer 1


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.


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)

        #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;

    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
                #pragma target 3.0
                #pragma multi_compile __ _TERRAIN_NORMAL_MAP
        SubShader { // for sm2.0 targets

    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;

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .