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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

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

Unity

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

Q&A

解決済

1回答

4500閲覧

Unity:SceneViewとGameViewでshaderの表示が異なっている

zenobread

総合スコア44

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/02/16 06:15

編集2020/02/17 08:10

やりたいこと

SceneViewとGameViewとで色合いが違うのを何とかしたい

イメージ説明
上がSceneViewで下がGameView
下画面の白部分はカメラコンポーネントのバックグラウンドなので関係なし

###やったこと
こちらはwebm動画をクロマキーで切り抜いて表示させたもので、VideoPlayerコンポーネントを使用している
その表示方法としてRenderTextureで表示させているが、MaterialOverrideやAPIOnlyなどに変えて表示させてみたが変化なし。
光源がないからと考え、spotlightなどLightオブジェクトを作成しても変化なし。
新たにプロジェクトを作成して該当の部分だけ状況を同じにしてみると、カメラを動かすとGameViewにも色がきちんと表示されたため、カメラの位置関係が問題かと考えたが関係がなかった。

私用しているmaterialとshaderのスクリプト
material
イメージ説明

ChromaKey_Standard_Transparent(テクスチャにつけているshader)

shader

1Shader "ChromaKey/Standard/Transparent" 2{ 3 4Properties 5{ 6 [Header(Material)] 7 _Color ("Color", Color) = (1, 1, 1, 1) 8 _MainTex ("Albedo (RGB)", 2D) = "white" {} 9 _Glossiness ("Smoothness", Range(0, 1)) = 0.5 10 _Metallic ("Metallic", Range(0, 1)) = 0.0 11 [Enum(UnityEngine.Rendering.CullMode)] _Cull("Culling", Int) = 2 12 13 [Header(Chroma Key)] 14 _ChromaKeyColor("Color", Color) = (0.0, 0.0, 1.0, 0.0) 15 _ChromaKeyHueRange("Hue Range", Range(0, 1)) = 0.1 16 _ChromaKeySaturationRange("Saturation Range", Range(0, 1)) = 0.5 17 _ChromaKeyBrightnessRange("Brightness Range", Range(0, 1)) = 0.5 18} 19 20SubShader 21{ 22 Tags 23 { 24 "Queue" = "Transparent" 25 "RenderType" = "Transparent" 26 "IgnoreProjector" = "True" 27 "PreviewType" = "Plane" 28 } 29 30 Cull [_Cull] 31 32 CGPROGRAM 33 #pragma surface surf Standard alpha:blend addshadow fullforwardshadows 34 #pragma target 3.0 35 #define CHROMA_KEY_ALPHA 36 #include "./ChromaKey_Standard.cginc" 37 ENDCG 38 39 Pass 40 { 41 Tags { "LightMode" = "ShadowCaster" } 42 ZWrite On 43 ZTest LEqual 44 Cull Off 45 46 CGPROGRAM 47 #include "./Chromakey_Shadow.cginc" 48 #pragma vertex vert 49 #pragma fragment frag 50 #pragma multi_compilecaster 51 ENDCG 52 } 53} 54 55FallBack "Diffuse" 56 57}

ChromaKey_Standard(ChromaKey_Standard_TransParentで使われているcgincファイル)

cginc

1#ifndef CHROMA_KEY_STANDARD_CGINC 2#define CHROMA_KEY_STANDARD_CGINC 3 4#include "UnityCG.cginc" 5#include "./ChromaKey.cginc" 6 7sampler2D _MainTex; 8 9struct Input 10{ 11 float2 uv_MainTex; 12}; 13 14half _Glossiness; 15half _Metallic; 16fixed4 _Color; 17 18void surf(Input IN, inout SurfaceOutputStandard o) 19{ 20 fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 21#ifdef CHROMA_KEY_ALPHA 22 ChromaKeyApplyAlpha(c); 23#else 24 ChromaKeyApplyCutout(c); 25#endif 26 o.Albedo = c.rgb; 27 o.Metallic = _Metallic; 28 o.Smoothness = _Glossiness; 29 o.Alpha = c.a; 30} 31 32#endif

ChromaKey.cginc(ChromaKey_Standardで使われているcgincファイル)

cginc

1#ifndef CHROMA_KEY_COMMON_CGINC 2#define CHROMA_KEY_COMMON_CGINC 3 4// Refer to the following website regarding conversions between RGB and HSV: 5// https://www.laurivan.com/rgb-to-hsv-to-rgb-for-shaders/ 6 7float4 _ChromaKeyColor; 8float _ChromaKeyHueRange; 9float _ChromaKeySaturationRange; 10float _ChromaKeyBrightnessRange; 11 12inline float3 ChromaKeyRGB2HSV(float3 rgb) 13{ 14 float4 k = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); 15 float4 p = lerp(float4(rgb.bg, k.wz), float4(rgb.gb, k.xy), step(rgb.b, rgb.g)); 16 float4 q = lerp(float4(p.xyw, rgb.r), float4(rgb.r, p.yzx), step(p.x, rgb.r)); 17 float d = q.x - min(q.w, q.y); 18 float e = 1e-10; 19 return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); 20} 21 22inline float3 ChromaKeyHSV2RGB(float3 hsv) 23{ 24 float4 k = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); 25 float3 p = abs(frac(hsv.xxx + k.xyz) * 6.0 - k.www); 26 return hsv.z * lerp(k.xxx, clamp(p - k.xxx, 0.0, 1.0), hsv.y); 27} 28 29inline float3 ChromaKeyCalcDiffrence(float4 col) 30{ 31 float3 hsv = ChromaKeyRGB2HSV(col); 32 float3 key = ChromaKeyRGB2HSV(_ChromaKeyColor); 33 return abs(hsv - key); 34} 35 36inline float3 ChromaKeyGetRange() 37{ 38 return float3(_ChromaKeyHueRange, _ChromaKeySaturationRange, _ChromaKeyBrightnessRange); 39} 40 41inline void ChromaKeyApplyCutout(float4 col) 42{ 43 float3 d = ChromaKeyCalcDiffrence(col); 44 if (all(step(0.0, ChromaKeyGetRange() - d))) discard; 45} 46 47inline void ChromaKeyApplyAlpha(inout float4 col) 48{ 49 float3 d = ChromaKeyCalcDiffrence(col); 50 if (all(step(0.0, ChromaKeyGetRange() - d))) discard; 51 col.a *= saturate(length(d / ChromaKeyGetRange()) - 1.0); 52} 53 54#endif

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

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

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

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

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

guest

回答1

0

ベストアンサー

Spotlightを設置しても効果なしとのことですが、明らかにライトで照らせているはずなのに真っ黒いままということでしょうか?
ではDirectional Lightならどうでしょうかね?Directional Lightはシーン全体を平行な光で照らしますので、Spotlightと違って位置は関係なく向きさえ合っていれば照らせるはずですから、本当にライトが関係ないのか検証する上で紛れがなくなっていいんじゃないかと思います。

もしライトのせいだったとしたら、シーンビューとゲームビューの見え方の違いを説明できそうなものに心当たりがありまして、以前見かけました「【Unity】作成したエフェクトがゲームビューとシーンビューで大幅に見た目が異なる」とのご質問ではシーンビューのライトトグルの状態が影響していたようでした(当初の回答はアテが外れていたようですが、コメント欄で追加情報をいただいたところどうやらライトトグルの問題らしい様子でした)。
ご質問者さんの場合も、もしライトトグルの状態がオフならシーンビューでは色付いて見えるのにゲームビューでは真っ黒...という状況にもなり得るかもしれないと思いました。

下図のようにDirectional Lightを回転させてみたり、ライトトグルを切り替えて見ると変化はあるでしょうか?
光がどの方向から当たっているかわかりやすいように、隣に球体を置いて撮影してみました。ライトトグルがオフだとシーンビューでは常に正面から光が当たったように描画され、ゲームビューと見え方が食い違う現象が起きています。

図1

Raw Imageでの真っ黒現象について
Frame Debugで見てみたところ、下図のように一旦カラフルな紙吹雪が描画されるものの、後続のShadowCasterパスのせいで真っ黒に塗り直されてしまっているようでした。

図2

UI用マテリアルにShadowCasterパスは不要でしょうから、ChromaKey_Unlit_Transparent.shaderを複製してChromaKey_UI_Transparent.shaderと名前を変え、下記のようにUI/DefaultシェーダーをベースにUI向けの変更を加え...

ShaderLab

1// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt) 2 3Shader "ChromaKey/UI/Transparent" 4{ 5 Properties 6 { 7 [Header(Material)] 8 _Color ("Color", Color) = (1, 1, 1, 1) 9 _MainTex("Texture", 2D) = "white" {} 10 [Enum(UnityEngine.Rendering.BlendMode)] _BlendSrc("Blend Src", Float) = 5 11 [Enum(UnityEngine.Rendering.BlendMode)] _BlendDst("Blend Dst", Float) = 10 12 13 [Header(Chroma Key)] 14 _ChromaKeyColor("Color", Color) = (0.0, 0.0, 1.0, 0.0) 15 _ChromaKeyHueRange("Hue Range", Range(0, 1)) = 0.1 16 _ChromaKeySaturationRange("Saturation Range", Range(0, 1)) = 0.5 17 _ChromaKeyBrightnessRange("Brightness Range", Range(0, 1)) = 0.5 18 19 [Header(UI)] 20 _StencilComp ("Stencil Comparison", Float) = 8 21 _Stencil ("Stencil ID", Float) = 0 22 _StencilOp ("Stencil Operation", Float) = 0 23 _StencilWriteMask ("Stencil Write Mask", Float) = 255 24 _StencilReadMask ("Stencil Read Mask", Float) = 255 25 _ColorMask ("Color Mask", Float) = 15 26 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 27 } 28 29 SubShader 30 { 31 Tags 32 { 33 "Queue"="Transparent" 34 "IgnoreProjector"="True" 35 "RenderType"="Transparent" 36 "PreviewType"="Plane" 37 "CanUseSpriteAtlas"="True" 38 } 39 40 Stencil 41 { 42 Ref [_Stencil] 43 Comp [_StencilComp] 44 Pass [_StencilOp] 45 ReadMask [_StencilReadMask] 46 WriteMask [_StencilWriteMask] 47 } 48 49 Cull Off 50 Lighting Off 51 ZWrite Off 52 ZTest [unity_GUIZTestMode] 53 Blend [_BlendSrc] [_BlendDst] 54 ColorMask [_ColorMask] 55 56 Pass 57 { 58 CGPROGRAM 59 60 #pragma vertex vert 61 #pragma fragment frag 62 #pragma target 2.0 63 64 #include "UnityCG.cginc" 65 #include "UnityUI.cginc" 66 #include "./ChromaKey.cginc" 67 68 #pragma multi_compile_local _ UNITY_UI_CLIP_RECT 69 #pragma multi_compile_local _ UNITY_UI_ALPHACLIP 70 71 struct appdata_t 72 { 73 float4 vertex : POSITION; 74 float4 color : COLOR; 75 float2 texcoord : TEXCOORD0; 76 UNITY_VERTEX_INPUT_INSTANCE_ID 77 }; 78 79 struct v2f 80 { 81 float4 vertex : SV_POSITION; 82 fixed4 color : COLOR; 83 float2 texcoord : TEXCOORD0; 84 float4 worldPosition : TEXCOORD1; 85 UNITY_VERTEX_OUTPUT_STEREO 86 }; 87 88 sampler2D _MainTex; 89 fixed4 _Color; 90 fixed4 _TextureSampleAdd; 91 float4 _ClipRect; 92 float4 _MainTex_ST; 93 94 v2f vert(appdata_t v) 95 { 96 v2f OUT; 97 UNITY_SETUP_INSTANCE_ID(v); 98 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); 99 OUT.worldPosition = v.vertex; 100 OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); 101 OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); 102 OUT.color = v.color * _Color; 103 return OUT; 104 } 105 106 fixed4 frag(v2f IN) : SV_Target 107 { 108 half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; 109 ChromaKeyApplyAlpha(color); 110 111 #ifdef UNITY_UI_CLIP_RECT 112 color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); 113 #endif 114 115 #ifdef UNITY_UI_ALPHACLIP 116 clip (color.a - 0.001); 117 #endif 118 119 return color; 120 } 121 122 ENDCG 123 } 124 } 125}

VideoChromaKeyマテリアルのシェーダーをそれに変更すると、下図のようにカラフルな紙吹雪になりました。

図3

投稿2020/02/17 11:31

編集2020/02/19 21:00
Bongo

総合スコア10807

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

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

zenobread

2020/02/18 03:09

何度もご回答していただきありがとうございます。 仰られた通り、3dと2dプロジェクト療法で試してみましたがどうやらlightの問題関係なくできませんでした。むしろ成功したのはhecomiさんの環境の身です。 https://github.com/hecomi/uChromaKey 此方で配られているプロジェクト内で実行するとDirectionLightがどの向きであってもカラフル色のままでしたが、なぜかCameraオブジェクトを上下左右一定量動かすと他のプロジェクトでも発生している様に黒色になってしまいます。 また関係のないバグかもしれませんが、そのシーン内にあるplaneオブジェクトを非アクティブにすると一瞬黒色になりました。
zenobread

2020/02/18 07:16

色々試してみると、3D空間ではなぜかplaneオブジェクト(デフォルト)を一度配置するとクロマキーがきちんと作用された状態でgameviewに表示されました。 2Ⅾ空間では効果がなかったのですが、これはどういう現象なのかご存じないでしょうか
Bongo

2020/02/18 19:22

すみません、いろいろいじってみたのですが、未だにライト以外の理由でご提示の図のような見え方になってしまう状況を再現できておらず、また、カメラの位置によって見え方が変化するという現象に至ってはまったく再現できていない状態です... この現象はマテリアルのシェーダーが「ChromaKey/Unlit/Transparent」でも発生するでしょうか? また、再生するWebMファイルに依存するでしょうか...つまり、ご提示のカラフルな紙吹雪のようなムービー以外のWebMファイルでも、同様に黒くなってしまうのでしょうか? おそらくまだどこか設定を見落としていてご質問者さんと同じ状況にできていないんだろうと思いますが、もし差し支えなければ、その問題のあるプロジェクトをどこかにアップロードしていただけませんでしょうか。 また念のための参考情報として、ご質問者さんのUnityのバージョンもお教えいただけるとありがたいです。
Bongo

2020/02/19 21:01

プロジェクトご提示ありがとうございます。どうやらシャドウマッピングのためのShadowCasterパスが影響しているような感じでした。UI用向けの改造案を追記しましたが、いかがでしょうか?
zenobread

2020/02/20 02:08

ありがとうございます!早速試してみます!
zenobread

2020/02/20 06:29

本当にありがとうございます!2Dプロジェクトでも正しく動作できました!かなり長い期間幾度も答えていただき本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問