此金属着色器的输入是来自iOS相机的bgra图像(在0-1范围内),输出应该是rgba缩放到0-255范围(注意内核中的x256)。但我不明白为什么内核的输出似乎被限制回0-1范围。金属是否会在纹理中写出一个夹子?或者我错过了什么?
kernel void bgraScaleKernel(
texture2d<float, access::read> inputImage [[texture(0)]],
texture2d<float, access::write> outputImage [[texture(1)]],
const device int *starting [[ buffer(0) ]],
uint2 gid [[thread_position_in_grid]])
{
uint i = gid.x+starting[0];
uint j = gid.y+starting[1];
float4 pixel_new = (inputImage.read(uint2 (i, j)).bgra)*256;
outputImage.write(pixel_new, (uint2)(i,j));
};
我有一堆其他过滤器层在此之后应用,他们假设rgba(0-255)浮点值(它从OpenCL移植并更改它将需要更改Androi,Windows和Mac版本)。所以我需要金属层的输出在0-255范围内。
答案 0 :(得分:0)
8Unorm
像素格式使用[0,255]范围内的整数表示内存中的值,但在着色器中,这些值显示为[0.0,1.0]范围内的浮点数。
要获得您显然需要的结果,您只需将从inputImage
读取的浮点值直接指定给outputImage
,而不必乘以256(或255)。金属为你做到了。通过自己完成,您将大多数值设置为大于1.0,因此Metal在将其自身转换为8Unorm
之前将其限制为1.0。