private void InitTextures() { var i = byte.MaxValue + 1; var perm2 = new byte[i, i, 4]; for (var y = 0; y < i; y++) { for (var x = 0; x < i; x++) { var a = _perm[x] + y; perm2[y, x, 0] = (byte)_perm[a]; perm2[y, x, 1] = (byte)_perm[a + 1]; var b = _perm[x + 1] + y; perm2[y, x, 2] = (byte)_perm[b]; perm2[y, x, 3] = (byte)_perm[b + 1]; } } _perm2D = new Texture2D(i, i, 4, typeof(byte)); _perm2D.Activate(); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, i, i, PixelFormat.Rgba, PixelType.Byte, perm2); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); _permGrad3 = new Texture1D(i, 3, typeof(OpenTK.Half)); var pg3 = _perm.SelectMany(x => new[] { (float)_grad3[x % 16, 0], (float)_grad3[x % 16, 1], (float)_grad3[x % 16, 2], }).ToArray(); _permGrad3.Activate(); GL.TexSubImage1D(TextureTarget.Texture1D, 0, 0, i, PixelFormat.Rgb, PixelType.Float, pg3); GL.TexParameter(TextureTarget.Texture1D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture1D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); GL.TexParameter(TextureTarget.Texture1D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); }