public GameTexture GetWorley(List <float> positions, int width, int height) { CLFilter filter = _kernels["worley"]; byte[] buffer = new byte[width * height * 4]; MemoryBuffer mb = c.CreateBuffer(MemoryFlag.ReadWrite | MemoryFlag.CopyHostPointer, buffer); MemoryBuffer points = c.CreateBuffer(MemoryFlag.ReadOnly | MemoryFlag.CopyHostPointer, positions.ToArray()); //Maybe wrong struct filter.SetArg(0, mb); int3 dims = new int3(width, height, 1); filter.SetArg(1, dims); filter.SetArg(2, 4); filter.SetArg(3, enablechannels); filter.SetArg(4, points); filter.SetArg(5, positions.Count / 3); filter.SetArg(6, 0.3f); CommandQueue cq = CommandQueue.CreateCommandQueue(c, d); cq.EnqueueNDRangeKernel(filter.kernel, 1, buffer.Length); buffer = cq.EnqueueReadBuffer <byte>(mb, buffer.Length); return(GameTexture.Load(buffer, width, height)); }
public void RunSmoothNoise(GameTexture tex, int octave) { CLFilter filter = _kernels["smooth"]; GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureWidth, out float w); GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureHeight, out float h); int width = (int)w; int height = (int)h; byte[] buffer = new byte[width * height * 4]; GL.GetTexImage(TextureTarget.Texture2D, 0, PixelFormat.Bgra, PixelType.UnsignedByte, buffer); MemoryBuffer mb = c.CreateBuffer(MemoryFlag.ReadWrite | MemoryFlag.CopyHostPointer, buffer); filter.SetArg(0, mb); filter.SetArg(1, new int3(width, height, 1)); filter.SetArg(2, 4); filter.SetArg(3, enablechannels); int samplePeriod = 1 << octave; filter.SetArg(4, samplePeriod); filter.SetArg(5, 1f / samplePeriod); CommandQueue cq = CommandQueue.CreateCommandQueue(c, d); cq.EnqueueNDRangeKernel(filter.kernel, 1, buffer.Length); buffer = cq.EnqueueReadBuffer <byte>(mb, buffer.Length); GL.BindTexture(TextureTarget.Texture2D, tex.textureID); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)width, (int)height, PixelFormat.Bgra, PixelType.UnsignedByte, buffer); }
public void RunOverlayKernel(GameTexture tex, GameTexture overlay, float weight) { GL.BindTexture(TextureTarget.Texture2D, tex.textureID); GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureWidth, out float width); GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureHeight, out float height); byte[] buffer = new byte[(int)(width * height * 4)]; GL.GetTexImage(TextureTarget.Texture2D, 0, PixelFormat.Bgra, PixelType.UnsignedByte, buffer); MemoryBuffer mb = c.CreateBuffer(MemoryFlag.CopyHostPointer, buffer); //Custom CLFilter filter = _kernels["overlay"]; byte[] bufferOverlay = new byte[(int)(width * height * 4)]; GL.BindTexture(TextureTarget.Texture2D, overlay.textureID); GL.GetTexImage(TextureTarget.Texture2D, 0, PixelFormat.Bgra, PixelType.UnsignedByte, bufferOverlay); MemoryBuffer mbOverlay = c.CreateBuffer(MemoryFlag.CopyHostPointer, bufferOverlay); filter.SetArg(0, mb); filter.SetArg(1, new int3((int)width, (int)height, 1)); filter.SetArg(2, 4); filter.SetArg(3, enablechannels); //Custom filter.SetArg(5, mbOverlay); filter.SetArg(6, weight); CommandQueue cq = CommandQueue.CreateCommandQueue(c, d); cq.EnqueueNDRangeKernel(filter.kernel, 1, buffer.Length); buffer = cq.EnqueueReadBuffer <byte>(mb, buffer.Length); GL.BindTexture(TextureTarget.Texture2D, tex.textureID); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)width, (int)height, PixelFormat.Bgra, PixelType.UnsignedByte, buffer); }
public void RunCheckerBoardKernel(GameTexture tex, float length) { //Custom CLFilter filter = _kernels["checkerboard"]; //Get Width & Height GL.BindTexture(TextureTarget.Texture2D, tex.textureID); GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureWidth, out float width); GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureHeight, out float height); //Get Image source from opengl //Custom byte[] buffer = new byte[(int)(width * height * 4)]; GL.GetTexImage(TextureTarget.Texture2D, 0, PixelFormat.Bgra, PixelType.UnsignedByte, buffer); //Create buffer with image content MemoryBuffer mb = c.CreateBuffer(MemoryFlag.ReadWrite | MemoryFlag.CopyHostPointer, buffer); filter.SetArg(0, mb); filter.SetArg(1, new int3((int)width, (int)height, 1)); filter.SetArg(2, 4); filter.SetArg(3, enablechannels); //Custom filter.SetArg(3, length); filter.SetArg(4, (int)width); CommandQueue cq = CommandQueue.CreateCommandQueue(c, d); cq.EnqueueNDRangeKernel(filter.kernel, 1, buffer.Length); buffer = cq.EnqueueReadBuffer <byte>(mb, buffer.Length); GL.BindTexture(TextureTarget.Texture2D, tex.textureID); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)width, (int)height, PixelFormat.Bgra, PixelType.UnsignedByte, buffer); }
public void RunLightKernel(GameTexture tex) { //MemoryBuffer buf = c.CreateFromGLTexture2D(MemoryFlag.ReadWrite | MemoryFlag.UseHostPointer, (uint)TextureTarget.Texture2D, 0, (uint)tex.textureID); //string test = d.GetDeviceInformation<string>(DeviceInformation.Extensions); //DevicesNativeApi.GetDeviceInformation(d, DeviceInformation.Extensions, UIntPtr.Zero, ) GL.BindTexture(TextureTarget.Texture2D, tex.textureID); //Custom CLFilter filter = _kernels["light"]; GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureWidth, out float width); GL.GetTexLevelParameter(TextureTarget.Texture2D, 0, GetTextureParameter.TextureHeight, out float height); byte[] buffer = new byte[(int)(width * height * 4)]; GL.GetTexImage(TextureTarget.Texture2D, 0, PixelFormat.Bgra, PixelType.UnsignedByte, buffer); MemoryBuffer mb = c.CreateBuffer(MemoryFlag.ReadWrite | MemoryFlag.CopyHostPointer, buffer); filter.SetArg(0, mb); filter.SetArg(1, new int3((int)width, (int)height, 1)); filter.SetArg(2, 4); filter.SetArg(3, enablechannels); CommandQueue cq = CommandQueue.CreateCommandQueue(c, d); cq.EnqueueNDRangeKernel(filter.kernel, 1, buffer.Length); buffer = cq.EnqueueReadBuffer <byte>(mb, buffer.Length); GL.BindTexture(TextureTarget.Texture2D, tex.textureID); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)width, (int)height, PixelFormat.Bgra, PixelType.UnsignedByte, buffer); }
public GameTexture GetPerlin(int width, int height, int octaves, float persistence) { CLFilter filter = _kernels["perlin"]; byte[] buffer = new byte[width * height * 4]; Random rnd = new Random(); for (int i = 0; i < buffer.Length; i++) { if (i % 4 == 0) { byte val = (byte)rnd.Next(0, 255); buffer[i] = buffer[i + 1] = buffer[i + 2] = val; buffer[i + 3] = 255; // Alpha } } MemoryBuffer mb = c.CreateBuffer(MemoryFlag.ReadWrite | MemoryFlag.CopyHostPointer, buffer); filter.SetArg(0, mb); int3 dims = new int3(width, height, 1); filter.SetArg(1, dims); filter.SetArg(2, 4); filter.SetArg(3, enablechannels); filter.SetArg(4, persistence); filter.SetArg(5, octaves); CommandQueue cq = CommandQueue.CreateCommandQueue(c, d); cq.EnqueueNDRangeKernel(filter.kernel, 1, buffer.Length); buffer = cq.EnqueueReadBuffer <byte>(mb, buffer.Length); return(GameTexture.Load(buffer, width, height)); }
public static bool TryGetFilter(string name, out CLFilter filter) { return(_instance._kernels.TryGetValue(name, out filter)); }