Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        protected override IndependentBufferPtr Upload2GPU()
        {
            uint[] buffers = new uint[1];
            glGenBuffers(1, buffers);
            const uint target = OpenGL.GL_SHADER_STORAGE_BUFFER;

            glBindBuffer(target, buffers[0]);
            glBufferData(target, this.ByteLength, this.Header, (uint)this.Usage);
            glBindBuffer(target, 0);

            var bufferPtr = new ShaderStorageBufferPtr(buffers[0], this.Length, this.ByteLength);

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