2012-11-20 60 views
4

我正在使用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); 

這繪製一個小矩形與斜線的左上角屏幕。它適用於我正在測試的筆記本電腦,但我不知道如何知道這是否意味着它可以在任何地方工作,也不知道它是否會成爲性能最高的筆記本電腦。

我應該使用什麼像素格式,以確保我的應用程序將在所有的硬件工作,以獲得最佳的性能?

+0

問題的部分 - UINT將返回值作爲着色器的整數,unorm將它們作爲浮點數而這正是普遍預期在顏色的着色的範圍0.0..1.0,和你一般需要從像素着色器返回。如果你採樣了「int」紋理並且轉換了你的着色器中的值,它可能會起作用。 – jcoder

+0

@ J99:據我所知,圖片中沒有着色器。我只是試圖使用SpriteBatch在屏幕上放置一個位圖,並且據我所知,DirectX調用位圖「紋理」。是否有我缺少的相關細節? –

+0

好的,我會在庫中內部使用一個着色器,但如果你沒有訪問它,那麼這是行不通的。對不起 – jcoder

回答

3

在SharpDX工具包映射到底層的DirectX/DXGI格式的格式,這樣你就可以像往常一樣與微軟產品,獲得來自MSDN的信息:

DXGI_FORMAT enumeration (Windows)

32位紋理是大多數紋理場景的常見選擇,並且在較舊的硬件上具有良好的性能。正如已經在評論中回答的那樣,UNorm意味着「在0.0..1.0的範圍內」,這也是訪問紋理中顏色數據的常用方法。

如果你看一下Hardware Support for Direct3D 10Level9 Formats (Windows)頁面,你會看到,DXGI_FORMAT_R8G8B8A8_UNORM以及DXGI_FORMAT_B8G8R8A8_UNORM支持在DirectX 9硬件。你不會遇到兼容性問題。

性能達到你的設備是如何初始化(RGBA/BGRA?)什麼硬件(=支持DX特徵級)和OS您運行的軟件。你將不得不運行你自己的測試來找出它(儘管在這些常見和類似的格式中,差異應該是最多一位數的百分比)。

+0

是的,但我認爲UNorm是一個糟糕的選擇*,因爲*它將(某些)事物當作浮動,現代(24或32位)視頻模式中的顏色通常表示爲每個通道的字節 - - 所有整數,不漂浮;浮點數與整數相比較慢。那麼DirectX真的將顏色表示爲浮點而不是?看起來像是爲硬件做了很多額外的工作。 –

+0

@JoeWhite:由於規範化,沒有浮點:0x00表示0/255 = 0,0x01表示1/255,0xFF表示255/255 = 1。 (雖然他們會在着色器中解決浮點問題,但這就是他們需要用其他顏色進行乘法的方法)。它也不是一個特殊的DirectX事物,但在圖形庫中很常見,你可以在[Image Format - OpenGL-Wiki](http://www.opengl.org/wiki/Image_Format)上看到。 –

相關問題