🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

2070閲覧

シェーダーの効果を特定のオブジェクトに対してかけないようにしたい

KTN

総合スコア16

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/02/12 06:36

前提・実現したいこと

ある能力のエフェクトとして、下記のように球体に描画範囲内を反転させるシェーダーを用いて、それを大きくしています。
イメージ説明
この反転する効果を能力の使用者(この場合カプセル)に対してはかけなくしたいです。

発生している問題・エラーメッセージ

シェーダーについて全くの初心者で、色々調べて反転させるシェーダーを用意したはいいものの、それの改変方法が分からず詰まってしまっています。

該当のソースコード

ShaderLabs

1Shader "Custom/Invert" 2{ 3 Properties 4 { 5 _Color("Color", Color) = (1,1,1,1) 6 _MainTex("Albedo (RGB)", 2D) = "white" {} 7 } 8 SubShader 9 { 10 Tags { "RenderType" = "Transparent" "Queue" = "Transparent" } 11 LOD 200 12 Blend OneMinusDstColor Zero 13 14 PASS 15 { 16 CGPROGRAM 17 18 #pragma vertex vert 19 #pragma fragment frag 20 #pragma target 3.0 Alpha:Blend 21 22 struct appdata 23 { 24 float4 vertex : POSITION; 25 float2 uv : TEXCOORD0; 26 }; 27 28 struct v2f 29 { 30 float2 uv : TEXCOORD0; 31 float4 vertex : SV_POSITION; 32 }; 33 34 fixed4 _Color; 35 36 v2f vert(appdata v) 37 { 38 v2f o; 39 o.vertex = UnityObjectToClipPos(v.vertex); 40 o.uv = float2(0,0); 41 return o; 42 } 43 44 fixed4 frag(v2f i) : SV_Target 45 { 46 return _Color; 47 } 48 49 ENDCG 50 } 51 } 52 FallBack "Diffuse" 53}

試したこと

カメラを二つ用意し、片方のカメラをキャラのみを描画するように設定しましたが、最前面には反転用の球体オブジェクトがあるので反転していない状態のキャラを描画するにはキャラを最前列に表示させる必要があり、そうすると他のオブジェクトよりも手前に表示されてしまい不自然になってしまいました。
イメージ説明
特定のオブジェクト(レイヤー)に対してシェーダーの効果を無効化する方法はありますでしょうか。ご教授願いたいです。

補足情報(FW/ツールのバージョンなど)

Unity2020 2.3f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

後者の2カメラ案はなかなかいい手のように思われますね。
反転エフェクト用の球体ですが、ご質問の内容から想像しますに、このマテリアルがデプスバッファへの書き込みを行う必要はなさそうに感じます。ですので、下記のように変更した上で...

ShaderLab

1Shader "Custom/Invert" 2{ 3 Properties 4 { 5 _Color("Color", Color) = (1,1,1,1) 6 _MainTex("Albedo (RGB)", 2D) = "white" {} 7 } 8 SubShader 9 { 10 Tags { "RenderType" = "Transparent" "Queue" = "Transparent" } 11 LOD 200 12 Blend OneMinusDstColor Zero 13 14 ZWrite Off // これを追加 15 // ZTest Always // 他の不透明物体を無視して描画させたいなら、ZTestも切ってしまっていいかもしれません 16 17 PASS 18 { 19 CGPROGRAM 20 21 #pragma vertex vert 22 #pragma fragment frag 23 #pragma target 3.0 Alpha:Blend 24 25 struct appdata 26 { 27 float4 vertex : POSITION; 28 float2 uv : TEXCOORD0; 29 }; 30 31 struct v2f 32 { 33 float2 uv : TEXCOORD0; 34 float4 vertex : SV_POSITION; 35 }; 36 37 fixed4 _Color; 38 39 v2f vert(appdata v) 40 { 41 v2f o; 42 o.vertex = UnityObjectToClipPos(v.vertex); 43 o.uv = float2(0,0); 44 return o; 45 } 46 47 fixed4 frag(v2f i) : SV_Target 48 { 49 return _Color; 50 } 51 52 ENDCG 53 } 54 } 55 FallBack "Diffuse" 56}

第2のカメラのClear FlagsをDon't Clearにすれば、第1のカメラがシーン内物体を描画したときのデプスが反転エフェクト描画時にも第2カメラクリア時にも上書きされずに残るはずなので、第2カメラでキャラクターを描画したときの前後関係が正常になるんじゃないでしょうか。

図

投稿2021/02/12 10:47

編集2021/02/12 19:10
Bongo

総合スコア10811

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

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

KTN

2021/02/12 11:27

またしてもありがとうございます! 正常な動作を確認できました! あとこれは質問とは関係ないのですが、私もできるだけ質問をせずに自分で解決したいのでシェーダーを学びたいのですが、なにかおすすめのサイトや書籍はありませんか?
Bongo

2021/02/12 19:13

Unityのシェーダー記述言語にどんな機能があるかについては、本家マニュアルの「シェーダー」の節(https://docs.unity3d.com/ja/current/Manual/SL-Reference.html )をご覧いただくのがいいんじゃないかと思います。また、この範疇の解説でしたらけっこう入門記事も多いようですし(たとえば「Unity シェーダー」で検索... https://www.google.com/search?q=unity+%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%83%BC&oq=Unity+%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%83%BC )、それらサイトをのぞいてみてはいかがでしょう。 Unityのシェーダーは、裏方ではDirectXだのOpenGLだのMetalだのVulkanだの...といったさまざまなグラフィックスAPI用シェーダーに変換されることになります。これらはAPI固有の最新機能を別にすれば、基本的な部分では似たようなコンセプトで動いているでしょうから(メッシュを構成する各頂点を座標変換し、画面上のポリゴンが占める各ピクセルの色をそれぞれ決定する...といった)、Unityに限定せず3Dグラフィックスプログラミング全般について調べてみるのも大いに役立つかと思います。 基本的な部分から外れた表現技法に手を出してみたい場合、それらの技法について個別に検索することになるかと思います。ですがUnity以外の環境向けに書かれた記事であっても、その環境とUnityとに共通する概念のイメージがあればUnity用シェーダーに応用することができるかもしれません。
KTN

2021/02/14 16:21

返事が遅れてしまい申し訳ありません! 教材のご提示、ありがとうございます! たいへんそうですが私自身、かなり興味のある分野なので頑張りたいと思います! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問