LIGHT11スマートフォン用の表示で見るLIGHT112018-05-26タイルベースレンダリングの概要と、不透明なフラグメントの破棄は高負荷だという話Renderingモバイルではclip()やdiscardを多用しないほうがいいという話を聞きます。これに関連して、タイルベースレンダリングを概要からまとめてみました。参考タイルベースレンダリング?タイルベースレンダリングというのは画面のピクセルを一定の大きさの領域に切り分けて、その単位で処理を行うレンダリング方式のことです。引用この一つ一つのグループが「タイル」というわけです。レンダリングを行うときには深度を使って一番手前にあるポリゴンを割り出し、重なっているポリゴンを処理しないようにしますが、タイルベースではタイル単位の処理に最適化されたチップを使ってタイルごとにこれを行うことで高速化します。この結果タイルベースレンダリングでは、ピクセルごとに最終的に描画されるポリゴンがあらかじめ決定されるようです。www.4gamer.netフラグメントを破棄する処理が重い?さてこのタイルベースレンダリングではフラグメントを破棄する処理(すなわちclip()やdiscard)が高負荷になるといわれます。引用ということが原因になるようです。前述の通りタイルベースレンダリングでは、深度を使うことによりそのピクセルに描画されるポリゴンを一つに決めてから描画を行います。破棄されるピクセルは深度が書き込まれないわけだから、描画するピクセルを決める際に深度を使うときに、まず破棄されるかどうかの条件をチェックする処理をしなければいけません。「描画ポリゴン決定時」と「描画時」の二回、この破棄されるかどうかの条件をチェックする処理を行わなければならなくなる、ということでしょうか。中の人が言っているので、「不透明ジオメトリでフラグメントを破棄するのは高価」とだけ覚えておけばよさそうです。タイルベースのデバイス多いの?ではタイルベースってどんなデバイスで採用されているのか?という話ですが、下記のとおりiOSはいずれもタイルベースのようです。Rendering)を実装しています。Androidは端末によるみたいですが、モバイルアプリを開発する以上タイルベースレンダリングを意識する必要はありそうです。Rendering)はフォワードレンダリングとディファードレンダリングのディファードとは無関係です(非常に紛らわしいですね・・)。対応策さて、モバイルでは不透明パスにおけるフラグメントの破棄に気を配る必要があることはわかりました。具体的にどうアクションすればいいのでしょうか?まず、前提としてclip()やdiscardを書くようなシェーダはAlphaTestのQueueで行いましょう。light11.hatenadiary.com次に、できる限りアルファに沿ったポリゴンを用意してしまうという手もあります。フィルレートが問題になりやすい昨今の環境では、テクスチャをQUAD(板ポリ)に貼るより、アルファに沿って綺麗に切り抜いたポリゴンを表示した方が高速と言われています。Cutoutが最近のGPUでは相性が悪いのも、こう言われてる要因の一つです。思い切って半透明描画にして、clip()やdiscardの処理を消してしまうのも手かと思います。»プロフィールUnityエンジニア。グラフィックスへの興味が強めです。Blur(渦巻ブラー)のポストエフェクトを実装する月別アーカイブはてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。