前書き
この記事は、2023のUnityアドカレの12/13の記事です。
今年は、完走賞に挑戦してみたいと思います。Qiita君ぬい欲しい!
はじめに
GPUによっては、FrameBufferFetchという機能をサポートしています。FrameBufferFetchは、その名の通りRenderTarget側のピクセルカラーを取得することができます。
HLSLでのFrameBufferFetchの使い方
void frag(v2f data, inout color : CoLoR)
{
half4 c = color;
c += data.mulValue;
color = c;
}
このように、謎のセマンティクスCoLoRの引数にinoutをつけます。これで読み書きができます。最終的に入っていた値がRenderTargetにBlendされます。また、MRTの場合には、CoLoR0、CoLoR1...というように数字を付けます。
CoLoRって!?
何だこの気持ち悪いの。
普段なら、PixelShaderの出力には、SV_TargetまたはCOLORを使います。しかし、これらのセマンティクスはinoutと一緒に使うとコンパイルエラーになってしまいます。(本来outをつけて使う)
なので、HLSLcc(UnityのHLSLコンバーター)がCoLoRというケースパターンのセマンティクスを特殊処理するような実装となっております。
FrameBufferFetchは使えるのか
ここまで書いておいて何ですが、FrameBufferFetchの利用はお勧めできません。
私も網羅的に調査したわけではないですが、手元の端末では、Adreno(Snapdragon)系もMali系も動作しませんでした。PowerVRはできるとか噂を聞いたことがありますが、PowerVRのGPUなんて今どきほぼありません。(しかし本当に稀にあって盛大にバグる)
まぁなので、この記事の価値はないんですけど、CoLoRという気持ち悪い表記を見つけたら、「そういうことなんだなぁ(苦笑)」と思っていただければと思います。
