在iOS 8中,金属中的浮动分割存在问题,妨碍了正确的纹理投影,which I solved。
今天我发现iOS 9上的纹理投影再次被打破,虽然我不确定原因。
在CPU(使用OpenCV)和GPU上扭曲纹理的结果是不一样的。如果您从iOS 9运行this example app(已包含iOS 8修复程序),您可以在iPhone上看到。
预期的 CPU warp为红色,而Metal完成的GPU warp为绿色,因此它们重叠的位置为黄色。理想情况下,您不应该看到绿色或红色,而只能看到黄色。
你可以:
着色器代码为:
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;
}
答案 0 :(得分:2)
不要问我为什么,但如果我将扭曲的坐标乘以1.00005
或任何接近1.0
的数字,则它是固定的(除了非常微小的细节)。请参阅示例应用程序库中的最后一次提交。