Exemplo n.º 1
0
        public SSAO(int width, int height, Camera camera)
            : base()
        {
            this.camera = camera;

            random = new Random();

            geometryBuffer = new IOBuffer(width, height, true, PixelInternalFormat.Rgb32f);
            SSAOBuffer     = new IOBuffer(width, height, false, PixelInternalFormat.R32f);

            ssao_geometryDepth = ShaderUtil.CreateShader("ssao_geometryDepth", "./data/shaders/SSAO_geometry.vs", "./data/shaders/SSAO_geometry.fs");
            ssao       = ShaderUtil.CreateShader("ssao", "./data/shaders/SSAO_pass.vs", "./data/shaders/SSAO_pass.fs");
            ssao_voxel = ShaderUtil.CreateShader("qb", "./data/shaders/SSAO_voxel.vs", "./data/shaders/SSAO_voxel.fs");

            ssao.WriteUniform("gSampleRad", 1.25f);
            ssao.WriteUniform("gProj", camera.projection);
            ssao.WriteUniform("gPositionMap", 1);

            ssao_voxel.WriteUniform("gScreenSize", new Vector2(width, height));
            ssao_voxel.WriteUniform("gAOMap", 2);

            Vector3[] kernel = new Vector3[8];

            for (uint i = 0; i < kernel.Length; i++)
            {
                float   scale = (float)i / (float)(kernel.Length);
                Vector3 v;
                v.X = 2.0f * (float)random.Next(0x7fff) / 0x7fff - 1.0f;
                v.Y = 2.0f * (float)random.Next(0x7fff) / 0x7fff - 1.0f;
                v.Z = 2.0f * (float)random.Next(0x7fff) / 0x7fff - 1.0f;
                v  *= (0.1f + 0.9f * scale * scale);

                kernel[i] = v;
            }

            unsafe
            {
                fixed(float *pointer = &kernel[0].X)
                {
                    ssao.WriteUniformArray("gKernel", kernel.Length, pointer);
                }
            }

            quadBuffer = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ArrayBuffer, quadBuffer);
            GL.EnableVertexAttribArray(0);
            GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, sizeof(float) * 3, 0);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * quadData.Length), quadData, BufferUsageHint.StaticDraw);
            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
        }
Exemplo n.º 2
0
        public void render(Shader shader)
        {
            if (Visible && Singleton <Raycaster> .INSTANCE.lastHit.distance != 10000)
            {
                shader.WriteUniform("highlight", new Vector3(1, 1, 1));

                unsafe
                {
                    fixed(float *pointer = &color.R)
                    {
                        shader.WriteUniformArray("colors", 1, pointer);
                    }
                }

                GL.BindVertexArray(vertexArray);
                GL.DrawArrays(PrimitiveType.Quads, 0, 4);
                GL.BindVertexArray(0);
            }
        }