メインコンテンツまでスキップ

TSMPDecodeByteOutput.cginc

任意のヘッダー直接出力​

別の結合パスを省くには TSMPDecodeCommon.cginc をインクルードし、以下の非表示プロパティを両方宣言します。既定値は従来の本文出力を維持します。フラグメントでプレフィックス処理を実装した場合のみ宣言してください。

TSMPReadOutputPrefix(float2 uv, out int baseByte, out float4 prefix) が true ならヘッダー領域なので本文を復元せず prefix を返します。それ以外では baseByte が本文相対のバイト位置です。14ピクセルのプレフィックスの場合、出力ピクセル 0..13 が56バイトのヘッダー、ピクセル14が本文の 0..3 バイトとなり、以降は行をまたいで続きます。_ByteCount はプレフィックスを含まない本文長、パディングは0です。ヘッダーは正確なテクセルを読むため、元画像の flipY を再適用しません。

共通 include が TSMP_COMBINED_BYTE_OUTPUT を定義すると標準の TSMPDecodeByteOutputFragment が自動処理します。独自フラグメントはバイト・シンボル計算の前にこの関数を呼びます。旧 Core もサポートする場合は #if defined(TSMP_COMBINED_BYTE_OUTPUT) で分岐し、#else では従来のピクセル計算を維持します。共通 include を使わない独立した byte-output シェーダーの動作は変わりません.

[HideInInspector] _TSMPHeaderTex ("Decoded Header", 2D) = "black" {}
[HideInInspector] _TSMPHeaderPixels ("Header Pixels", Float) = 0

TSMPDecodeByteOutput.cginc は、コーデック デコード パス用のシェーダー インクルードです。これは、バイトアドレス指定された DecodeByte(index) 関数を、デコードされたバイトを RGBA 出力テクスチャに書き込むフラグメント シェーダーに変換します。

カスタム コーデックがインデックスによって 1 バイトを回復でき、Core のデコーダ リードバック パスが標準のテクスチャ レイアウトでそれらのバイトを受信できるようにする場合に使用します。

インクルードパス:

#include "Packages/com.kibalab.tsmp.core/Runtime/Codecs/Common/Shaders/cgincs/TSMPDecodeByteOutput.cginc"

必須の入力​

インクルードでは、シェーダーがインクルードされる前、またはフラグメントが実行される前に、これらのシンボルがシェーダー内に存在することが予期されます。

シンボルタイプ目的
v2f構造体フラグメント入力タイプ。 float2 uv を公開する必要があります。
_OutputWidthユニフォーム番号バイト出力テクスチャの幅 (ピクセル単位)。
_OutputHeightユニフォーム番号バイト出力テクスチャの高さ (ピクセル単位)。
_ByteCountユニフォーム番号デコーダによって要求された有効なデコードされたバイトの数。
DecodeByte(int byteIndex)関数バイト インデックスに対してデコードされた 1 バイトを返します。

_OutputWidth、_OutputHeight、および _ByteCount は通常、デコーダまたはコーデック マテリアルのセットアップによって割り当てられます。

DecodeByte(int byteIndex) 契約​

デフォルトでは、インクルードは以下を呼び出します。

int DecodeByte(int byteIndex)

この関数は、0 から 255 までの整数バイト値を返す必要があります。

ルール:

  • byteIndex は、ゼロから始まるペイロード バイト インデックスです。
  • この関数は、最後の RGBA ピクセル内の _ByteCount を超えるインデックスに対して呼び出される可能性があります。
  • 範囲外の読み取りは 0 を返す必要があります。
  • 0..255 の外側の値は、コーデックによってクランプまたは回避される必要があります。
  • 関数は、正確なバイト値をフィルター処理されたサンプリングに依存すべきではありません。

カスタムバイト関数名​

別の関数名を使用するには、ファイルをインクルードする前に TSMP_DECODE_BYTE_FUNC を定義します。

