Exemplo n.º 1
0
        /// <summary>
        /// Инициализация текстуры под будущее заполнение с помощью public void SetData(byte[] colors, int width, int height, int depth).
        /// </summary>
        /// <param name="width">размер текстурки ширина.</param>
        /// <param name="height">размер текстурки высота.</param>
        /// <param name="depth">количество слоев в массиве.</param>
        public override void SetEmpty(int width, int height, int depth)
        {
            VerifyThreadAffinity();

            PrepareTexture();
            OpenGL.glTexImage3D(OpenGL.GL_TEXTURE_2D_ARRAY, 0, OpenGL.GL_RGBA, width, height, depth,
                                0, OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, IntPtr.Zero);
            OpenGL.CheckGLError();
            OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D_ARRAY, 0);
        }
Exemplo n.º 2
0
        public byte[] GetData()
        {
            VerifyThreadAffinity();
            var data = new byte[4 * Size.Width * Size.Height];

            // GLES doesn't support glGetTexImage so data must be read back via a frame buffer
            if (OpenGL.Features.HasFlag(OpenGL.GLFeatures.GLES))
            {
                // Query the active framebuffer so we can restore it afterwards
                int lastFramebuffer;
                OpenGL.glGetIntegerv(OpenGL.GL_FRAMEBUFFER_BINDING, out lastFramebuffer);

                uint framebuffer;
                OpenGL.glGenFramebuffers(1, out framebuffer);
                OpenGL.glBindFramebuffer(OpenGL.GL_FRAMEBUFFER, framebuffer);
                OpenGL.CheckGLError();

                OpenGL.glFramebufferTexture2D(OpenGL.GL_FRAMEBUFFER, OpenGL.GL_COLOR_ATTACHMENT0, OpenGL.GL_TEXTURE_2D, texture, 0);
                OpenGL.CheckGLError();

                unsafe
                {
                    fixed(byte *ptr = &data[0])
                    {
                        var intPtr = new IntPtr((void *)ptr);

                        OpenGL.glReadPixels(0, 0, Size.Width, Size.Height, OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, intPtr);
                        OpenGL.CheckGLError();
                    }
                }

                OpenGL.glBindFramebuffer(OpenGL.GL_FRAMEBUFFER, (uint)lastFramebuffer);
                OpenGL.glDeleteFramebuffers(1, ref framebuffer);
                OpenGL.CheckGLError();
            }
            else
            {
                OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D, texture);
                unsafe
                {
                    fixed(byte *ptr = &data[0])
                    {
                        var intPtr = new IntPtr((void *)ptr);

                        OpenGL.glGetTexImage(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_BGRA,
                                             OpenGL.GL_UNSIGNED_BYTE, intPtr);
                    }
                }

                OpenGL.CheckGLError();
            }

            return(data);
        }
Exemplo n.º 3
0
        public virtual void SetEmpty(int width, int height)
        {
            VerifyThreadAffinity();
            //if (!Exts.IsPowerOf2(width) || !Exts.IsPowerOf2(height))
            //	throw new InvalidDataException("Non-power-of-two array {0}x{1}".F(width, height));

            Size = new Size(width, height);
            PrepareTexture();
            OpenGL.glTexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_RGBA8, width, height,
                                0, OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, IntPtr.Zero);
            OpenGL.CheckGLError();
            OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D_ARRAY, 0);
        }
Exemplo n.º 4
0
        public void PrepareRender()
        {
            VerifyThreadAffinity();
            OpenGL.glUseProgram(program);

            // bind the textures
            foreach (var kv in textures)
            {
                OpenGL.glActiveTexture(OpenGL.GL_TEXTURE0 + kv.Key);
                OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D, ((ITextureInternal)kv.Value).ID);
            }

            OpenGL.CheckGLError();
        }
Exemplo n.º 5
0
        public virtual void PrepareTexture()
        {
            var filter = scaleFilter == TextureScaleFilter.Linear ? OpenGL.GL_LINEAR : OpenGL.GL_NEAREST;

            OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D, texture);

            //var filter = scaleFilter == TextureScaleFilter.Linear ? OpenGL.GL_LINEAR : OpenGL.GL_NEAREST;
            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, filter);
            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, filter);

            OpenGL.glTexParameterf(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, OpenGL.GL_CLAMP_TO_EDGE);
            OpenGL.glTexParameterf(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, OpenGL.GL_CLAMP_TO_EDGE);

            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_BASE_LEVEL, 0);
            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAX_LEVEL, 0);
        }
