無用の長物の彼方

・・・

           

3Dゲーム不治の病?透過病

透過病・・・・・

それはぁぁあぁ、遠い昔ぃぃいぃ、3Dゲームが世に出始めたころからぁ、時を同じくし発生しだしたぁぁあぁ、不治の病ぃぃ・・・・・

Sorting Order ・・・・

それは日本語でぇぇえぇ、「そうでんな、オーナー」っと言われている3Dゲームに潜む闇ぃぃ・・・・・
(ぉぃ!こら!それ違っ!修正を!修正を!って待てそのまま行くのかぁぁぁ!あたし!)

そこにぃぃいぃ、内包されている数値はぁぁあぁ、常に人々を翻弄し続けるというぅぅうぅ、恐怖の魔物ぉ・ぉ・ぉ・・・・・


きゃあああぁぁぁあああぁあああ!
20160819020939394.jpg


っと妙な始まり方をしてますが~、つまりは、透過病のお話ですぅ・・・あは(;^_^A

透過病は、メッシュに透過テクスチャを使用している物同士が重なると発生するのは皆さんご存知ですよねぇ。
まぁ、イリュゲーしてればお約束の現象(;^_^A

これに対抗する手段として現在のSB3UGUIに搭載されている「SortingOrder」なる物を使っちゃおうって事なのですぅ。
「SortingOrder」を弄ろうと思いますと~
まず、SB3UGUIでMeshを選択します。
そうするとFrameツリーの右横の真ん中あたりに6つボタンらしき物が現れます。
その現れたボタンの中の「Attributes」をクリックするとポップアップ画面が出て来ます。
その出てきたポップアップ画面の左上すぐ下の中央付近に「SortingOder」って所が数値を打ち込む所です。

念のため画像をば(赤いアンダーラインの所)
WS000065.jpg


それで、この「SortingOrder」に打ち込む数字の決め方なんですけど~
基本概念はいたって単純で、

カメラから見ての~
一番手前のオブジェクト(Mesh)を最大の数値にして、一番遠いオブジェクト(Mesh)の数値は最小に!

っていうのが基本的なルールなのですぅ。

しか~し、3Dゲームでそんなことうまくいくの?って普通に思いますよねぇ。
そうなのです~もちろん無理なのです!はい(;^_^A
だってカメラはぐるぐる回っちゃうんだもん~、しかもカメラ基準点も動きたい放題だし~(;^_^A

んじゃ、これ何に使うんだぁって事ですよねぇ。
簡単に言うと~
カメラとの位置関係がおおよその予想が付き、並び順も推測できる透過するオブジェクト
(厳密に言うと透過してなくても透過シェーダーを使っているオブジェクト)
に対してあらかじめ数値を決めておいて、透過病を防ぐ手段として用いるっていうのが現在の常套手段の様です。

つまりは予測のつかない所はとりあえずは横に置いておく~みたいな決め方かなぁ(;^_^A

んで~この前、RLAさんがSortingOrderの数値がなぜ50?みたいに不思議がられていたのを思い出したのですがぁ、
なぜ50かと言うと~

勘です!勘!っていうか確固たる根拠はありましぇん!

まぁ、大体これぐらいにしておいたらそれなりになるかなぁっていう経験則みたいなものですねぇ。

単体の透明オブジェクト同士が重なる場合、
どっちが消えると見た目に違和感が大きいかっという感覚的な基準は有るのですけど
必ずどちらかは消えちゃうので透過病対策には程遠い~みたいな使い方です。

眉毛の様に透過オブジェクトの真下に普通の透過していないオブジェクトがあれば~
カメラからの絵画順を予測できますのでしっかりとした数値は決めれますが~
上記の様だと~つまりは感性で決めるしかないのですぅ。

そしてまだ検証はしっかりしていないものの、まったく別の透過病対策みたいなのが有りまして~、
今私がなんとな~くやっていますのが、
同じファイル内のメッシュの並び順でも透過の是非が変わることが解っています。
これはメタコのオブジェクトの並びと似ていまして、

上がカメラから一番遠く、下がカメラの一番手前になる様にオブジェクトを配置するとうまく透過するようです。

しかし~、これに関しては、まだUnity3Dファイル内で検証をしていませんのでどこまで通用するかは不明。
まぁ、そのうちやろうとは思いますがぁ、時間がぁ。
んで~このルールはサブオブジェクト内でも同じな様ですし、透過オブジェクトに限った物ではない可能性もあります。

最近よく起きている、マップアイテムの角度によってオブジェクトが消える問題も~
もしかしたらこのルールが根底にあるのではないかって最近思うようになりました。っがこれもまだ未検証です(;^_^A

そして最後にもう一つ~
それはパンストのファイル内にある「MonoBehavior」の「SetRenderQueue」なのです。
WS000066.jpg

これもどうやらUnity側での透過病を防ぐ手段の様ですがまったくと言っていいほどルールが解っていません。
ですのでこれも今後検証するか、もしくはUnityのマニュアルを調べるかしないといけないという・・・・

長々書きましたがぁ、透過病は不治の病~
誰しもが自身の感性で優先度をお決めになっちゃえば~、その後、細かいことは言いっこなし~、ってな具合かなぁ(;^_^A
まぁ、眉毛が消えるとかお毛毛が消えるとかは作った方に報告した方がいいかと思いますけどねぇ。
(まとめになってないや・・・)

6 Comments

Laurel K.  

[そうでんなオーナー]やメッシュの並び順など
原理もわからず使っていましたが
今回イトさんの記事で改めて勉強になりました。

逆にSorting Orderをマイナス値にして
”なんでも(主に服)透過ゼリー!!!”とか
”なんでも(主に服)透過メガネー!!”とか
やりたかったのですがマイナス値はうけつけないみたいです><

あ、、、コメントって修正効かないんでしたっけ、、、、、

2016/08/19 (Fri) 06:32 | EDIT | REPLY |   

イト  

PASSWORDを入れてらっしゃれば~EDITを押せば修正できますよん。
私もよそ様のブログで時々PASS入れるの忘れて修正できないことが~(;^_^A

SortingOrderってマイナスを本当に受け付けないのかなぁ?
しっかり検証したことないので~
今度実験してみよっと。

2016/08/19 (Fri) 07:48 | EDIT | REPLY |   

RLA  

SortingOrder
勉強させてもろた ^^

透過病の意味が初めて具体的に解かったような解からんような…^^;
せやけど、いつも詳しい解説、感謝してま ^^ おおきにです (__)

それに技術でコリコリのイトさんとは思ってましたが…
勘・・・長年の勘で行かはるとこが、やっぱ風゜呂やなと…w

2016/08/20 (Sat) 00:40 | EDIT | REPLY |   

イト  

RLAさん!
勘は大事ですよ!勘は!
私は技術はあんまりないので殆どの取っ掛かりは勘です、はい。
勘でやり始めてうまくいった物がMODに生かされているという(;^_^A

なので~いつも何かしらの地雷を踏んでいますねぇ。

この記事はSortingOrderの決め方しか書いてませんので~
なぜ、透過病が起こるかは解らないかと~(;^_^A

2016/08/20 (Sat) 02:57 | EDIT | REPLY |   

Core2Dev  

こちらでは初めて書き込ませて頂きます。よろしくお願いします。

色々と調べている途中ではありますが、現時点ではMonoBehaviourによる効果は、恐らくSortingOrderを設定することによる効果と全く同一のものであると結論付けました。

UnityではTransparentに設定されたオブジェクトは、全て自動的にSortingOrderが3000に設定されるとの事です。

AttributeのSortingOrderの設定は、オブジェクト(シェーダ)がTransparentであるなら、3000からプラマイ幾つ、という設定であると思われ、つまりMonoBehaviourに3006を設定する事と、AttributeでSortingOrderを6に設定することは等価であると考えられます。

Unityマニュアルに透過病を回避する一例が載っていたので何とか応用できないかと考えつつもまだ既存のシェーダの理解が追っ付いていないので、取り急ぎこれだけでスミマセンー。

2016/08/20 (Sat) 04:33 | EDIT | REPLY |   

イト  

おぉ
Core2さん、いらっしゃいませ~。
なるほど、「3000」が「0」なのねぇ。
ってかUnityに透過病の回避策が載っているとは!
それが出来れば色々なことに応用できますねぇ。

2016/08/20 (Sat) 06:58 | EDIT | REPLY |   

Leave a comment