int MyCodecDecodeByte(int byteIndex)
{
return DecodeMySymbol(byteIndex);
}

#define TSMP_DECODE_BYTE_FUNC MyCodecDecodeByte
#include "Packages/com.kibalab.tsmp.core/Runtime/Codecs/Common/Shaders/cgincs/TSMPDecodeByteOutput.cginc"

置換関数は同じ呼び出し形式を持つ必要があります。つまり、1 つの int インデックスが入力され、1 つのバイト形式の int が出力されます。

出力レイアウト​

各出力ピクセルには 4 バイトが格納されます。

チャネルバイトインデックス
RbaseByte + 0
GbaseByte + 1
BbaseByte + 2
AbaseByte + 3

基本インデックスは次のように計算されます。

baseByte = ((int)pixel.y * (int)_OutputWidth + (int)pixel.x) * 4;

返されるフラグメントの色は次のとおりです。

float4(b0 / 255.0, b1 / 255.0, b2 / 255.0, b3 / 255.0)

baseByte >= _ByteCount の場合、フラグメントは黒の透明なゼロを返します。

TSMPDecodeByteOutputFragment(v2f i)​

float4 TSMPDecodeByteOutputFragment(v2f i)

インクルードによってエクスポートされるメインのヘルパー関数。それ:

  1. i.uv を出力ピクセル座標に変換します。
  2. ピクセル座標を出力テクスチャ境界にクランプします。
  3. そのピクセルの最初のバイト インデックスを計算します。
  4. TSMP_DECODE_BYTE_FUNC を最大 4 バイト呼び出します。
  5. それらのバイトを RGBA チャネルにパックします。

この関数は、シェーダに独自の frag エントリ ポイントがすでにある場合に使用します。

デフォルト frag(v2f i)​

抑制されない限り、インクルードは以下を定義します。

float4 frag(v2f i) : SV_Target
{
return TSMPDecodeByteOutputFragment(i);
}

これは、パスがバイト出力テクスチャのみを書き込む単純なデコード マテリアルに便利です。

TSMP_SUPPRESS_DEFAULT_FRAG​

独自のフラグメント関数を提供する場合は、ファイルをインクルードする前に TSMP_SUPPRESS_DEFAULT_FRAG を定義します。

#define TSMP_SUPPRESS_DEFAULT_FRAG
#include "Packages/com.kibalab.tsmp.core/Runtime/Codecs/Common/Shaders/cgincs/TSMPDecodeByteOutput.cginc"

float4 frag(v2f i) : SV_Target
{
return TSMPDecodeByteOutputFragment(i);
}

これは、パスに追加のデバッグ出力、条件付きロジック、または別のエントリ ポイント名が必要な場合に便利です。

最小限のシェーダーパスの例​

struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};

float _OutputWidth;
float _OutputHeight;
float _ByteCount;

int DecodeByte(int byteIndex)
{
return byteIndex & 255;
}

#include "Packages/com.kibalab.tsmp.core/Runtime/Codecs/Common/Shaders/cgincs/TSMPDecodeByteOutput.cginc"

この例では、予測可能なバイト パターンを出力テクスチャに書き込みます。実際のコーデックは、代わりに TSMP ソース フレームからデコードする必要があります。

よくある間違い​

症状考えられる原因
出力はすべてゼロです_ByteCount がゼロであるか、DecodeByte は常にゼロを返します。
最後のバイトにゴミが含まれていますDecodeByte は、ペイロード長を超えるインデックスを保護しません。
4 バイトごとに誤りがありますRGBA チャネルの順序が出力レイアウトと一致しません。
エディターでは動作するが、実行時には失敗するシェーダーのプロパティ名またはマテリアルの設定は、ランタイム パスによって異なります。
フレームが小さくなった後の古いバイト出力テクスチャはクリアされず、デコーダは _ByteCount を超える値を読み取ります。