Exemplo n.º 6
0
        /// <summary>
        /// По-штучная инициализация каждого слоя массива Texture2DArray.
        /// </summary>
        /// <param name="colors">массив байтов.</param>
        /// <param name="width">ширина текстурки.</param>
        /// <param name="height">высота текстурки.</param>
        /// <param name="depth">слои в массиве.</param>
        public override void SetData(byte[] colors, int width, int height, int depth)
        {
            VerifyThreadAffinity();
            Size = new Size(width, height);
            PrepareTexture();
            unsafe
            {
                fixed(byte *ptr = &colors[0])
                {
                    var intPtr = new IntPtr((void *)ptr);

                    OpenGL.glTexSubImage3D(OpenGL.GL_TEXTURE_2D_ARRAY, 0, 0, 0, depth, width, height, 1, OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, intPtr);
                    OpenGL.CheckGLError();
                }
            }
            OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D_ARRAY, 0);
        }
Exemplo n.º 7
0
        public byte[] GetData()
        {
            VerifyThreadAffinity();
            var data = new byte[4 * Size.Width * Size.Height];

            OpenGL.CheckGLError();
            OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D, texture);
            unsafe
            {
                fixed(byte *ptr = &data[0])
                {
                    var intPtr = new IntPtr((void *)ptr);

                    OpenGL.glGetTexImage(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_BGRA,
                                         OpenGL.GL_UNSIGNED_BYTE, intPtr);
                }
            }

            OpenGL.CheckGLError();
            return(data);
        }
Exemplo n.º 8
0
        public virtual void SetData(byte[] colors, int width, int height)
        {
            VerifyThreadAffinity();
            //if (!Exts.IsPowerOf2(width) || !Exts.IsPowerOf2(height))
            //	throw new InvalidDataException("Non-power-of-two array {0}x{1}".F(width, height));

            Size = new Size(width, height);
            unsafe
            {
                fixed(byte *ptr = &colors[0])
                {
                    var intPtr = new IntPtr((void *)ptr);

                    PrepareTexture();
                    OpenGL.glTexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_RGBA8, width, height,
                                        0, OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, intPtr);
                    OpenGL.CheckGLError();
                }
            }
            OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D_ARRAY, 0);
        }
Exemplo n.º 9
0
        public override void PrepareTexture()
        {
            var filter = scaleFilter == TextureScaleFilter.Linear ? OpenGL.GL_LINEAR : OpenGL.GL_NEAREST;

            TextureType = OpenGL.GL_TEXTURE_2D_ARRAY;
            OpenGL.CheckGLError();
            OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D_ARRAY, texture);
            OpenGL.CheckGLError();

            //var filter = OpenGL.GL_NEAREST;
            //var filter = OpenGL.GL_LINEAR;
            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D_ARRAY, OpenGL.GL_TEXTURE_MAG_FILTER, filter);
            OpenGL.CheckGLError();
            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D_ARRAY, OpenGL.GL_TEXTURE_MIN_FILTER, filter);
            OpenGL.CheckGLError();

            OpenGL.glTexParameterf(OpenGL.GL_TEXTURE_2D_ARRAY, OpenGL.GL_TEXTURE_WRAP_S, OpenGL.GL_CLAMP_TO_EDGE);
            OpenGL.CheckGLError();
            OpenGL.glTexParameterf(OpenGL.GL_TEXTURE_2D_ARRAY, OpenGL.GL_TEXTURE_WRAP_T, OpenGL.GL_CLAMP_TO_EDGE);
            OpenGL.CheckGLError();
        }
