1
正如Apple的文檔中所述,着色語言的texture2d可以是int類型。我曾嘗試使用int類型的texture2d作爲着色器語言的參數,但是texture2d的寫入方法失敗。text2d <int,access:write>的寫入方法在金屬着色器功能中不起作用
kernel void dummy(texture2d<int, access::write> outTexture [[ texture(0) ]],
uint2 gid [[ thread_position_in_grid ]])
{
outTexture.write(int4(2, 4, 6, 8), gid);
}
但是,如果我用float替換int,它就起作用了。
kernel void dummy(texture2d<float, access::write> outTexture [[ texture(0) ]],
uint2 gid [[ thread_position_in_grid ]])
{
outTexture.write(float4(1.0, 0, 0, 1.0), gid);
}
莫非其他類型的Texture2D的,詮釋這樣的Texture2D,短的Texture2D等,被用作着色器的功能參數,以及如何使用它們?感謝您審查我的問題。
的相關主機代碼:
MTLTextureDescriptor *desc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm
desc.usage = MTLTextureUsageShaderWrite;
id<MTLTexture> texture = [device newTextureWithDescriptor:desc];
[commandEncoder setTexture:texture atIndex:0];
的代碼來顯示由GPU計算出的輸出,w和h表示textrue的寬度和高度,分別。
uint8_t* imageBytes = malloc(w*h*4);
memset(imageBytes, 0, w*h*4);
MTLRegion region = MTLRegionMake2D(0, 0, [texture width], [texture height]);
[texture getBytes:imageBytes bytesPerRow:[texture width]*4 fromRegion:region mipmapLevel:0];
for(int j = 0; j < h; j++)
{
printf("%3d: ", j);
for(int i = 0; i < w*pixel_size; i++)
{
printf(" %3d",imageBytes[j*w*pixel_size+i]);
}
printf("\n")
}
@ Marius。感謝您的答覆。 API(主機代碼)匹配是什麼意思?相關的主機代碼也在上面列出。請您指出是否有任何問題? – Pony
setTexture之前確保您的紋理數據也是int。如果你不能以這種方式工作,你也可以在寫入outTexture之前將這些整數轉換爲浮點數。 – Marius