2015-09-14 6 views
5

マップRチャンネルから水平方向に、Gチャンネルから垂直方向にピクセルを移動するiOS 8のディスプレイスメントマップcikernelを作成しようとしています。 マップピクセル座標は、元のイメージサイズを基準にして選択する必要があります。mapPixel =((dest.x/source.width)* map.width、(dest.y/source.height)* map.height)カスタムCIKernelディスプレイスメントマップ

私はテスト入力画像サイズは2048×2048 あり、マップは、X 2560クォーツComposerで

2560赤 - 緑Perlinノイズであるcikernel動作ほぼ予想通り、マップは画像全体

に適用されていないことを除いて
kernel vec4 coreImageKernel(sampler image, sampler displaceMap, float scaleX, float scaleY) 
{ 
vec2 destination = destCoord(); 

vec2 imageSize = samplerSize(image); 
float xPercent = destination.x/imageSize.x; 
float yPercent = destination.y/imageSize.y; 

vec2 mapSize = samplerSize(displaceMap); 
vec2 mapCoord = vec2(mapSize.x * xPercent, mapSize.y * yPercent); 

vec4 mapPixel = sample(displaceMap, mapCoord); 
float ratioShiftX = ((mapPixel.x) * 2.0) - 1.0; 
float ratioShiftY = ((mapPixel.y) * 2.0) - 1.0; 
vec2 pixelShift = vec2(ratioShiftX * scaleX, ratioShiftY * scaleY); 

return sample(image, destination - pixelShift); 
} 

次に、フィルタ機能の例を示します。

function __image main(__image image, __image displaceMap, __number scaleX, __number scaleY) { 
    return coreImageKernel.apply(image.definition, null, image, displaceMap, scaleX, scaleY); 
} 

しかし、私はCIFilterでcikernelを読み込むときの結果は、私はクォーツコンポーザーで見たものはほど遠いです。ここ はCIFilter

override var outputImage:CIImage? { 
    if let inputImage = inputImage { 
     if let inputMap = inputMap { 
      let args = [inputImage as AnyObject, inputMap as AnyObject, inputScaleX, inputScaleY] 

      return CIDisplacementMapFilter.kernel?.applyWithExtent(inputImage.extent, roiCallback: { 
        (index, rect) in 

        if index == 0 { 
         return rect 
        } 

        return CGRectInfinite 
       }, arguments: args) 
     } 
    } 

    return nil 
} 

に私はROIを推測しているように見える関数が適用されます私の何が間違っているとサンプラーがタイル張りされたが、私はそれを把握することはできません。

答えて

1

カーネルが間違っていたことが判明しました。ここ は、ジョブ

kernel vec4 displace(sampler source, sampler map, float scaleX, float scaleY) 
{ 

vec2 d = destCoord(); 
vec4 mapPixel = sample(map, samplerTransform(map, d)); 
float shiftX = ((mapPixel.x * 2.0) - 1.0) * scaleX; 
float shiftY = ((mapPixel.y * 2.0) - 1.0) * scaleY; 

vec2 s = samplerTransform(source, d + vec2(shiftX, shiftY)); 

return sample(source, s); 
} 
を行い、カーネルの
関連する問題