金属RGB到YUV转换计算着色器 [英] Metal RGB to YUV conversion compute shader

查看:130
本文介绍了金属RGB到YUV转换计算着色器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写用于从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'

我在做什么错了?

推荐答案

根据金属着色语言规范,texture2d<>write的所有重载的第一个参数是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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