public static extern unsafe void FNA3D_SetRenderTargets( IntPtr device, FNA3D_RenderTargetBinding *renderTargets, int numRenderTargets, IntPtr depthStencilBuffer, /* FNA3D_Renderbuffer */ DepthFormat depthFormat, byte preserveDepthStencilContents );
// // FNA3D_SetRenderTargets // public static unsafe void FNA3D_SetRenderTargets(IntPtr device, FNA3D_RenderTargetBinding *renderTargets, int numRenderTargets, IntPtr depthStencilBuffer, DepthFormat depthFormat, byte preserveContents) { var renderTargetsCopy = new FNA3D_RenderTargetBinding[numRenderTargets]; for (int i = 0; i < numRenderTargets; i++) { renderTargetsCopy[i] = renderTargets[i]; } var renderer = Renderer.Get(device); renderer.Send(false, () => { var state = (State)renderer.UserData; if (state.TargetFramebuffer == 0) { var id = new int[1]; GLES20.glGenFramebuffers(1, id, 0); if ((state.TargetFramebuffer = id[0]) == 0) { return; } } GLES20.glBindFramebuffer(GLES30.GL_DRAW_FRAMEBUFFER, state.TargetFramebuffer); int attachmentIndex = GLES20.GL_COLOR_ATTACHMENT0; foreach (var renderTarget in renderTargetsCopy) { if (renderTarget.colorBuffer != IntPtr.Zero) { // a color buffer is only created if a non-zero result // from FNA3D_GetMaxMultiSampleCount, which we never do throw new PlatformNotSupportedException(); /*GLES20.glFramebufferRenderbuffer( * GLES20.GL_DRAW_FRAMEBUFFER, attachmentIndex, * GLES20.GL_RENDERBUFFER, (int) renderTarget.colorBuffer);*/ } else { int attachmentType = GLES20.GL_TEXTURE_2D; if (renderTarget.type != /* FNA3D_RENDERTARGET_TYPE_2D */ 0) { attachmentType = GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.data2; } GLES20.glFramebufferTexture2D( GLES30.GL_DRAW_FRAMEBUFFER, attachmentIndex, attachmentType, (int)renderTarget.texture, 0); } attachmentIndex++; } int lastAttachmentPlusOne = state.ActiveAttachments; state.ActiveAttachments = attachmentIndex; while (attachmentIndex < lastAttachmentPlusOne) { GLES20.glFramebufferRenderbuffer( GLES30.GL_DRAW_FRAMEBUFFER, attachmentIndex++, GLES20.GL_RENDERBUFFER, 0); } GLES20.glFramebufferRenderbuffer( GLES30.GL_DRAW_FRAMEBUFFER, GLES30.GL_DEPTH_STENCIL_ATTACHMENT, GLES20.GL_RENDERBUFFER, (int)depthStencilBuffer); state.RenderToTexture = true; }); }