前書き
この記事は、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
という気持ち悪い表記を見つけたら、「そういうことなんだなぁ(苦笑)」と思っていただければと思います。