示例#1
0
        public void SetBlendMode(BlendMode mode)
        {
            VerifyThreadAffinity();
            OpenGL.glBlendEquation(OpenGL.GL_FUNC_ADD);
            OpenGL.CheckGLError();

            switch (mode)
            {
            case BlendMode.None:
                OpenGL.glDisable(OpenGL.GL_BLEND);
                break;

            case BlendMode.Alpha:
                OpenGL.glEnable(OpenGL.GL_BLEND);
                OpenGL.CheckGLError();
                OpenGL.glBlendFunc(OpenGL.GL_ONE, OpenGL.GL_ONE_MINUS_SRC_ALPHA);
                break;

            case BlendMode.Additive:
            case BlendMode.Subtractive:
                OpenGL.glEnable(OpenGL.GL_BLEND);
                OpenGL.CheckGLError();
                OpenGL.glBlendFunc(OpenGL.GL_ONE, OpenGL.GL_ONE);
                if (mode == BlendMode.Subtractive)
                {
                    OpenGL.CheckGLError();
                    OpenGL.glBlendEquationSeparate(OpenGL.GL_FUNC_REVERSE_SUBTRACT, OpenGL.GL_FUNC_ADD);
                }

                break;

            case BlendMode.Multiply:
                OpenGL.glEnable(OpenGL.GL_BLEND);
                OpenGL.CheckGLError();
                OpenGL.glBlendFunc(OpenGL.GL_DST_COLOR, OpenGL.GL_ONE_MINUS_SRC_ALPHA);
                OpenGL.CheckGLError();
                break;

            case BlendMode.Multiplicative:
                OpenGL.glEnable(OpenGL.GL_BLEND);
                OpenGL.CheckGLError();
                OpenGL.glBlendFunc(OpenGL.GL_ZERO, OpenGL.GL_SRC_COLOR);
                break;

            case BlendMode.DoubleMultiplicative:
                OpenGL.glEnable(OpenGL.GL_BLEND);
                OpenGL.CheckGLError();
                OpenGL.glBlendFunc(OpenGL.GL_DST_COLOR, OpenGL.GL_SRC_COLOR);
                break;
            }

            OpenGL.CheckGLError();
        }