浮動小数点数を使いこなす。 PCでモバイルデバイスのシェーダーをデバッグすることはできますか?

ゲーム業界では、視覚効果の効果に関する作業は、アートとテクノロジーの交差点で行われます。 これは特にモバイルアプリケーションに当てはまります。



この記事では、PC上のモバイルデバイスのシェーダーをデバッグするときに浮動小数点数を使用することについて説明します。 使用するエンジンに関係なく、クラスノダールプラリウムスタジオの経験が役立つと確信しています。



画像



問題の特定方法



エフェクトを作成する過程で、それらの一部が最終的にピクセルに分散するという事実に常に直面していました。



画像



この問題を調査し、発生の原因を特定しました。すべてのガジェットがアーティファクトの影響を受けやすいわけではないことがわかりました。 これは主に、パフォーマンスの低い古いモバイルデバイスまたはモデルに適用されます。 さらに、一見同じ効果の一部が正常に機能し、動きの滑らかさを失い、ピクセレーションを獲得しました。



危険にさらされているデバイスのビデオプロセッサの技術文書の分析中、すべてのガジェットが32ビット浮動小数点数を完全にサポートしているわけではないことがわかりました。 これがアーティファクトと画像の問題の原因です。



そして、バイナリはどうですか?



バイナリシステムでの浮動小数点数の見え方を思い出してください。



画像



このような数字は、有効数字の固定数とこの数字の任意の場所のコンマを格納するためのコンテナとして想像できます。 明らかに、数字が大きいほど精度が低くなります。



たとえば、有意な数-123456789があります。最初の文字(1.23456789)の後にカンマを置くと、この数を最も近い0.00000001に変更できます。 ただし、最後の文字(12345678.9)の前にコンマを置くと、精度は0.1になります。



32ビットの数値を使用する場合、そのような数値は7文字を正確に伝えます。 これにより、目に見える問題なくアプリケーションを約70時間実行できます。 ユーザーが実行中のゲームを見る時間であり、一時停止や最小化された状態ではありません。 十分な在庫ですね。



しかし、実際には、多くのモバイルデバイスは、ピクセル(フラグメント)シェーダーで16ビット浮動小数点数のみをサポートしています。 このような数値では、正確な兆候が4つしかなく、10〜15分でテクスチャをアニメートすると、精度が著しく低下します。



ソリューションを探しています:





特定のデバイスごとに問題を解決するのは非現実的であるため、エフェクトを作成するときにPCでエラーを視覚化し、事前に除去するための対策を講じることに焦点を当てました。



PCでは、16ビットモードを直接エミュレートする方法はありません。 ビデオカードドライバーは、すべての16ビット命令を32ビットに自動的に変換し、長時間経過した後にのみ精度の低下を視覚的に追跡できます。 したがって、精度の低下によるアーティファクトを視覚化するために、シェーダー用の独自の時間および拡張マネージャーを作成しました。



タイムマネージャー



「デバッグ」時間は、スケジュールより数時間早く始まります。 したがって、アーティストはエフェクトの問題をすぐに見ることができます。 また、マネージャは、アプリケーションが一時停止または最小化されるたびに自動的に時間をリセットします。 現時点では、効果のジャンプがプレイヤーにとって最も目立たないのです。



Unityの新しいバージョンにScriptable Rendering Pipelineプロセス制御システムが登場したことで、別の時間管理スクリプトを放棄し、フレームの作成時にすべてを直接行うことができました。



シェーダー拡張



アイデアは、16ビットがオーバーロードされたのと同じ方法で32ビット浮動小数点数をオーバーロードすることでした。 特定のビット数だけ重要な部分をシフトする必要がありました。 ただし、ビット操作はShader Model 2.0では使用できません。さらに、より高いシェーダーモデルを使用すると、モバイルデバイスの計算が複雑すぎることをエフェクトアーティストに警告するエンジンが停止し、エフェクトの予算を超過します。



最も正確な模倣アルゴリズムを作成することにしました。これにより、目的の結果を得ることができます。



  1. オリジナルに大きな数字を追加します。 この大きな数字自体は、メインの数字の文字数によって決まります。
  2. それを引きます。 コンパイラをだます必要があります。これにより、操作が自動的に削減されます。 これを行うために、増加後の数にわずかなエラーを導入します。


したがって、シェーダーを少し変更すると、弱いデバイスに対して視覚的に同一の画像が得られます。 これにより、アーティストはエフェクトを開発するプロセスを制御し、作品のエラーの数を減らすことができます。



ヒント:fracが役立ちます



エフェクトを操作するときは、エフェクトの滑らかさと精度を必要とするすべての数値が0〜1の範囲にあることを確認してください。これを行うには、整数部分を切り捨てる操作-frac(x)を使用します。



本質的に、fracは浮動小数点数を整数にキャストし、この整数を元の整数から減算することです。 つまり、frac = x-floor(x)です。



この操作では元の形式の元の番号が使用されるため、シェーダー内でこの番号を転送する段階で精度が低下する可能性があります。 したがって、大きな値に増加しない時間を使用することをお勧めします。 起動時、またはゲームインターフェイスがゲームレベルと重なっているときに、強制的にゼロに設定することをお勧めします。



行われた作業により、視覚的なエラーの数が大幅に減少しました。 私たちのアーティストは、モバイルデバイスでの長く複雑なテストなしで、エフェクトを作成するプロセスを制御する機会を得ました。



All Articles