我正在使用SharpDX Toolkit,我試圖以編程方式創建Texture2D,因此我可以手動指定所有像素值。我不確定用什麼像素格式來創建它。如何在創建新的Texture2D時選擇像素格式?
SharpDX甚至沒有記錄工具包的PixelFormat類型(他們有another PixelFormat class的文檔,但它是WIC而不是工具包)。我確實發現了DirectX枚舉包裝,DXGI_FORMAT,但其文檔沒有給出我如何選擇格式的任何有用的指導。
我已經習慣了普通的舊的32位位圖格式具有每顏色通道加上8位α,這是足夠好的夠我8位。所以我猜猜最簡單的選擇是R8G8B8A8或B8G8R8A8。這是我選擇的重要嗎?他們都會在所有硬件上得到全面支持嗎?
,甚至一度我選擇了其中的一個,然後我需要進一步明確它是否是聖馬丁,SNORM,無類型,UINT,UNorm,或UNormSRgb。我不需要sRGB色彩空間。我不明白無類型應該是什麼。 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);
這繪製一個小矩形與斜線的左上角屏幕。它適用於我正在測試的筆記本電腦,但我不知道如何知道這是否意味着它可以在任何地方工作,也不知道它是否會成爲性能最高的筆記本電腦。
我應該使用什麼像素格式,以確保我的應用程序將在所有的硬件工作,以獲得最佳的性能?
問題的部分 - UINT將返回值作爲着色器的整數,unorm將它們作爲浮點數而這正是普遍預期在顏色的着色的範圍0.0..1.0,和你一般需要從像素着色器返回。如果你採樣了「int」紋理並且轉換了你的着色器中的值,它可能會起作用。 – jcoder
@ J99:據我所知,圖片中沒有着色器。我只是試圖使用SpriteBatch在屏幕上放置一個位圖,並且據我所知,DirectX調用位圖「紋理」。是否有我缺少的相關細節? –
好的,我會在庫中內部使用一個着色器,但如果你沒有訪問它,那麼這是行不通的。對不起 – jcoder