public void OnDrawFrame(Javax.Microedition.Khronos.Opengles.IGL10 glUnused) { if (_updateSurface) { _surfaceTexture.UpdateTexImage(); _surfaceTexture.GetTransformMatrix(_STMatrix); _updateSurface = false; } GLES20.GlUseProgram(0); GLES20.GlUseProgram(_glProgram); GLES20.GlActiveTexture(GLES20.GlTexture2); var tWidth = _width; var tHeight = _height; funnyGhostEffectBuffer = ByteBuffer.AllocateDirect(tWidth * tHeight * 4); funnyGhostEffectBuffer.Order(ByteOrder.NativeOrder()); funnyGhostEffectBuffer.Position(0); // Note that it is read in GlReadPixels in a different pixel order than top-left to lower-right, so it adds a reversed+mirror effect // when passed to TexImage2D to convert to texture. GLES20.GlReadPixels(0, 0, tWidth - 1, tHeight - 1, GLES20.GlRgba, GLES20.GlUnsignedByte, funnyGhostEffectBuffer); updateTargetTexture(tWidth, tHeight); GLES20.GlBindTexture(GLES20.GlTexture2d, _otherTextureId); GLES20.GlUniform1i(_otherTextureUniform, 2); GLES20.GlUseProgram(0); GLES20.GlUseProgram(_glProgram); GLES20.GlActiveTexture(GLES20.GlTexture1); GLES20.GlBindTexture(GLES11Ext.GlTextureExternalOes, _OESTextureId); GLES20.GlUniform1i(_OESTextureUniform, 1); _triangleVertices.Position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.GlVertexAttribPointer(_aPositionHandle, 3, GLES20.GlFloat, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, _triangleVertices); GLES20.GlEnableVertexAttribArray(_aPositionHandle); _textureVertices.Position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.GlVertexAttribPointer(_aTextureCoord, 2, GLES20.GlFloat, false, TEXTURE_VERTICES_DATA_STRIDE_BYTES, _textureVertices); GLES20.GlEnableVertexAttribArray(_aTextureCoord); Android.Opengl.Matrix.SetIdentityM(_MVPMatrix, 0); GLES20.GlUniformMatrix4fv(_uMVPMatrixHandle, 1, false, _MVPMatrix, 0); GLES20.GlUniformMatrix4fv(_uSTMatrixHandle, 1, false, _STMatrix, 0); GLES20.GlDrawArrays(GLES20.GlTriangleStrip, 0, 4); GLES20.GlFinish(); }
public void drawFrame() { checkGlError("onDrawFrame start"); mSurfaceTexture.GetTransformMatrix(mSTMatrix); //GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); //GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); GLES20.GlUseProgram(mProgram); checkGlError("glUseProgram"); GLES20.GlActiveTexture(GLES20.GlTexture0); GLES20.GlBindTexture(GLES11Ext.GlTextureExternalOes, 0); GLES20.GlBindTexture(GLES11Ext.GlTextureExternalOes, mTextureID); mTriangleVertices.Position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.GlVertexAttribPointer(maPositionHandle, 3, GLES20.GlFloat, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.GlEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.Position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.GlVertexAttribPointer(maTextureHandle, 2, GLES20.GlFloat, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.GlEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); Android.Opengl.Matrix.SetIdentityM(mMVPMatrix, 0); GLES20.GlUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.GlUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.GlDrawArrays(GLES20.GlTriangleStrip, 0, 4); checkGlError("glDrawArrays"); GLES20.GlFinish(); }