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);
これにより、画面の左上に対角線のある小さな長方形が描画されます。テストしているラップトップで動作しますが、それがどこでも動作するかどうかを知る方法も、最もパフォーマンスが高いかどうかもわかりません。
アプリがすべてのハードウェアで動作することを確認し、最高のパフォーマンスを得るには、どのピクセル形式を使用する必要がありますか?