我試圖用手動填充1D紋理並將該紋理傳遞給計算着色器(這些是我想通過代碼設置的2個像素,它們不代表任何圖像)。手動設置金屬1D紋理
由於金屬的例子目前量小,所有的例子我能找到對付2D紋理通過轉換加載UIImage
原始字節的數據,而是創建一個虛擬UIImage
載入紋理感覺就像一個黑客對我來說。
這是「幼稚」的方式,我開始用 -
...
var manualTextureData: [Float] = [ 1.0, 0.0, 0.0, 1.0,
0.0, 0.0, 1.0, 1.0 ];
let region: MTLRegion = MTLRegionMake1D(0, textureDescriptor.width);
myTexture.replaceRegion(region, mipmapLevel: 0, withBytes: &manualTextureData, bytesPerRow: 0);
但金屬不着色器(它得到一個空的紋理,除了第一個值)識別這些值。
我很快意識到浮點數組可能必須轉換爲字節數組(例如UInt8
),但無法找到將[Float]
轉換爲[UInt8]
的方法。
我考慮的另一種可能的選擇是使用一個CVPixelBuffer
對象,但這也感覺就像解決問題的方法。
那麼最好的解決方法是什麼?
在此先感謝。
- 請注意,我不熟悉Objective-C的,所以我不知道用
CVPixelBuffer
/UIImage
是否是誇大了一些東西,應該是直接的。
金屬規範規定1D紋理(只)需要bytesPerRow設置爲0 :-) – Aquatic 2014-11-05 06:13:20