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

あるいは、メッシュ自体を最初から表裏両面に二重化してしまってもいいと思います。そのように手作業で加工してもいいでしょうし、モデリングソフトによっては出力時のオプションとして面を両面化する機能があるかもしれません。メッシュデータのサイズが大きくなるデメリットはあるものの、この方式ならマテリアルには通常の片面マテリアルが利用でき、わざわざ特殊な両面マテリアルを作る必要がなくなってマテリアル選択の自由度が高そうです。
ですが、ご提示のスクリーンショットを拝見しますに、半透明のマテリアルを作ろうとなさっているように見受けられます。不透明のマテリアルなら上述のような対策で何とかなるかと思うのですが、半透明だと描画の仕組み的に単一のメッシュでは前後関係の表現に不具合を生じ、継ぎ目が見えてしまうかもしれません。

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

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