В iOS 8 возникла проблема с разделением поплавков в металле, предотвращающим правильную текстурированную проекцию, which I solved.Разве Apple снова переделала текстуру?
Сегодня я обнаружил, что текстурная проекция на iOS 9 сломана снова, хотя я не уверен, почему.
Результат искажения текстуры на процессоре (с OpenCV) и на графическом процессоре - это не то же самое. Вы можете видеть на вашем iPhone, если вы запустите this example app (уже включает исправление для прошивки 8) с прошивки 9.
ожидается 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;
}