3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

frameBufferFetchとCoLoRという謎のセマンティクス

Last updated at Posted at 2023-12-12

前書き

この記事は、2023のUnityアドカレの12/13の記事です。
今年は、完走賞に挑戦してみたいと思います。Qiita君ぬい欲しい!

はじめに

GPUによっては、FrameBufferFetchという機能をサポートしています。FrameBufferFetchは、その名の通りRenderTarget側のピクセルカラーを取得することができます。

image.png

HLSLでのFrameBufferFetchの使い方

void frag(v2f data, inout color : CoLoR)
{
    half4 c = color;
    c += data.mulValue;
    color = c;
}

このように、謎のセマンティクスCoLoRの引数にinoutをつけます。これで読み書きができます。最終的に入っていた値がRenderTargetにBlendされます。また、MRTの場合には、CoLoR0CoLoR1...というように数字を付けます。

CoLoRって!?

何だこの気持ち悪いの。

普段なら、PixelShaderの出力には、SV_TargetまたはCOLORを使います。しかし、これらのセマンティクスはinoutと一緒に使うとコンパイルエラーになってしまいます。(本来outをつけて使う)

なので、HLSLcc(UnityのHLSLコンバーター)がCoLoRというケースパターンのセマンティクスを特殊処理するような実装となっております。

FrameBufferFetchは使えるのか

ここまで書いておいて何ですが、FrameBufferFetchの利用はお勧めできません。

私も網羅的に調査したわけではないですが、手元の端末では、Adreno(Snapdragon)系もMali系も動作しませんでした。PowerVRはできるとか噂を聞いたことがありますが、PowerVRのGPUなんて今どきほぼありません。(しかし本当に稀にあって盛大にバグる)

まぁなので、この記事の価値はないんですけど、CoLoRという気持ち悪い表記を見つけたら、「そういうことなんだなぁ(苦笑)」と思っていただければと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?