Пример Custom-Video-Driver для Opentok-android-sdk с использованием текстуры YUV и преобразованием их в канал RGB.
private String vertexShaderCode = "uniform mat4 uMVPMatrix;"
+ "attribute vec4 aPosition;\n"
+ "attribute vec2 aTextureCoord;\n"
+ "varying vec2 vTextureCoord;\n" + "void main() {\n"
+ " gl_Position = uMVPMatrix * aPosition;\n"
+ " vTextureCoord = aTextureCoord;\n" + "}\n";
private String fragmentShaderCode = "precision mediump float;\n"
+ "uniform sampler2D Ytex;\n"
+ "uniform sampler2D Utex,Vtex;\n"
+ "varying vec2 vTextureCoord;\n"
+ "void main(void) {\n"
+ " float nx,ny,r,g,b,y,u,v;\n"
+ " mediump vec4 txl,ux,vx;"
+ " nx=vTextureCoord[0];\n"
+ " ny=vTextureCoord[1];\n"
+ " y=texture2D(Ytex,vec2(nx,ny)).r;\n"
+ " u=texture2D(Utex,vec2(nx,ny)).r;\n"
+ " v=texture2D(Vtex,vec2(nx,ny)).r;\n"
+ " y=1.0-1.1643*(y-0.0625);\n" // this line produces the inverted effect
//+ " y=1.1643*(y-0.0625);\n" // use this line instead if you want to have normal colors
+ " u=u-0.5;\n" + " v=v-0.5;\n" + " r=y+1.5958*v;\n"
+ " g=y-0.39173*u-0.81290*v;\n" + " b=y+2.017*u;\n"
+ " gl_FragColor=vec4(r,g,b,1.0);\n" + "}\n";
В настоящее время я могу изменить канал RGB и выполнить некоторую базовую обработку изображения, например серуюшкала, перевернутый цвет.Однако я хочу использовать текстуру samplerExternalOES для прямого доступа к каналу RGB для обработки изображений и свертка .
Может ли кадр, возвращаемый OpenTOK, использовать samplerExternalOES, аналогично следующему:
private static final String FRAGMENT_SHADER_EXT_BW =
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" + //using medium precision
"varying vec2 vTextureCoord;\n" +//texture coordinate
"uniform samplerExternalOES sTexture;\n" + //sampler texture type
"void main() {\n" +
" vec4 tc = texture2D(sTexture, vTextureCoord);\n" +
" float color = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
" gl_FragColor = vec4(color, color, color, 1.0);\n" +
"}\n";