下記のようなkernelを使ってCIFilterを作成したのですが、思ったように画素値が変換されません。
わかる方いらっしゃいましたら、ご教授お願いいたします。
class ACVFilter: CIFilter { var kernel: CIKernel! var inputImage: CIImage! var toneCurveTexture: CIImage! override init() { super.init() self.kernel = createKernel() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func output() -> CIImage? { if let inputImage = self.inputImage { let args: [AnyObject] = [inputImage as AnyObject, toneCurveTexture as AnyObject] let dod = inputImage.extent.insetBy(dx: 0, dy: 0) return kernel.apply(withExtent: dod, roiCallback: { (index, rect) in return rect.insetBy(dx: 0, dy: 0) }, arguments: args) } return nil } private func createKernel() -> CIKernel { let kernelString = self._shaderString return CIKernel(string: kernelString)! } var shaderString: String { return "kernel vec4 filterKernel(sampler inputImage, sampler toneCurveTexture) {\n" + " vec4 textureColor = sample(inputImage,samplerCoord(inputImage));\n" + " float redCurveValue = sample(toneCurveTexture, vec2(textureColor.r, 1.0)).r;\n" + " float greenCurveValue = sample(toneCurveTexture, vec2(textureColor.g, 1.0)).g;\n" + " float blueCurveValue = sample(toneCurveTexture, vec2(textureColor.b, 1.0)).b;\n" + "return vec4(vec3(redCurveValue, greenCurveValue, blueCurveValue),textureColor.a);\n" + "}\n" } }
toneCurveTextureにphotoshopのトーンカーブの入出力を再現するlutをインプットして画像にフィルターを掛け用途しています。
####問題
plene.pngは左からrgbが[0,0,0], [1,1,1],[2,2,2]という感じの256*256の画材です。
inputImageとtoneCureveTextureにplane.pngを入力したところ、
output.pngが出力されてしました。
この例では入力と出力は同じ画像のはずなのですが、原因が
わかる方いらっしゃいましたら、ご教授ください。
あなたの回答
tips
プレビュー