7
\$\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\$
2
  • \$\begingroup\$ Sounds like you should be working in shaders? \$\endgroup\$ Commented Mar 4, 2018 at 15:40
  • 1
    \$\begingroup\$ Doesn't the Unity UI system have a built in masking capability? \$\endgroup\$ Commented Mar 4, 2018 at 16:16

1 Answer 1

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\$
0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.