Example #1
0
        protected override void load_Buffers()
        {
            _ssboExposure = new ShaderStorageBuffer(new EngineHelper.size[]
            {
                EngineHelper.size.vec2
            });
            _ssboExposure.bind();
            Vector2 default_luminosity = new Vector2(1000.0f, 0.0f);

            GL.BufferData(BufferTarget.ShaderStorageBuffer, (int)EngineHelper.size.vec2, ref default_luminosity, BufferUsageHint.DynamicCopy);
            _ssboExposure.unbind();

            _tLuminosity = new Texture(TextureTarget.Texture2D,
                                       _resolution.W, _resolution.H,
                                       0, true, false,
                                       PixelInternalFormat.R16f, PixelFormat.Red, PixelType.Float,
                                       TextureMinFilter.LinearMipmapLinear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tLuminosity.load();

            _tTempScene = new Texture(TextureTarget.Texture2D,
                                      _resolution.W, _resolution.H,
                                      0, false, false,
                                      PixelInternalFormat.Rgba16f, PixelFormat.Rgba, PixelType.Float,
                                      TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tTempScene.load();
        }
        protected override void CreateGpuBuffer(Buffer buffer)
        {
            ShaderStorageBuffer arrayBuffer = (ShaderStorageBuffer)buffer;

            // Create CPU buffer with 16 elements
            arrayBuffer.Create(_Context, 16);
        }
Example #3
0
        public static FreeCamera SetUpFreeCamera()
        {
            CameraSavedViews = new Dictionary <int, TransformationManager>();
            var freeCamera = new FreeCamera((float)Game.Resolution.Width / (float)Game.Resolution.Height, MathHelper.PiOver3 / 1);

            FreeCam       = freeCamera;
            PickingResult = new ShaderStorageBuffer();
            MousePicker   = new ComputeShader("MousePicker.compute.glsl");

            return(freeCamera);
        }
        public void ShaderStorageBuffer_TestShaderProgram()
        {
            if (!_Context.Extensions.ComputeShader_ARB)
            {
                Assert.Inconclusive("GL_ARB_compute_shader not supported");
            }
            if (!_Context.Extensions.ShaderStorageBufferObject_ARB)
            {
                Assert.Inconclusive("GL_ARB_shader_storage_buffer_object not supported");
            }

            const uint Size = 1024;

            using (ShaderProgram program = new ShaderProgram(""))
                using (Shader computeShader = new Shader(ShaderType.ComputeShader))
                    using (ShaderStorageBuffer storageBuffer = new ShaderStorageBuffer(MapBufferUsageMask.MapReadBit))
                    {
                        computeShader.LoadSource(new[] {
                            "#version 430",
                            "layout(local_size_x = 1, local_size_y = 1) in;",
                            "layout(std430, binding = 3) buffer glo_Buffer {",
                            "	uint data[];",
                            "};",
                            "",
                            "void main() {",
                            "	data[gl_WorkGroupID.x * gl_WorkGroupID.y] = uint(gl_WorkGroupID.x * gl_WorkGroupID.y);",
                            "}"
                        });
                        program.Attach(computeShader);
                        program.Create(_Context);

                        storageBuffer.Create(_Context, Size * Size * 4);

                        program.SetStorageBuffer(_Context, "glo_Buffer", storageBuffer);
                        program.Compute(_Context, Size, Size);

                        program.MemoryBarrier(MemoryBarrierMask.ShaderStorageBarrierBit);

                        uint[] storage = new uint[Size * Size];

                        storageBuffer.Load(_Context, storage, Size * Size * 4);

                        for (uint x = 0; x < Size; x++)
                        {
                            for (uint y = 0; y < Size; y++)
                            {
                                Assert.AreEqual(x * y, storage[x * y]);
                            }
                        }
                    }
        }
Example #5
0
        private static async UniTask <Plain> CreateFloor2(WorldLayer layer)
        {
            var bufSize    = new Vector2i(256, 256);
            var buffer     = ShaderStorageBuffer.CreateUninitialized <Color4>(bufSize.X * bufSize.Y);
            var dispatcher = new TestComputeShader(() => buffer.Ssbo).CreateDispatcher();
            var plain      = new Plain();

            plain.Position.Z = -10;
            plain.Dead      += _ =>
            {
                buffer.Dispose();
                dispatcher.Dispose();
            };
            plain.Updated += _ => dispatcher.Dispatch(bufSize.X, bufSize.Y, 1);
            plain.Scale    = new Vector3(10f);
            plain.Shader   = new TestShader(() => (buffer.Ssbo, bufSize.X, bufSize.Y));
            plain.Rotation = Quaternion.FromAxisAngle(Vector3.UnitX, -90.ToRadian());

            return(await plain.Activate(layer));
        }
Example #6
0
        protected override void DoInitialize()
        {
            base.DoInitialize();
            using (var buffer = new ShaderStorageBuffer <vec4>(BufferUsage.StaticDraw))
            {
                buffer.Create(vertexCount);
                unsafe
                {
                    var array = (vec4 *)buffer.Header.ToPointer();
                    array[0] = new vec4(0, 0, 1, 1);
                    array[1] = new vec4(1, 0, 0, 1);
                    array[2] = new vec4(-1, 0, 0, 1);
                    array[3] = new vec4(0, 1, 0, 1);
                }
                var bufferPtr = buffer.GetBufferPtr() as ShaderStorageBufferPtr;
                bufferPtr.Binding(this.Program, "PositionBuffer", 0);
                bufferPtr.Unbind();
                //this.shaderStorageBufferPtr = bufferPtr;
            }
            using (var buffer = new ShaderStorageBuffer <vec4>(BufferUsage.StaticDraw))
            {
                buffer.Create(vertexCount);
                unsafe
                {
                    var array = (vec4 *)buffer.Header.ToPointer();
                    array[0] = new vec4(+1, +0, +0, 0);
                    array[1] = new vec4(+0, +1, +0, 0);
                    array[2] = new vec4(+0, +0, +1, 0);
                    array[3] = new vec4(+1, +1, +1, 0);
                    //array[0] = new vec3(new vec3(0, 0, 0));
                    //array[1] = new vec3(new vec3(1, 1, +1));
                    //array[2] = new vec3(new vec3(0, +1, 0));
                }
                var bufferPtr = buffer.GetBufferPtr() as ShaderStorageBufferPtr;
                bufferPtr.Binding(this.Program, "ColorBuffer", 1);
                bufferPtr.Unbind();
                //this.shaderStorageBufferPtr = bufferPtr;
            }

            this.groundRenderer.Initialize();
        }
Example #7
0
        protected override void DoInitialize()
        {
            base.DoInitialize();
            {
                const int           length = vertexCount;
                ShaderStorageBuffer buffer = ShaderStorageBuffer.Create(typeof(vec4), length, BufferUsage.StaticDraw);
                IntPtr pointer             = buffer.MapBuffer(MapBufferAccess.WriteOnly);
                unsafe
                {
                    var array = (vec4 *)pointer;
                    array[0] = new vec4(0, 0, 1, 1);
                    array[1] = new vec4(1, 0, 0, 1);
                    array[2] = new vec4(-1, 0, 0, 1);
                    array[3] = new vec4(0, 1, 0, 1);
                }
                buffer.UnmapBuffer();
                buffer.Binding(this.Program, "PositionBuffer", 0);
                buffer.Unbind();
                //this.shaderStorageBuffer = buffer;
            }
            {
                const int           length = vertexCount;
                ShaderStorageBuffer buffer = ShaderStorageBuffer.Create(typeof(vec4), length, BufferUsage.StaticDraw);
                IntPtr pointer             = buffer.MapBuffer(MapBufferAccess.WriteOnly);
                unsafe
                {
                    var array = (vec4 *)pointer;
                    array[0] = new vec4(+1, +0, +0, 0);
                    array[1] = new vec4(+0, +1, +0, 0);
                    array[2] = new vec4(+0, +0, +1, 0);
                    array[3] = new vec4(+1, +1, +1, 0);
                }
                buffer.Binding(this.Program, "ColorBuffer", 1);
                buffer.Unbind();
                //this.shaderStorageBuffer = buffer;
            }

            this.groundRenderer.Initialize();
        }
Example #8
0
 public void PopulateSSBOs(ShaderStorageBuffer triangleStream, ShaderStorageBuffer boxes)
 {
     Serialize();
     while(ContainerIndices.Count % 4 != 0)
         ContainerIndices.Add(0);
     triangleStream.MapData(ContainerIndices.ToArray());
     boxes.MapData(SerializerBytes.ToArray());
 }
        protected override void DoInitialize()
        {
            base.DoInitialize();

            var texture = new Texture(TextureTarget.Texture2D,
                                      new NullImageFiller(WIDTH, HEIGHT, OpenGL.GL_RGBA8, OpenGL.GL_RGBA, OpenGL.GL_UNSIGNED_BYTE),
                                      new SamplerParameters(
                                          TextureWrapping.Repeat, TextureWrapping.Repeat, TextureWrapping.Repeat,
                                          TextureFilter.Linear, TextureFilter.Linear));

            texture.Initialize();
            this.texture = texture;
            this.SetUniform("u_texture", texture);

            {
                var shaderCodes = new ShaderCode[] { new ShaderCode(File.ReadAllText(@"shaders\RayTracingRenderer\raytrace.comp.glsl"), ShaderType.ComputeShader), };
                this.computeProgram = shaderCodes.CreateProgram();
                this.computeProgram.Bind();
                g_directionBuffer.glusRaytracePerspectivef(
                    DIRECTION_BUFFER_PADDING, 30.0f, WIDTH, HEIGHT);
                using (var buffer = new ShaderStorageBuffer <float>(BufferUsage.StaticDraw))
                {
                    buffer.Create(g_directionBuffer.Length);
                    unsafe
                    {
                        var array = (float *)buffer.Header.ToPointer();
                        for (int i = 0; i < g_directionBuffer.Length; i++)
                        {
                            array[i] = g_directionBuffer[i];
                        }
                    }
                    this.g_directionSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr;
                }
                using (var buffer = new ShaderStorageBuffer <float>(BufferUsage.StaticDraw))
                {
                    buffer.Create(g_positionBuffer.Length);
                    unsafe
                    {
                        var array = (float *)buffer.Header.ToPointer();
                        for (int i = 0; i < g_positionBuffer.Length; i++)
                        {
                            array[i] = g_positionBuffer[i];
                        }
                    }
                    this.g_positionSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr;
                }
                using (var buffer = new ShaderStorageBuffer <float>(BufferUsage.StaticDraw))
                {
                    buffer.Create(g_stackBuffer.Length);
                    unsafe
                    {
                        var array = (float *)buffer.Header.ToPointer();
                        for (int i = 0; i < g_stackBuffer.Length; i++)
                        {
                            array[i] = g_stackBuffer[i];
                        }
                    }
                    this.g_stackSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr;
                }
                using (var buffer = new ShaderStorageBuffer <Sphere>(BufferUsage.StaticDraw))
                {
                    buffer.Create(g_sphereBuffer.Length);
                    unsafe
                    {
                        var array = (Sphere *)buffer.Header.ToPointer();
                        for (int i = 0; i < g_sphereBuffer.Length; i++)
                        {
                            array[i] = g_sphereBuffer[i];
                        }
                    }
                    this.g_sphereSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr;
                }
                using (var buffer = new ShaderStorageBuffer <PointLight>(BufferUsage.StaticDraw))
                {
                    buffer.Create(g_lightBuffer.Length);
                    unsafe
                    {
                        var array = (PointLight *)buffer.Header.ToPointer();
                        for (int i = 0; i < g_lightBuffer.Length; i++)
                        {
                            array[i] = g_lightBuffer[i];
                        }
                    }
                    this.g_pointLightSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr;
                }
            }
        }
Example #10
0
        public PhysicsTest()
        {
            var scene = Game.World.Scene;

            Game.Invoke(() =>
            {
                Object3dInfo point3dinfo = new Object3dInfo(new VertexInfo[] { new VertexInfo()
                                                                               {
                                                                                   Position = Vector3.One,
                                                                                   Normal   = Vector3.UnitZ,
                                                                                   UV       = Vector2.Zero
                                                                               } });
                Object3dInfo point3dinfo2 = Object3dGenerator.CreateCube(Vector3.One * 0.1f, Vector2.One).AsObject3dInfo();
                OpenTK.Graphics.OpenGL4.GL.PointSize(111);
                GenericMaterial whitemat = new GenericMaterial()
                {
                    DiffuseColor = Vector3.One
                };
                Mesh3d points = Mesh3d.Create(point3dinfo2, whitemat);
                //point3dinfo.DrawMode = OpenTK.Graphics.OpenGL4.PrimitiveType.Points;
                //whitemat.CustomShaderProgram = ShaderProgram.Compile("Points.vertex.glsl", "Points.fragment.glsl");
                points.ClearInstances();

                ComputeShader updateShader       = new ComputeShader("PhysicsUpdater.compute.glsl");
                ShaderStorageBuffer pointsBuffer = new ShaderStorageBuffer();
                var parts         = new List <Particle>();
                List <byte> bytes = new List <byte>();
                for (int i = 0; i < 1024 * 2; i++)
                {
                    var part = new Particle()
                    {
                        Position = new Vector3(rand(-20, 20), rand(0, 20), rand(-10, 10)),
                        Velocity = Vector3.Zero
                    };
                    points.AddInstance(new TransformationManager(part.Position));

                    bytes.AddRange(BitConverter.GetBytes(part.Position.X));
                    bytes.AddRange(BitConverter.GetBytes(part.Position.Y));
                    bytes.AddRange(BitConverter.GetBytes(part.Position.Z));
                    bytes.AddRange(BitConverter.GetBytes(part.Position.X));

                    bytes.AddRange(BitConverter.GetBytes(part.Velocity.X));
                    bytes.AddRange(BitConverter.GetBytes(part.Velocity.Y));
                    bytes.AddRange(BitConverter.GetBytes(part.Velocity.Z));
                    bytes.AddRange(BitConverter.GetBytes(part.Velocity.X));
                }
                pointsBuffer.MapData(bytes.ToArray());

                pointsBuffer.Use(9);
                Game.OnBeforeDraw += (z, x) =>
                {
                    updateShader.Use();
                    pointsBuffer.Use(9);
                    updateShader.SetUniform("ParticlesCount", 1024 * 2);
                    updateShader.Dispatch(2, 1, 1);

                    pointsBuffer.Use(9);
                };

                points.UpdateMatrix();
                scene.Add(points);
            });
        }
        protected override void load_Buffers()
        {
            //------------------------------------------------------
            // AutoFocus
            //------------------------------------------------------

            _ssboAutoFocus = new ShaderStorageBuffer(new EngineHelper.size[]
            {
                EngineHelper.size.vec2
            });

            //------------------------------------------------------
            // COC
            //------------------------------------------------------
            _tCOC = new Texture(TextureTarget.Texture2D,
                                _resolution_half.W, _resolution_half.H, 0,
                                false, false,
                                PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float,
                                TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tCOC.load();

            _tCOC_Foreground_Blurred = new Texture(TextureTarget.Texture2D,
                                                   _resolution_half.W, _resolution_half.H, 0,
                                                   false, false,
                                                   PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float,
                                                   TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tCOC_Foreground_Blurred.load();

            _tCOC_Foreground = new Texture(TextureTarget.Texture2D,
                                           _resolution_half.W, _resolution_half.H, 0,
                                           false, false,
                                           PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float,
                                           TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tCOC_Foreground.load();

            _tCOC_Foreground_Final = new Texture(TextureTarget.Texture2D,
                                                 _resolution_half.W, _resolution_half.H, 0,
                                                 false, false,
                                                 PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float,
                                                 TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tCOC_Foreground_Final.load();

            _tCOC_Final = new Texture(TextureTarget.Texture2D,
                                      _resolution.W, _resolution.H, 0,
                                      false, false,
                                      PixelInternalFormat.R32f, PixelFormat.Red, PixelType.Float,
                                      TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tCOC_Final.load();

            //------------------------------------------------------
            // Bokeh
            //------------------------------------------------------
            _iBokehShape = _tLoader.createImage(_path_static_textures + "bokeh_circle.png", TextureTarget.Texture2D, TextureWrapMode.Clamp, true);

            _tBokeh_Positions = new Texture(TextureTarget.Texture1D,
                                            _bokeh_max_shapes, 0, 0,
                                            false, false,
                                            PixelInternalFormat.Rgba32f, PixelFormat.Rgba, PixelType.Float,
                                            TextureMinFilter.Nearest, TextureMagFilter.Nearest, TextureWrapMode.Clamp);
            _tBokeh_Positions.load();

            _tBokeh_Colors = new Texture(TextureTarget.Texture1D,
                                         _bokeh_max_shapes, 0, 0,
                                         false, false,
                                         PixelInternalFormat.Rgba32f, PixelFormat.Rgba, PixelType.Float,
                                         TextureMinFilter.Nearest, TextureMagFilter.Nearest, TextureWrapMode.Clamp);
            _tBokeh_Colors.load();

            _tBokeh_Points = new Texture(TextureTarget.Texture2D,
                                         _resolution_half.W, _resolution_half.H, 0,
                                         false, false,
                                         PixelInternalFormat.Rgb16f, PixelFormat.Rgb, PixelType.Float,
                                         TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tBokeh_Points.load();


            load_BuffersBokeh();


            //------------------------------------------------------
            // DOF
            //------------------------------------------------------
            _tDOF_Scene = new Texture(TextureTarget.Texture2D,
                                      _resolution_half.W, _resolution_half.H, 0,
                                      false, false,
                                      PixelInternalFormat.Rgba16f, PixelFormat.Rgba, PixelType.Float,
                                      TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tDOF_Scene.load();

            _tDOF_Scene_2 = new Texture(TextureTarget.Texture2D,
                                        _resolution_half.W, _resolution_half.H, 0,
                                        false, false,
                                        PixelInternalFormat.Rgba16f, PixelFormat.Rgba, PixelType.Float,
                                        TextureMinFilter.Linear, TextureMagFilter.Linear, TextureWrapMode.Clamp);
            _tDOF_Scene_2.load();

            //------------------------------------------------------
            // Frame Buffers
            //------------------------------------------------------
            _fHalfResolution = new FrameBuffer("DOF - Half Resolution");
            _fHalfResolution.load(new Dictionary <FramebufferAttachment, Texture>()
            {
                { FramebufferAttachment.ColorAttachment0, _tCOC },
                { FramebufferAttachment.ColorAttachment1, _tCOC_Foreground_Blurred },
                { FramebufferAttachment.ColorAttachment2, _tCOC_Foreground },
                { FramebufferAttachment.ColorAttachment3, _tCOC_Foreground_Final },
                { FramebufferAttachment.ColorAttachment4, _tBokeh_Points },
                { FramebufferAttachment.ColorAttachment5, _tDOF_Scene },
                { FramebufferAttachment.ColorAttachment6, _tDOF_Scene_2 }
            });

            _fFullResoution = new FrameBuffer("DOF - Full Resolution");
            _fFullResoution.load(new Dictionary <FramebufferAttachment, Texture>()
            {
                { FramebufferAttachment.ColorAttachment0, _tCOC_Final }
            });
        }
Example #12
0
        public void PrepareTrianglesData(List<Mesh3d> meshes)
        {
            List<Triangle> triangles = new List<Triangle>();
            foreach(var mesh in meshes)
            {
                var Triangle = new Triangle();
                var vertices = mesh.MainObjectInfo.GetOrderedVertices();
                var normals = mesh.MainObjectInfo.GetOrderedNormals();
                for(int i = 0; i < vertices.Count; i++)
                {
                    var vertex = new Vertex()
                    {
                        Position = vertices[i],
                        Normal = normals[i],
                        Albedo = mesh.MainMaterial.Color.Xyz
                    };
                    vertex.Tranform(mesh.Matrix);
                    Triangle.Vertices.Add(vertex);
                    if(Triangle.Vertices.Count == 3)
                    {
                        triangles.Add(Triangle);
                        Triangle = new Triangle();
                    }
                }
            }
            SceneOctalTree tree = new SceneOctalTree();
            Triangle[] trcopy = new Triangle[triangles.Count];
            triangles.CopyTo(trcopy);
            tree.CreateFromTriangleList(trcopy.ToList());
            TriangleCount = triangles.Count;
            // lets prepare byte array
            // layout
            // posx, posy, poz, norx, nory, norz, albr, albg, albz
            List<byte> bytes = new List<byte>();
            foreach(var triangle in triangles)
            {
                foreach(var vertex in triangle.Vertices)
                {
                    bytes.AddRange(BitConverter.GetBytes(vertex.Position.X));
                    bytes.AddRange(BitConverter.GetBytes(vertex.Position.Y));
                    bytes.AddRange(BitConverter.GetBytes(vertex.Position.Z));
                    bytes.AddRange(BitConverter.GetBytes(0.0f));

                    bytes.AddRange(BitConverter.GetBytes(vertex.Normal.X));
                    bytes.AddRange(BitConverter.GetBytes(vertex.Normal.Y));
                    bytes.AddRange(BitConverter.GetBytes(vertex.Normal.Z));
                    bytes.AddRange(BitConverter.GetBytes(0.0f));

                    bytes.AddRange(BitConverter.GetBytes(vertex.Albedo.X));
                    bytes.AddRange(BitConverter.GetBytes(vertex.Albedo.Y));
                    bytes.AddRange(BitConverter.GetBytes(vertex.Albedo.Z));
                    bytes.AddRange(BitConverter.GetBytes(0.0f));
                }
            }
            MeshDataSSBO = new ShaderStorageBuffer();
            TrianglesStream = new ShaderStorageBuffer();
            OctreeBoxes = new ShaderStorageBuffer();
            GLThread.Invoke(() =>
            {
                MeshDataSSBO.MapData(bytes.ToArray());
                tree.PopulateSSBOs(TrianglesStream, OctreeBoxes);
                BoxesCount = tree.TotalBoxesCount;
            });
            RandomsSSBO = new ShaderStorageBuffer();
        }
Example #13
0
 public PathTracer()
 {
     TracerShader = new ComputeShader("PathTracer.compute.glsl");
     LightsSSBO = new ShaderStorageBuffer();
 }
Example #14
0
 public void ShaderStorageBuffer_TestCreation()
 {
     using (ShaderStorageBuffer ssbo = new ShaderStorageBuffer(BufferUsage.DynamicDraw)) {
         ssbo.Create(_Context, (uint)Math.Min(1024 * 1024, _Context.Limits.MaxShaderStorageBlockSize));
     }
 }