@Override public void onDrawFrame(GL10 unused) { GLES20.glClearColor(0f, 0f, 0f, 0f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); if (mShaderCompilerSupport[0] == false) { return; } GLES20.glDisable(GLES20.GL_DEPTH_TEST); GLES20.glEnable(GLES20.GL_BLEND); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); float angle = (SystemClock.uptimeMillis() % 5000) / 5000f * 360; Matrix.setRotateM(mMatrixModel, 0, angle, 1, 2, 0); Matrix.multiplyMM(mMatrixModelViewProjection, 0, mMatrixView, 0, mMatrixModel, 0); Matrix.multiplyMM( mMatrixModelViewProjection, 0, mMatrixProjection, 0, mMatrixModelViewProjection, 0); mShaderSpline.useProgram(); GLES20.glUniformMatrix4fv( mShaderSpline.getHandle("uModelViewProjectionM"), 1, false, mMatrixModelViewProjection, 0); GLES20.glVertexAttribPointer( mShaderSpline.getHandle("aPosition"), 2, GLES20.GL_FLOAT, false, 0, mBufferSpline); GLES20.glEnableVertexAttribArray(mShaderSpline.getHandle("aPosition")); for (float[] ctrl : mSplines) { GLES20.glUniform3fv(mShaderSpline.getHandle("uCtrl"), 4, ctrl, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, COUNT_VERTICES); } }
@Override public void onDrawFrame(GL10 unused) { GLES20.glClearColor(0f, 0f, 0f, 1f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); if (mShaderCompilerSupport[0] == false) { return; } GLES20.glEnable(GLES20.GL_BLEND); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); long time = SystemClock.uptimeMillis(); if (mLastRenderTime == -1) { for (Star star : mStarArray) { star.randomize(); star.mPosition[2] = (float) (Math.random() * 4 - 2); } mLastRenderTime = time; } float t = (time - mLastRenderTime) / 1000f; mLastRenderTime = time; mShaderStar.useProgram(); GLES20.glUniformMatrix4fv( mShaderStar.getHandle("uModelViewProjectionM"), 1, false, mMatrixModelViewProjection, 0); GLES20.glUniform1f(mShaderStar.getHandle("uSize"), .01f); GLES20.glVertexAttribPointer( mShaderStar.getHandle("aPosition"), 2, GLES20.GL_BYTE, false, 0, mBufferVertices); GLES20.glEnableVertexAttribArray(mShaderStar.getHandle("aPosition")); for (Star star : mStarArray) { star.mPosition[2] += star.mSpeed * t; if (star.mPosition[2] > 2) { star.randomize(); } } Arrays.sort( mStarArray, new Comparator<Star>() { @Override public int compare(Star arg0, Star arg1) { return arg0.mPosition[2] < arg1.mPosition[2] ? -1 : 1; } }); for (Star star : mStarArray) { GLES20.glUniform3fv(mShaderStar.getHandle("uPosition"), 1, star.mPosition, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); } GLES20.glDisable(GLES20.GL_BLEND); }
@Override public void onSurfaceCreated(GL10 unused, EGLConfig config) { // Check if shader compiler is supported. GLES20.glGetBooleanv(GLES20.GL_SHADER_COMPILER, mShaderCompilerSupport, 0); // If not, show user an error message and return immediately. if (!mShaderCompilerSupport[0]) { String msg = getContext().getString(R.string.error_shader_compiler); showError(msg); return; } try { String vertexSource = loadRawString(R.raw.spline_vs); String fragmentSource = loadRawString(R.raw.spline_fs); mShaderSpline.setProgram(vertexSource, fragmentSource); } catch (Exception ex) { showError(ex.getMessage()); } }