/// <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); }
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); }
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); }
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(); }
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); }
/// <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); }
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); }
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); }
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(); }
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(); }
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(); }
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); }