1. A method for adaptive graphics rendering, the method comprising: receiving, at a first virtual machine (VM), from an application, an Open Graphics Library (OpenGL) command for graphics rendering, the first VM comprising a central processing unit (CPU); determining whether a hardware based graphics processing unit (GPU) of second VMs, which have direct access to the GPU, is busy or has substantially low processing capacity, wherein the first VM is configured to use the GPU through the second VMs; forwarding the OpenGL command from the first VM to the second VMs when the GPU has enough capacity to handle a workload of the OpenGL command; and processing the OpenGL command using software rendering running on the CPU at the first VM when the GPU of the second VMs is busy or does not have capacity to handle the workload of the OpenGL command.