Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }