OpenGL:宛先アルファを変更せずにRGBA-> RGBAブリッティングを行う方法

StackOverflow https://stackoverflow.com/questions/146140

  •  02-07-2019
  •  | 
  •  

質問

OpenGL RGBAテクスチャがあり、フレームバッファオブジェクトを使用して別のRGBAテクスチャをブリットします。問題は、通常のブレンド関数を使用すると glBlendFunc(GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA)、 結果のブリットにより、デスティネーションテクスチャのアルファが変更され、以前アルファが1であった場所がわずかに透明になります。デスティネーションサーフェスアルファが変更されないようにしたいのですが、それ以外の場合、RGB値への影響は GL_SRC_ALPHAとまったく同じになりますおよび GL_ONE_MINUS_SRC_ALPHA 。したがって、ブレンドファクター関数は(As、As、As、0)および(1-As、1-As、1-As、1)である必要があります。どうすればそれを達成できますか?

役に立ちましたか?

解決

RGBとアルファのブレンドモードを異なる方程式に設定できます。

void glBlendFuncSeparate(
    GLenum srcRGB, 
    GLenum dstRGB, 
    GLenum srcAlpha, 
    GLenum dstAlpha);

あなたの場合、次の列挙型を使用します:

  glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);

glBlendFuncSeparate関数を拡張機能としてインポートする必要がある場合があることに注意してください。しかし、そうすることは安全です。この関数は非常に長い間使用されています。 OpenGL 1.4の一部です

同じことを行う別の方法は、glColorMaskを使用してアルファチャネルへの書き込みを無効にすることです。

void glColorMask( GLboolean red,
                  GLboolean green,
                  GLboolean blue,
                  GLboolean alpha )

OpenGLドライバーは最も一般的に使用される関数を最適化し、glColorMaskはめったに使用されないOpenGL関数の1つであるため、glBlendFuncSeparateよりも遅くなる可能性があります

不運な場合は、奇妙な関数を呼び出すことで、ソフトウェアレンダリングエミュレーションになることもあります:-)

他のヒント

glColorMask ()? 4つのカラーコンポーネントのそれぞれへの書き込みを有効または無効にできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top