inline void VL_glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
 {
   if (glFramebufferTextureLayer)
     glFramebufferTextureLayer(target, attachment, texture, level, layer);
   else
   if (glFramebufferTextureLayerARB)
     glFramebufferTextureLayerARB(target, attachment, texture, level, layer);
   else
   if (glFramebufferTextureLayerEXT)
     glFramebufferTextureLayerEXT(target, attachment, texture, level, layer);
   else
     VL_UNSUPPORTED_FUNC();
 }
void Scene::drawAtPoint(float*point, float* direction,
			float*up, GLuint fbo, int width, int height,
			float fovy, float front, float back)
{



  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBOID);

  glUseProgram(0);
  glViewport(0,0,shadowMapSize, shadowMapSize);
  
  for(size_t i = 0; i < lights.size(); ++i)
    lights[i]->execute();

  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  glCullFace(GL_FRONT);


  for (unsigned light = 0; light < numLights; ++ light)
    {
      glFramebufferTextureLayerARB(GL_FRAMEBUFFER_EXT, 
				   GL_DEPTH_ATTACHMENT_EXT,
				   shadowMapTexture, 0, light);
      
      glClear(GL_DEPTH_BUFFER_BIT);

      float* lightPos;
      float lightLookAt[3];
      lightPos = lights[light]->getPosition();
      lights[light]->lookAt(lightLookAt);

      float cutoff = lights[light]->getCutoff();
      
      viewProjSetup(lightPos, lightLookAt, up, cutoff);

      drawObjects();
  
      viewProjSetup(lightPos, lightLookAt, up, cutoff);

      texMatSetup(light);//load bias and projection/
    }

  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);//render to window
  glViewport(0,0,width, height);

  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glUseProgram(shadowProgram);
  glUniform1i(shadowTexUniform, texUnitBase);
  glUniform1i(uniformTexUnitBase, texUnitBase);
  glUniform1i(uniformNumLights, numLights);

  viewProjSetup(point, direction, up, fovy, 1.0, front, back);

  glCullFace(GL_BACK);
  drawObjects();
  glFlush();

}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBGeometryShader4_glFramebufferTextureLayerARB(JNIEnv *__env, jclass clazz, jint target, jint attachment, jint texture, jint level, jint layer) {
    glFramebufferTextureLayerARBPROC glFramebufferTextureLayerARB = (glFramebufferTextureLayerARBPROC)tlsGetFunction(1115);
    UNUSED_PARAM(clazz)
    glFramebufferTextureLayerARB(target, attachment, texture, level, layer);
}