金属 RGB 到 YUV 转换计算着色器 [英] Metal RGB to YUV conversion compute shader
问题描述
我正在尝试编写用于从 RGB 转换为 YUV 的 Metal 计算着色器,但出现构建错误.
I am trying to write a Metal compute shader for converting from RGB to YUV, but am getting build errors.
typedef struct {
float3x3 matrix;
float3 offset;
} ColorConversion;
// Compute kernel
kernel void kernelRGBtoYUV(texture2d<half, access::sample> inputTexture [[ texture(0) ]],
texture2d<half, access::write> textureY [[ texture(1) ]],
texture2d<half, access::write> textureCbCr [[ texture(2) ]],
constant ColorConversion &colorConv [[ buffer(0) ]],
uint2 gid [[thread_position_in_grid]])
{
// Make sure we don't read or write outside of the texture
if ((gid.x >= inputTexture.get_width()) || (gid.y >= inputTexture.get_height())) {
return;
}
float3 inputColor = float3(inputTexture.read(gid).rgb);
float3 yuv = colorConv.matrix*inputColor + colorConv.offset;
half2 uv = half2(yuv.gb);
textureY.write(half(yuv.x), gid);
if (gid.x % 2 == 0 && gid.y % 2 == 0) {
textureCbCr.write(uv, uint2(gid.x / 2, gid.y / 2));
}
}
最后一行,即写入textureCbCr会抛出错误:
The last line, i.e. write to textureCbCr throws an error:
no matching member function for call to 'write'
我做错了什么?
推荐答案
根据Metal Shading Language Specification,write
在texture2d<>
的所有重载的第一个参数code> 是 4 元素向量.即使您正在写入的纹理少于 4 个组件也是如此.因此,您可以通过将错误的行替换为:
According to the Metal Shading Language Specification, the first parameter of all overloads of write
on texture2d<>
are 4-element vectors. This is the case even if the texture you're writing to has fewer than 4 components. So you can fix this by replacing the erroneous line with:
textureCbCr.write(half4(yuv.xyzz), uint2(gid.x / 2, gid.y / 2));
并且在执行写入时会屏蔽掉多余的组件.
And the superfluous components will be masked out when performing the write.
这篇关于金属 RGB 到 YUV 转换计算着色器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!