package com.af.experiments.FxCameraApp.shaders; import static android.opengl.GLES20.*; import static com.af.experiments.FxCameraApp.Utils.OpenGlUtils.GL_TEXTURE_EXTERNAL_OES; public class GlPreviewShader extends GlShader{ private static final String VERTEX_SHADER = "uniform mat4 uMVPMatrix;\n" + "uniform mat4 uSTMatrix;\n" + "uniform float uCRatio;\n" + "attribute vec4 aPosition;\n" + "attribute vec4 aTextureCoord;\n" + "varying highp vec2 vTextureCoord;\n" + "void main() {\n" + "vec4 scaledPos = aPosition;\n" + "scaledPos.x = scaledPos.x * uCRatio;\n" + "gl_Position = uMVPMatrix * scaledPos;\n" + "vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" + "}\n"; private final int mTexTarget; public GlPreviewShader(final int texTarget) { super(VERTEX_SHADER, createFragmentShaderSourceOESIfNeed(texTarget)); mTexTarget = texTarget; } private static String createFragmentShaderSourceOESIfNeed(final int texTarget) { if (texTarget == GL_TEXTURE_EXTERNAL_OES) { return new StringBuilder() .append("#extension GL_OES_EGL_image_external : require\n") .append(DEFAULT_FRAGMENT_SHADER.replace("sampler2D", "samplerExternalOES")) .toString(); } return DEFAULT_FRAGMENT_SHADER; } public void draw(final int texName, final float[] mvpMatrix, final float[] stMatrix, final float aspectRatio) { useProgram(); glUniformMatrix4fv(getHandle("uMVPMatrix"), 1, false, mvpMatrix, 0); glUniformMatrix4fv(getHandle("uSTMatrix"), 1, false, stMatrix, 0); glUniform1f(getHandle("uCRatio"), aspectRatio); glBindBuffer(GL_ARRAY_BUFFER, getVertexBufferName()); glEnableVertexAttribArray(getHandle("aPosition")); glVertexAttribPointer(getHandle("aPosition"), VERTICES_DATA_POS_SIZE, GL_FLOAT, false, VERTICES_DATA_STRIDE_BYTES, VERTICES_DATA_POS_OFFSET); glEnableVertexAttribArray(getHandle("aTextureCoord")); glVertexAttribPointer(getHandle("aTextureCoord"), VERTICES_DATA_UV_SIZE, GL_FLOAT, false, VERTICES_DATA_STRIDE_BYTES, VERTICES_DATA_UV_OFFSET); glActiveTexture(GL_TEXTURE0); glBindTexture(mTexTarget, texName); glUniform1i(getHandle(DEFAULT_UNIFORM_SAMPLER), 0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableVertexAttribArray(getHandle("aPosition")); glDisableVertexAttribArray(getHandle("aTextureCoord")); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); } }