タイトルのとおりなのですが、分かりにくいと思うので詳しく書きます。
2つシェーダーを用意し、窓となるオブジェクトにシェーダーを適用。
窓を通してオブジェクトを見た時、もう一つのシェーダーが適用されたオブジェクトは見えるが、それ以外のオブジェクトは見えない(すべて透過されスカイボックスだけが見える状態)。
これを実現することはできますか?どんな機能を使えば実現できますか?
カメラ → 窓シェーダー → 被窓シェーダ(見える)
カメラ → 窓シェーダー → 他のすべてのシェーダ(見えない)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
以前「Unity Universal RP における影のみの描画とレイヤーを用いた透過」といったご質問を見かけたのですが、あちらと同様の作戦が使えるかもしれません。
まず、実験用シーンを下図のようにセットアップしました。
赤いボールが特殊ガラスでも透けないオブジェクトのつもりです。窓ガラスが通常の透明マテリアルだと、メインカメラの映像は下図のように見えます。
この赤ボールにはレイヤーを指定しておき(仮に「AntiMagicGlass」としました)、
メインカメラを複製してサブカメラとし、カリングマスクはAntiMagicGlassのみ、ターゲットはレンダーテクスチャにしておきます。
サブカメラのAudio Listenerは不要なため削除し、メインカメラに追従させるためメインカメラの子オブジェクトとしました。
このサブカメラでシーンを見ると、下図のように背景と赤ボールだけが映るはずですので、これを窓ガラス表面に投影してやろうというわけです。
窓に使う特殊ガラスのコードは下記のようにし、
ShaderLab
1Shader "Custom/MagicGlass" 2{ 3 Properties 4 { 5 _Color ("Color", Color) = (1,1,1,1) 6 _MainTex ("Albedo (RGB)", 2D) = "white" {} 7 _Glossiness ("Smoothness", Range(0,1)) = 0.5 8 _Metallic ("Metallic", Range(0,1)) = 0.0 9 _AntiMagicGlassTex ("AntiMagicGlass", 2D) = "white" {} 10 } 11 SubShader 12 { 13 Tags { "RenderType"="Opaque" } 14 LOD 200 15 16 CGPROGRAM 17 #pragma surface surf Standard fullforwardshadows 18 #pragma target 3.0 19 20 sampler2D _MainTex; 21 sampler2D _AntiMagicGlassTex; 22 23 struct Input 24 { 25 float2 uv_MainTex; 26 float4 screenPos; // スクリーン座標を追加 27 }; 28 29 half _Glossiness; 30 half _Metallic; 31 fixed4 _Color; 32 33 void surf(Input IN, inout SurfaceOutputStandard o) 34 { 35 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 36 37 // アルベドをアルファに応じて弱める 38 o.Albedo = c.rgb * c.a; 39 o.Metallic = _Metallic; 40 o.Smoothness = _Glossiness; 41 o.Alpha = 1.0; 42 43 // ゼロ除算警告を回避するための細工 44 IN.screenPos.w = max(IN.screenPos.w, 0.001); 45 46 // アルベドを弱めた代わりに、エミッションとして_AntiMagicGlassTexの色を乗せる 47 o.Emission = tex2Dproj(_AntiMagicGlassTex, IN.screenPos).rgb * (1.0 - c.a); 48 } 49 ENDCG 50 } 51 FallBack "Diffuse" 52}
マテリアルの色を窓ガラスっぽく設定、AntiMagicGlassにはサブカメラのターゲットに設定したレンダーテクスチャをセットしておきます。
この特殊ガラスマテリアルを使ったところ、赤ボール以外消えて見えました(実際は不透明オブジェクトの表面に映像が映っているというだけのことではありますが...)。
投稿2020/05/08 05:46
総合スコア10811
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/08 08:19