質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

4147閲覧

Unityのシェーダーで、指定したシェーダーだけ描画するシステムを作りたい。

Avent

総合スコア47

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/05/08 03:08

タイトルのとおりなのですが、分かりにくいと思うので詳しく書きます。
2つシェーダーを用意し、窓となるオブジェクトにシェーダーを適用。
窓を通してオブジェクトを見た時、もう一つのシェーダーが適用されたオブジェクトは見えるが、それ以外のオブジェクトは見えない(すべて透過されスカイボックスだけが見える状態)。
これを実現することはできますか?どんな機能を使えば実現できますか?

カメラ → 窓シェーダー → 被窓シェーダ(見える)
カメラ → 窓シェーダー → 他のすべてのシェーダ(見えない)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

以前「Unity Universal RP における影のみの描画とレイヤーを用いた透過」といったご質問を見かけたのですが、あちらと同様の作戦が使えるかもしれません。
まず、実験用シーンを下図のようにセットアップしました。

図1

赤いボールが特殊ガラスでも透けないオブジェクトのつもりです。窓ガラスが通常の透明マテリアルだと、メインカメラの映像は下図のように見えます。

図2

この赤ボールにはレイヤーを指定しておき(仮に「AntiMagicGlass」としました)、

図3

メインカメラを複製してサブカメラとし、カリングマスクはAntiMagicGlassのみ、ターゲットはレンダーテクスチャにしておきます。

図4

サブカメラのAudio Listenerは不要なため削除し、メインカメラに追従させるためメインカメラの子オブジェクトとしました。
このサブカメラでシーンを見ると、下図のように背景と赤ボールだけが映るはずですので、これを窓ガラス表面に投影してやろうというわけです。

図5

窓に使う特殊ガラスのコードは下記のようにし、

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にはサブカメラのターゲットに設定したレンダーテクスチャをセットしておきます。

図6

この特殊ガラスマテリアルを使ったところ、赤ボール以外消えて見えました(実際は不透明オブジェクトの表面に映像が映っているというだけのことではありますが...)。

図7

投稿2020/05/08 05:46

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Avent

2020/05/08 08:19

おお!やりたかったのはまさにそれです!いまはテストできる環境にないのですが、成功し次第ベストアンサーにさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問