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); }
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); } }