public static extern void FNA3D_SetBlendState( IntPtr device, ref FNA3D_BlendState blendState );
// // FNA3D_SetBlendState // public static void FNA3D_SetBlendState(IntPtr device, ref FNA3D_BlendState blendState) { var input = blendState; var renderer = Renderer.Get(device); Renderer.Get(device).Send(false, () => { var state = (State)renderer.UserData; if (input.colorSourceBlend != Blend.One || input.colorDestinationBlend != Blend.Zero || input.alphaSourceBlend != Blend.One || input.alphaDestinationBlend != Blend.Zero) { // // blend state // if (!state.BlendEnable) { state.BlendEnable = true; GLES20.glEnable(GLES20.GL_BLEND); } // // XNA blend factor / GL blend color // if (input.blendFactor != state.BlendColor) { state.BlendColor = input.blendFactor; GLES20.glBlendColor(state.BlendColor.R / 255f, state.BlendColor.G / 255f, state.BlendColor.B / 255f, state.BlendColor.A / 255f); } // // XNA blend mode / GL blend function // if (input.colorSourceBlend != state.BlendSrcColor || input.colorDestinationBlend != state.BlendDstColor || input.alphaSourceBlend != state.BlendSrcAlpha || input.alphaDestinationBlend != state.BlendDstAlpha) { state.BlendSrcColor = input.colorSourceBlend; state.BlendDstColor = input.colorDestinationBlend; state.BlendSrcAlpha = input.alphaSourceBlend; state.BlendDstAlpha = input.alphaDestinationBlend; GLES20.glBlendFuncSeparate( BlendModeToBlendFunc[(int)state.BlendSrcColor], BlendModeToBlendFunc[(int)state.BlendDstColor], BlendModeToBlendFunc[(int)state.BlendSrcAlpha], BlendModeToBlendFunc[(int)state.BlendDstAlpha]); } // // XNA blend function / GL blend equation // if (input.colorBlendFunction != state.BlendFuncColor || input.alphaBlendFunction != state.BlendFuncAlpha) { state.BlendFuncColor = input.colorBlendFunction; state.BlendFuncAlpha = input.alphaBlendFunction; GLES20.glBlendEquationSeparate( BlendFunctionToBlendEquation[(int)state.BlendFuncColor], BlendFunctionToBlendEquation[(int)state.BlendFuncAlpha]); } // // color write mask // bool inputRed = ((input.colorWriteEnable & ColorWriteChannels.Red) != 0); bool inputGreen = ((input.colorWriteEnable & ColorWriteChannels.Green) != 0); bool inputBlue = ((input.colorWriteEnable & ColorWriteChannels.Blue) != 0); bool inputAlpha = ((input.colorWriteEnable & ColorWriteChannels.Alpha) != 0); var WriteMask = state.WriteMask; if (inputRed != ((WriteMask & RED_MASK) != 0) || inputGreen != ((WriteMask & GREEN_MASK) != 0) || inputBlue != ((WriteMask & BLUE_MASK) != 0) || inputAlpha != ((WriteMask & ALPHA_MASK) != 0)) { state.WriteMask = (inputRed ? RED_MASK : 0) | (inputGreen ? GREEN_MASK : 0) | (inputBlue ? BLUE_MASK : 0) | (inputAlpha ? ALPHA_MASK : 0); GLES20.glColorMask(inputRed, inputGreen, inputBlue, inputAlpha); } } else { state.BlendEnable = false; GLES20.glDisable(GLES20.GL_BLEND); } }); }