2016-03-22 23 views
1

glBlendColorとglBlendFuncを使用してGLKViewで2つの画像を合成する際に問題があります。設定した色が結果の出力に影響を与えないため、実際には色を設定していないようです。私はglBlendColorを使用して、不透明度が1のフレームバッファに既にある画像の上にあるさまざまな不透明度で画像を合成しようとしています。glBlendColorがiOSで動作しない

どこが間違っているのか誰かに教えてもらえますか?私はXcode 7.3でiOS 9.3用に書いています。私のコードは次のとおりです。これは、image1をimage2に置き換えます。透明度はありませんが、image1の上にimage2を0.5の不透明度で置きます。

let glContext = EAGLContext(API: .OpenGLES3) 
let glView = GLKView(frame: view.frame, context: glContext) 
let ciContext = CIContext(EAGLContext: glContext) 

view.addSubview(glView) 


let uiImage1 = UIImage(named: "1.jpg")! 
let image1 = CIImage(image: uiImage1)! 

let uiImage2 = UIImage(named: "2.jpg")! 
let image2 = CIImage(image: uiImage2)! 


glView.bindDrawable() 

ciContext.drawImage(image1, inRect: image1.extent, fromRect: image1.extent) 

glEnable(GLenum(GL_BLEND)) 
glBlendFunc(GLenum(GL_CONSTANT_ALPHA), GLenum(GL_ONE_MINUS_CONSTANT_ALPHA)) 
glBlendColor(0, 0, 0, 0.5) 

ciContext.drawImage(image2, inRect: image2.extent, fromRect: image2.extent) 

glView.display() 
+0

私は答えを持っていませんが、誰かがこれを見て助けてくれればと思います: 'drawImages'の後にいくつかの' glGets'を投げてみたところ、有効とブレンドがまだ設定されていることを確認しました。私はまた、ブレンド機能を 'GL_ONE'、' GL_ONE'に切り替えて、追加の描画を確認しました。ですから、私は 'CIContext'が何かを修正しているとは思わないし、すべてのフラグメントが確実に出力ステージに到達しています。 – Tommy

+0

@トミー、コメントありがとう。ええ、私はCoreImageを使って不透明度を上げて成功しました。そして、 'glBlendFunc'は既に透明な第2の画像を最初のものに置きますが、CoreImageをスキップして、' glBlendColor'を使って不透明度を作ると、不透明度調整なし。これは、何らかの理由でCoreImageコンテキストが 'glBlendColor'でうまく動かないと思います。 –

答えて

0

それがすべての答えを見つけることに向け役立つ場合は、IOSのは、フラグメントシェーダが有するであろう合成操作を実装するために使用することができる[]は入力として既存のフレームバッファのデータを読み取ることができるメカニズムを提供する」、EXT_shader_framebuffer_fetchサポート固定機能のブレンドでは不便または不可能でした。 Apple explicitly advertises itは「プログラマブルブレンディングのためにフレームバッファデータをフェッチする」機会として扱われています。

観察された振る舞いがどのようになるかは不明です。追加混合モードは尊重されますが、混合色に対して乗法性はありません。しかし、これは期待が妨げられる理由を説明するのに役立ちます。

関連する問題