Exemplo n.º 10
0
        public void PrepareRender()
        {
            VerifyThreadAffinity();
            OpenGL.glUseProgram(program);
            OpenGL.CheckGLError();

            // bind the textures
            foreach (var kv in textures)
            {
                var texture = (ITextureInternal)kv.Value;

                // Evict disposed textures from the cache
                if (OpenGL.glIsTexture(texture.ID))
                {
                    OpenGL.glActiveTexture(OpenGL.GL_TEXTURE0 + kv.Key);
                    OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D, texture.ID);

                    // Work around missing textureSize GLSL function by explicitly tracking sizes in a uniform
                    int param;
                    if (OpenGL.Profile == GLProfile.Legacy && legacySizeUniforms.TryGetValue(kv.Key, out param))
                    {
                        OpenGL.glUniform2f(param, texture.Size.Width, texture.Size.Height);
                        OpenGL.CheckGLError();
                    }
                }
                else
                {
                    unbindTextures.Enqueue(kv.Key);
                }
            }

            while (unbindTextures.Count > 0)
            {
                textures.Remove(unbindTextures.Dequeue());
            }

            OpenGL.CheckGLError();
        }
Exemplo n.º 11
0
        void PrepareTexture()
        {
            OpenGL.CheckGLError();
            OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D, texture);
            OpenGL.CheckGLError();

            var filter = scaleFilter == TextureScaleFilter.Linear ? OpenGL.GL_LINEAR : OpenGL.GL_NEAREST;

            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, (int)filter);
            OpenGL.CheckGLError();
            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, (int)filter);
            OpenGL.CheckGLError();

            OpenGL.glTexParameterf(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, (float)OpenGL.GL_CLAMP_TO_EDGE);
            OpenGL.CheckGLError();
            OpenGL.glTexParameterf(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, (float)OpenGL.GL_CLAMP_TO_EDGE);
            OpenGL.CheckGLError();

            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_BASE_LEVEL, 0);
            OpenGL.CheckGLError();
            OpenGL.glTexParameteri(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAX_LEVEL, 0);
            OpenGL.CheckGLError();
        }
Exemplo n.º 12
0
        public byte[] GetData()
        {
            VerifyThreadAffinity();
            var data = new byte[4 * Size.Width * Size.Height];

            // GLES doesn't support glGetTexImage so data must be read back via a frame buffer
            if (OpenGL.Profile == GLProfile.Embedded)
            {
                // Query the active framebuffer so we can restore it afterwards
                int lastFramebuffer;
                OpenGL.glGetIntegerv(OpenGL.GL_FRAMEBUFFER_BINDING, out lastFramebuffer);

                uint framebuffer;
                OpenGL.glGenFramebuffers(1, out framebuffer);
                OpenGL.glBindFramebuffer(OpenGL.GL_FRAMEBUFFER, framebuffer);
                OpenGL.CheckGLError();

                OpenGL.glFramebufferTexture2D(OpenGL.GL_FRAMEBUFFER, OpenGL.GL_COLOR_ATTACHMENT0, OpenGL.GL_TEXTURE_2D, texture, 0);
                OpenGL.CheckGLError();

                var canReadBGRA = OpenGL.Features.HasFlag(OpenGL.GLFeatures.ESReadFormatBGRA);

                unsafe
                {
                    fixed(byte *ptr = &data[0])
                    {
                        var intPtr = new IntPtr(ptr);

                        var format = canReadBGRA ? OpenGL.GL_BGRA : OpenGL.GL_RGBA;

                        OpenGL.glReadPixels(0, 0, Size.Width, Size.Height, format, OpenGL.GL_UNSIGNED_BYTE, intPtr);
                        OpenGL.CheckGLError();
                    }
                }

                // Convert RGBA to BGRA
                if (!canReadBGRA)
                {
                    for (var i = 0; i < 4 * Size.Width * Size.Height; i += 4)
                    {
                        var temp = data[i];
                        data[i]     = data[i + 2];
                        data[i + 2] = temp;
                    }
                }

                OpenGL.glBindFramebuffer(OpenGL.GL_FRAMEBUFFER, (uint)lastFramebuffer);
                OpenGL.glDeleteFramebuffers(1, ref framebuffer);
                OpenGL.CheckGLError();
            }
            else
            {
                OpenGL.glBindTexture(OpenGL.GL_TEXTURE_2D, texture);
                unsafe
                {
                    fixed(byte *ptr = &data[0])
                    {
                        var intPtr = new IntPtr((void *)ptr);

                        OpenGL.glGetTexImage(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_BGRA,
                                             OpenGL.GL_UNSIGNED_BYTE, intPtr);
                    }
                }

                OpenGL.CheckGLError();
            }

            return(data);
        }