Пример #1
0
        public GLES2RenderBuffer(All format, int width, int height, int numSamples)
            : base(width, height, 1, GLES2PixelUtil.GetClosestAxiomFormat(format, (All)PixelFormat.A8R8G8B8), BufferUsage.WriteOnly)
        {
            GlInternalFormat = format;
            //Genearte renderbuffer
            GL.GenRenderbuffers(1, ref this.renderBufferID);
            GLES2Config.GlCheckError(this);
            //Bind it to FBO
            GL.BindRenderbuffer(All.Renderbuffer, this.renderBufferID);
            GLES2Config.GlCheckError(this);

            //Allocate storage for depth buffer
            if (numSamples > 0)
            {
            }
            else
            {
                GL.RenderbufferStorage(All.Renderbuffer, format, width, height);
                GLES2Config.GlCheckError(this);
            }
        }
Пример #2
0
        public GLES2TextureBuffer(string baseName, All target, int id, int width, int height, All internalFormat, All format, int face, int level, BufferUsage usage, bool crappyCard, bool writeGamma, int fsaa)
            : base(0, 0, 0, PixelFormat.Unknown, usage)
        {
            this.target         = target;
            this.textureID      = id;
            this.face           = face;
            this.level          = level;
            this.softwareMipmap = crappyCard;

            GLES2Config.GlCheckError(this);
            GL.BindTexture(target, this.textureID);
            GLES2Config.GlCheckError(this);

            //Get face identifier
            this.faceTarget = this.target;
            if (this.target == All.TextureCubeMap)
            {
                this.faceTarget = All.TextureCubeMapPositiveX + face;
            }
            //Calculate the width and height of the texture at this mip level
            this.width  = this.level == 0 ? width : (int)(width / Math.Utility.Pow(2, level));
            this.height = this.level == 0 ? height : (int)(height / Math.Utility.Pow(2, level));

            if (this.width < 1)
            {
                this.width = 1;
            }
            if (this.height < 1)
            {
                this.height = 1;
            }

            //Only 2D is supporte so depth is always 1
            depth = 1;

            GlInternalFormat = internalFormat;
            this.format      = GLES2PixelUtil.GetClosestAxiomFormat(internalFormat, format);

            rowPitch    = this.width;
            slicePitch  = this.height * this.width;
            sizeInBytes = PixelUtil.GetMemorySize(this.width, this.height, depth, this.format);
            //Setup a pixel box
            Buffer = new PixelBox(this.width, this.height, depth, this.format);

            if (this.width == 0 || this.height == 0 || depth == 0)
            {
                //We are invalid, do not allocat a buffer
                return;
            }

            if (((TextureUsage)usage & TextureUsage.RenderTarget) == TextureUsage.RenderTarget)
            {
                //Create render target for each slice

                for (int zoffset = 0; zoffset < depth; zoffset++)
                {
                    var name    = "rtt/ " + GetHashCode() + "/" + baseName;
                    var rtarget = new GLES2SurfaceDesc {
                        buffer = this, zoffset = zoffset
                    };
                    var trt = GLES2RTTManager.Instance.CreateRenderTexture(name, rtarget, writeGamma, fsaa);
                    this.sliceTRT.Add(trt);
                    Core.Root.Instance.RenderSystem.AttachRenderTarget(this.sliceTRT[zoffset]);
                }
            }
        }