public void OnDrawFrame(IGL10 gl) { // Move ShellViewModel.Animate(); mLightDir[0] = -0.5f; mLightDir[1] = -1.0f; mLightDir[2] = -0.5f; // in left-handed region Vector.normalize(mLightDir); mRT["screen"].switchTargetFrameBuffer(); GLES20.GlClear(GL10.GlColorBufferBit | GL10.GlDepthBufferBit); //////////////////////////////////////////////////////////////////// //// draw models ShellViewModel.LockWith(() => { foreach (var shell in ShellViewModel.Shells) { if (shell.Loaded) { foreach (var rs in shell.RenderSets) { mRT[rs.target].switchTargetFrameBuffer(); GLSL glsl = mGLSL[rs.shader]; GLES20.GlUseProgram(glsl.mProgram); // Projection Matrix GLES20.GlUniformMatrix4fv(glsl.muPMatrix, 1, false, ShellViewModel.ProjectionMatrix, 0); // LightPosition GLES20.GlUniform3fv(glsl.muLightDir, 1, mLightDir, 0); bindBuffer(shell.Surface, glsl); if (!rs.shader.EndsWith("alpha")) { drawNonAlpha(shell.Surface, glsl); drawAlpha(shell.Surface, glsl, false); } else { drawAlpha(shell.Surface, glsl, true); } } } } }); GLES20.GlFlush(); checkGlError(TAG); }