public void Render() { gl.Enable(Capability.DepthTest); gl.Clear(Buffers.Color | Buffers.Depth); shaderProgram.Use(gl); gl.BindVertexArray(vertexArray); gl.BindBuffer(BufferTarget.Array, vertexBuffer); gl.ActiveTexture(TextureUnit.Texture0); gl.BindTexture(TextureTarget.Texture2d, texture); chunkPool.Update(); var count = chunkPool.Uninitialized.Count; foreach (var c in chunkPool.Disposed) { if (count > 0) { var(x, y, z) = chunkPool.Uninitialized[count - 1]; chunkPool.Uninitialized.RemoveAt(count - 1); chunkPool.AddInsideRange(InitializeChunk(x, y, z, c)); count--; } else { break; } } foreach (var(x, y, z) in chunkPool.Uninitialized) { chunkPool.AddInsideRange(InitializeChunk(x, y, z, new Chunk <bool>())); } foreach (var c in chunkPool.InsideRange) { if (frustum.SphereInFrustum(new Vector3(c.X * 16 + 8, c.Y * 16 + 8, c.Z * 16 + 8), chunkRadius) == FrustumIntersection.Outside) { continue; } index = 0; int vertexCount = 0; for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { for (int k = 0; k < 16; k++) { if (c[i, j, k]) { vertexCount += GenerateCubeFaces(c, i, j, k, vertexCount); } } } } vertexCount += FlushVertices(vertexCount, index); if (vertexCount > 0) { gl.DrawArrays(DrawMode.Triangles, 0, vertexCount); } } gl.Disable(Capability.DepthTest); }