私は非常に単純な CCScene を持っており、以下を含む CCLayer は 1 つだけです。
- 標準描画モードの背景用 CCSprite
- CCRenderTexture を使用してペイント ブラシを描画し、そのスプライトを背景スプライトの上のルート CCLayer にアタッチします。
_bgSprite = [CCSprite spriteWithFile:backgroundPath]; _renderTexture = [CCRenderTexture renderTextureWithWidth:self.contentSize.width 高さ:self.contentSize.height]; [_renderTexture.sprite setBlendFunc:(ccBlendFunc){GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}]; [self addChild:_bgSprite z:-100]; [self addChild:_renderTexture];
ブラシ レンダリング コード:
[_renderTexture begin];
glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ONE, GL_ONE); // 1.
// calculate vertices code,etc...
glDrawArrays(GL_TRIANGLES, 0, (GLsizei)count);
[_renderTexture end];
ユーザーが最初の色付きブラシでブラシをかけると、期待どおりに背景とブレンドされます。しかし、前のブラシの上に別の色でブラッシングを続けると、うまくいきません (2 つのブラシが重なり合うと、ソフト アルファ エッジの不透明度が失われます)。
多くのブレンドオプションを試しましたが、どういうわけか正しいものを見つけることができません.
CCRenderTexture が期待どおりに (以前に描画されたコンテンツと) ブレンドされないという特別な点はありますか?
ブラッシングに使用する私のフラグメント シェーダーは、テクスチャーの入力カラー アルファを保持するためにマイナーな変更を加えた単なる標準的なテクスチャー シェーダーです。
ボイドメイン() { gl_FragColor = texture2D(u_texture, v_texCoord); gl_FragColor.a = v_fragmentColor.a; }
更新 - ほぼ完璧な解決策: jozxyqk
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
レンダリング コードで ( と の代わり// 1.
に
[_renderTexture.sprite setBlendFunc:(ccBlendFunc){GL_ONE, GL_ONE_MINUS_SRC_ALPHA}];
これはうまく機能し、私が望むものを与えてくれます...
...ただし、_rederTexture が完全に不透明な場合のみ。
の不透明度を_rendertexture.sprite
下げると、予想どおりにブラシがフェードアウトするのではなく、明るくなります。
親テクスチャが完全に不透明なときにブラシのアルファが背景と正しくブレンドされるのに、不透明度が下がるとバナナになるのはなぜですか? ブラシを背景と正しくブレンドするにはどうすればよいですか?