Ios 苹果又破坏了纹理投影吗?

Ios 苹果又破坏了纹理投影吗?,ios,3d,texture-mapping,metal,Ios,3d,Texture Mapping,Metal,在iOS 8中,金属中浮标的划分存在问题,妨碍了正确的纹理投影 今天我发现iOS 9上的纹理投影又被破坏了,尽管我不知道为什么 在CPU(使用OpenCV)和GPU上扭曲纹理的结果不同。如果您从iOS 9运行(已经包括iOS 8的修复程序),您可以在iPhone上看到 预期的CPU扭曲为红色,而GPU扭曲由金属制成为绿色,因此它们重叠的地方为黄色。理想情况下,你不应该看到绿色或红色,而应该看到黄色的阴影 你能: 确认你方存在问题 对任何可能出错的事情给出建议 着色器代码为: struct V

在iOS 8中,金属中浮标的划分存在问题,妨碍了正确的纹理投影

今天我发现iOS 9上的纹理投影又被破坏了,尽管我不知道为什么

在CPU(使用OpenCV)和GPU上扭曲纹理的结果不同。如果您从iOS 9运行(已经包括iOS 8的修复程序),您可以在iPhone上看到

预期的CPU扭曲为红色,而GPU扭曲由金属制成为绿色,因此它们重叠的地方为黄色。理想情况下,你不应该看到绿色或红色,而应该看到黄色的阴影

你能:

  • 确认你方存在问题
  • 对任何可能出错的事情给出建议
着色器代码为:

struct VertexInOut
{
  float4 position [[ position ]];
  float3 warpedTexCoords;
  float3 originalTexCoords;
};

vertex VertexInOut warpVertex(uint vid [[ vertex_id ]],
                              device float4 *positions [[ buffer(0) ]],
                              device float3 *texCoords [[ buffer(1) ]])
{
  VertexInOut v;
  v.position = positions[vid];

  // example homography
  simd::float3x3 h = {
    {1.03140473, 0.0778113901, 0.000169219566},
    {0.0342947133, 1.06025684, 0.000459250761},
    {-0.0364957005, -38.3375587, 0.818259298}
  };

  v.warpedTexCoords = h * texCoords[vid];
  v.originalTexCoords = texCoords[vid];

  return v;
}

fragment half4 warpFragment(VertexInOut inFrag [[ stage_in ]],
                            texture2d<half, access::sample> original [[ texture(0) ]],
                            texture2d<half, access::sample> cpuWarped [[ texture(1) ]])
{
  constexpr sampler s(coord::pixel, filter::linear, address::clamp_to_zero);
  half4 gpuWarpedPixel = half4(original.sample(s, inFrag.warpedTexCoords.xy * (1.0 / inFrag.warpedTexCoords.z)).r, 0, 0, 255);
  half4 cpuWarpedPixel = half4(0, cpuWarped.sample(s, inFrag.originalTexCoords.xy).r, 0, 255);

  return (gpuWarpedPixel + cpuWarpedPixel) * 0.5;
}
struct VertexInOut
{
浮动4位[[位]];
漂浮3个弯曲的护壁;
浮式3原盾;
};
顶点顶点顶点扭曲顶点(uint vid[[vertex_id]],
设备浮动4*个位置[[缓冲区(0)],
设备浮动3*texCoords[[缓冲区(1)])
{
顶点v;
v、 位置=位置[vid];
//示例单应
simd::float3x3 h={
{1.03140473, 0.0778113901, 0.000169219566},
{0.0342947133, 1.06025684, 0.000459250761},
{-0.0364957005, -38.3375587, 0.818259298}
};
v、 翘曲特克斯库德=h*texCoords[vid];
v、 原始Excoords=texCoords[vid];
返回v;
}
碎片半4翘曲碎片(垂直下[[stage_in]],
纹理2D原始[[纹理(0)],
纹理2D cpuWarped[[纹理(1)])
{
constexpr采样器s(坐标::像素,滤波器::线性,地址::钳位到零);
half4 gpuWarpedPixel=half4(原始.sample(s,inFrag.warpedTexCoords.xy*(1.0/inFrag.warpedTexCoords.z)).r,0,0,255);
half4 cpuWarpedPixel=half4(0,cpuWarped.sample(s,inFrag.originalTexCoords.xy)。r,0,255);
返回值(gpuWarpedPixel+cpuWarpedPixel)*0.5;
}

不要问我为什么,但如果我将扭曲坐标乘以
1.00005
或任何接近
1.0
的数字,它是固定的(除了非常微小的细节)。请参阅示例应用程序repo中的最后一次提交