5

SharpDX Toolkitを使用していて、Texture2Dをプログラムで作成しようとしているので、すべてのピクセル値を手動で指定できます。そして、それを作成するためのピクセル形式がわかりません。

SharpDXは、ツールキットのPixelFormatタイプについても文書化していません(別のPixelFormatクラスの文書はありますが、ツールキットではなくWIC用です)。ラップするDirectX列挙型DXGI_FORMATを見つけましたが、そのドキュメントには、フォーマットの選択方法に関する有用なガイダンスがありません。

私は、カラーチャネルあたり8ビットと8ビットアルファを備えた古い32ビットビットマップ形式に慣れています。これで十分です。ですから、最も簡単な選択肢はR8G8B8A8またはB8G8R8A8だと思います。どちらを選ぶかは重要ですか?両方ともすべてのハードウェアで完全にサポートされますか?

そして、それらの1つを選択した後でも、それがSInt、SNorm、Typeless、UInt、UNorm、またはUNormSRgbのいずれであるかをさらに指定する必要があります。sRGB色空間は必要ありません。Typelessが何のためにあるのかわかりません。UIntは最も単純なように見えますが、単純な古い符号なしバイトですが、機能しないことがわかりました。エラーは発生しませんが、テクスチャが画面に何も描画しません。UNormは機能しますが、UIntが機能しない理由を説明するドキュメントはありません。だから今、私はUNormが他のビデオカードでは動作しないかもしれないという妄想を抱いています。

誰かがそれを見たいのなら、これが私が持っているコードです。SharpDXフルパッケージをダウンロードし、SharpDXToolkitSamplesプロジェクトを開き、SpriteBatchAndFont.WinRTXamlプロジェクトに移動し、SpriteBatchAndFontGameクラスを開き、示された場所にコードを追加します。

// Add new field to the class:
private Texture2D _newTexture;

// Add at the end of the LoadContent method:
_newTexture = Texture2D.New(GraphicsDevice, 8, 8, PixelFormat.R8G8B8A8.UNorm);
var colorData = new Color[_newTexture.Width*_newTexture.Height];
_newTexture.GetData(colorData);
for (var i = 0; i < colorData.Length; ++i)
    colorData[i] = (i%3 == 0) ? Color.Red : Color.Transparent;
_newTexture.SetData(colorData);

// Add inside the Draw method, just before the call to spriteBatch.End():
spriteBatch.Draw(_newTexture, new Vector2(0, 0), Color.White);

これにより、画面の左上に対角線のある小さな長方形が描画されます。テストしているラップトップで動作しますが、それがどこでも動作するかどうかを知る方法も、最もパフォーマンスが高いかどうかもわかりません。

アプリがすべてのハードウェアで動作することを確認し、最高のパフォーマンスを得るには、どのピクセル形式を使用する必要がありますか?

4

1 に答える 1

3

SharpDX Toolkitの形式は、基盤となるDirectX / DXGI形式にマップされるため、Microsoft製品の場合と同様に、MSDNから情報を取得できます。

DXGI_FORMAT列挙(Windows)

32ビットテクスチャは、ほとんどのテクスチャシナリオで一般的な選択肢であり、古いハードウェアで優れたパフォーマンスを発揮します。UNormは、コメントですでに回答されているように、「0.0 .. 1.0の範囲」を意味し、これもテクスチャのカラーデータにアクセスするための一般的な方法です。

Direct3D 10Level9形式のハードウェアサポート(Windows)ページを見ると、DXGI_FORMAT_R8G8B8A8_UNORMとDXGI_FORMAT_B8G8R8A8_UNORMがDirectX9ハードウェアでサポートされていることがわかります。両方の互換性の問題に遭遇することはありません。

パフォーマンスは、デバイスの初期化方法(RGBA / BGRA?)、およびソフトウェアを実行しているハードウェア(=サポートされているDX機能レベル)とOSによって異なります。それを見つけるには、独自のテストを実行する必要があります(ただし、これらの一般的で類似した形式の場合、差は最大で1桁のパーセンテージである必要があります)。

于 2012-11-25T07:21:09.327 に答える