Ejemplo n.º 1
0
        protected override void CreateGpuBuffer(Buffer buffer)
        {
            ShaderStorageBuffer arrayBuffer = (ShaderStorageBuffer)buffer;

            // Create CPU buffer with 16 elements
            arrayBuffer.Create(_Context, 16);
        }
Ejemplo n.º 2
0
        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]);
                            }
                        }
                    }
        }
Ejemplo n.º 3
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();
        }
Ejemplo n.º 4
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();
        }
        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;
                }
            }
        }
Ejemplo n.º 6
0
 public void ShaderStorageBuffer_TestCreation()
 {
     using (ShaderStorageBuffer ssbo = new ShaderStorageBuffer(BufferUsage.DynamicDraw)) {
         ssbo.Create(_Context, (uint)Math.Min(1024 * 1024, _Context.Limits.MaxShaderStorageBlockSize));
     }
 }