public override void bind(IRenderingEngine re, bool forDrawing) { base.bind(re, forDrawing); if (isUpdateRequired(re)) { // Update the texture each time the GETexture has changed if (fboId == -1) { fboId = re.genFramebuffer(); re.bindFramebuffer(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_FRAMEBUFFER, fboId); re.setFramebufferTexture(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_FRAMEBUFFER, pspsharp.graphics.RE.IRenderingEngine_Fields.RE_COLOR_ATTACHMENT0, textureId, 0); } else { re.bindFramebuffer(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_FRAMEBUFFER, fboId); } updateTexture(re); re.bindFramebuffer(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_FRAMEBUFFER, 0); re.bindTexture(textureId); if (forDrawing) { re.setTextureFormat(pixelFormat, false); } geTexture.Changed = false; } }
protected internal virtual void createFBO(IRenderingEngine re, bool forDrawing) { // Create the FBO and associate it to the texture fboId = re.genFramebuffer(); re.bindFramebuffer(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_FRAMEBUFFER, fboId); // Create a render buffer for the depth buffer depthRenderBufferId = re.genRenderbuffer(); re.bindRenderbuffer(depthRenderBufferId); re.setRenderbufferStorage(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_DEPTH_COMPONENT, TexImageWidth, TexImageHeight); // Create the texture base.bind(re, forDrawing); // Attach the texture to the FBO re.setFramebufferTexture(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_FRAMEBUFFER, pspsharp.graphics.RE.IRenderingEngine_Fields.RE_COLOR_ATTACHMENT0, textureId, 0); // Attach the depth buffer to the FBO re.setFramebufferRenderbuffer(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_FRAMEBUFFER, pspsharp.graphics.RE.IRenderingEngine_Fields.RE_DEPTH_ATTACHMENT, depthRenderBufferId); }
protected internal virtual bool copyStencilToTextureAlpha(IRenderingEngine re, int texWidth, int texHeight) { re.checkAndLogErrors(null); if (stencilFboId == -1) { // Create a FBO stencilFboId = re.genFramebuffer(); re.bindFramebuffer(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_DRAW_FRAMEBUFFER, stencilFboId); // Create stencil texture and attach it to the FBO stencilTextureId = re.genTexture(); re.bindTexture(stencilTextureId); re.checkAndLogErrors("bindTexture"); re.setTexImage(0, stencilPixelFormat, TexImageWidth, TexImageHeight, stencilPixelFormat, stencilPixelFormat, 0, null); if (re.checkAndLogErrors("setTexImage")) { return(false); } re.TextureMipmapMinFilter = TFLT_NEAREST; re.TextureMipmapMagFilter = TFLT_NEAREST; re.TextureMipmapMinLevel = 0; re.TextureMipmapMaxLevel = 0; re.setTextureWrapMode(TWRAP_WRAP_MODE_CLAMP, TWRAP_WRAP_MODE_CLAMP); re.setFramebufferTexture(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_DRAW_FRAMEBUFFER, pspsharp.graphics.RE.IRenderingEngine_Fields.RE_DEPTH_STENCIL_ATTACHMENT, stencilTextureId, 0); if (re.checkAndLogErrors("setFramebufferTexture RE_STENCIL_ATTACHMENT")) { return(false); } // Attach the GE texture to the FBO as well re.setFramebufferTexture(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_DRAW_FRAMEBUFFER, pspsharp.graphics.RE.IRenderingEngine_Fields.RE_COLOR_ATTACHMENT0, textureId, 0); if (re.checkAndLogErrors("setFramebufferTexture RE_COLOR_ATTACHMENT0")) { return(false); } } else { re.bindFramebuffer(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_DRAW_FRAMEBUFFER, stencilFboId); } // Copy screen stencil buffer to stencil texture: // - read framebuffer is screen (0) // - draw/write framebuffer is our stencil FBO (stencilFboId) re.blitFramebuffer(0, 0, texWidth, texHeight, 0, 0, texWidth, texHeight, pspsharp.graphics.RE.IRenderingEngine_Fields.RE_STENCIL_BUFFER_BIT, GeCommands.TFLT_NEAREST); if (re.checkAndLogErrors("blitFramebuffer")) { return(false); } re.bindTexture(stencilTextureId); if (!re.setCopyRedToAlpha(true)) { return(false); } // Draw the stencil texture and update only the alpha channel of the GE texture drawTexture(re, 0, 0, width, height, true, false, false, false, true); re.checkAndLogErrors("drawTexture"); // Reset the framebuffer to the default one re.bindFramebuffer(pspsharp.graphics.RE.IRenderingEngine_Fields.RE_DRAW_FRAMEBUFFER, 0); re.CopyRedToAlpha = false; // Success return(true); }