我正在尝试用值手动填充一维纹理并将该纹理传递给计算着色器(这些是我想通过代码设置的 2 个像素,它们不代表任何图像)。
由于当前少量的 Metal 示例,我能找到的所有示例都处理通过将加载的字节数据转换为原始字节数据来加载纹理的2D 纹理UIImage
,但创建一个虚拟UIImage
对象对我来说就像是 hack。
这是我开始的“天真”方式 -
...
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);
但 Metal 无法识别着色器中的这些值(它得到一个空纹理,第一个值除外)。
我很快意识到 Float 数组可能必须转换为字节数组(例如UInt8
),但找不到从任何一个转换[Float]
为的[UInt8]
方法。
我考虑的另一个可能的选择是使用CVPixelBuffer
对象,但这也感觉像是解决问题的方法。
那么解决这个问题的正确方法是什么?
提前致谢。
- 请注意我不熟悉Objective-C,因此我不确定使用
CVPixelBuffer
/是否UIImage
被夸大了一些应该直截了当的东西。