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

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

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

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

Unity

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

Q&A

解決済

1回答

2624閲覧

Standardシェーダーで裏面のライティングをしたい

paseri528

総合スコア7

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/03/31 13:08

前提・実現したいこと

Unity2020で、写真のような、裏面と表面がつながっているメビウスの輪のメッシュを作成しました。
そこで、カリングをオフにしたStandardShaderでマテリアルを設定したのですが、裏表のつなぎ目のところで光の当たり具合が違うのか違和感のある見た目になってしまいます。どうすればよいかご教示頂ければ嬉しいです。

私はシェーダについて理解がすごく浅いので間違っているかもしれませんが、恐らくカリングオフだと表面しかライティングは行われておらず、裏面は表面と同じ表示をしているだけなために、写真右側ではライティング対象の表面が下を向いているせいでこうなっているのだと思います。
なので、カリングオフの代わりに裏面も表面と同様にライティングをすればよいと思うのですが、方法がわかりません…

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

けっこういい着眼点のように思います。おそらく、裏面の描画時には法線を逆向きとして計算するべきなのに、裏面でも表面と同じ法線で陰影をつけてしまうために継ぎ目が目立ってしまったんじゃないでしょうか。
たとえば下記のように、面の表裏に応じて法線の向きを修正してやるといいかもしれません。

ShaderLab

1Shader "Custom/MoebiusStrip" 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 } 10 SubShader 11 { 12 Tags { "RenderType"="Opaque" } 13 14 Cull Off 15 16 CGPROGRAM 17 #pragma surface surf Standard fullforwardshadows 18 #pragma target 3.0 19 20 sampler2D _MainTex; 21 22 struct Input 23 { 24 float2 uv_MainTex; 25 fixed faceDirection : VFACE; 26 }; 27 28 half _Glossiness; 29 half _Metallic; 30 fixed4 _Color; 31 32 void surf(Input IN, inout SurfaceOutputStandard o) 33 { 34 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 35 o.Albedo = c.rgb; 36 o.Normal = o.Normal * IN.faceDirection; 37 o.Metallic = _Metallic; 38 o.Smoothness = _Glossiness; 39 o.Alpha = c.a; 40 } 41 ENDCG 42 } 43}

図1

あるいは、メッシュ自体を最初から表裏両面に二重化してしまってもいいと思います。そのように手作業で加工してもいいでしょうし、モデリングソフトによっては出力時のオプションとして面を両面化する機能があるかもしれません。メッシュデータのサイズが大きくなるデメリットはあるものの、この方式ならマテリアルには通常の片面マテリアルが利用でき、わざわざ特殊な両面マテリアルを作る必要がなくなってマテリアル選択の自由度が高そうです。

ですが、ご提示のスクリーンショットを拝見しますに、半透明のマテリアルを作ろうとなさっているように見受けられます。不透明のマテリアルなら上述のような対策で何とかなるかと思うのですが、半透明だと描画の仕組み的に単一のメッシュでは前後関係の表現に不具合を生じ、継ぎ目が見えてしまうかもしれません。

図2

対策としては、メッシュをなるべく自己交差がないような(凸形状に近い形に)細かく分割してやる手があるかと思います。下図はメビウスの輪を十字に切断して4個のゲームオブジェクトに分割したものですが、アングルによってはまだ継ぎ目が見えてしまうものの、多少はマシになったように感じます。

図3

その他の対策としては「[Unity5]破綻しない半透明描画を行う | notargs.com」のような半透明を不透明網掛けで表現する手法や、「UnityでOIT(Order Independent Tranceparency) - UnityShader 入門」のような描画順序に依存しない半透明計算方法を使う手法があるでしょう。ですが前者は網目模様が出てしまったり、後者は通常の描画方法との乖離ゆえの面倒さがあったりと、それぞれデメリットもあって悩ましいところではありますね...

投稿2021/04/01 13:25

Bongo

総合スコア10807

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

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

paseri528

2021/04/05 03:35

返信遅くなってしまいすみません!なるほど、表裏に応じて法線を変えたり裏表分のメッシュを作るんですね。仰る通り半透明の描画をしたいので、見た目と相談しつつ決めていきたいと思います!丁寧に様々な方法をご提示して頂きとても助かりました!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問