OpenGL:宛先アルファを変更せずにRGBA-> RGBAブリッティングを行う方法
-
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つのカラーコンポーネントのそれぞれへの書き込みを有効または無効にできます。