2015-09-23 3 views
0

В 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; 
} 

ответ

2

Не спрашивайте меня, почему, но если я умножить деформированные координаты на 1.00005 или любое количество близко к 1.0, она фиксируется (за исключением очень мелких деталей) , См. Последнюю фиксацию в примере репо приложения.