0

ゲームは、ソフトウェア レンダリングを使用して、フルスクリーンのパレット (8 ビット) 画像をメモリに描画します。

Direct3D を使用して、その画像を画面に表示する最速の方法は何ですか?

現在、パレット イメージをソフトウェアで RGB に変換してから、D3DUSAGE_DYNAMICテクスチャに配置します (これは でロックされていD3DLOCK_DISCARDます)。

もっと速い方法はありますか?たとえば、シェーダーを使用してパレット化を実行しますか?

関連する質問:

4

2 に答える 2

4

D3DFMT_L8パレット画像を含むテクスチャと、パレットを含む256x1画像を作成しますD3DFMT_X8R8G8B8

HLSLシェーダーコード:

uniform sampler2D image;
uniform sampler1D palette;

float4 main(in float2 coord:TEXCOORD) : COLOR
{
    return tex1D(palette, tex2D(image, coord).r * (255./256) + (0.5/256));
}

輝度(パレットインデックス)は、乗算加算操作で調整されることに注意してください。これが必要なのは、パレットインデックス255が白(最大輝度)と見なされ、フロートとして表されると1.0fになるためです。その座標でパレットテクスチャを読み取ると、(部分部分のみが使用されるため)ラップアラウンドし、代わりに最初のパレットエントリを読み取ります。

コンパイル:

fxc /Tps_2_0 PaletteShader.hlsl /FhPaletteShader.h

次のように使用します。

// ... create and populate texture and paletteTexture objects ...
d3dDevice->CreatePixelShader((DWORD*)g_ps20_main, &shader)
// ...
d3dDevice->SetTexture(1, paletteTexture);
d3dDevice->SetPixelShader(shader);
// ... draw texture to screen as textured quad as usual ...
于 2012-10-30T23:49:48.010 に答える
1

パレット化を処理する単純なピクセル シェーダーを作成できます。L8 動的テクスチャを作成し、パレット化された画像をそれにコピーして、パレット ルックアップ テクスチャ (または定数メモリ内の色の配列) を作成します。次に、テクスチャとして設定されたパレット化された画像と、ルックアップ テクスチャまたは定数バッファからパレット ルックアップを実行するピクセル シェーダを使用してフルスクリーン クワッドをレンダリングします。

とはいえ、CPU でパレット変換を実行しても、最新の CPU ではそれほどコストがかからないはずです。それがパフォーマンスのボトルネックであると確信していますか?

于 2012-10-30T21:30:57.127 に答える