Files
MoGoEagleEye/libraries/map-usbcamera/src/main/java/com/serenegiant/glutils/ShaderConst.java
donghongyu b10306fc45 [Change]
开始USB摄像头的功能集成,还无法获取usb连接广播需要调试

Signed-off-by: donghongyu <donghongyu@zhidaoauto.com>
2022-02-10 18:47:07 +08:00

422 lines
18 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.serenegiant.glutils;
/*
* libcommon
* utility/helper classes for myself
*
* Copyright (c) 2014-2018 saki t_saki@serenegiant.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import android.opengl.GLES20;
/**
* Created by saki on 16/08/26.
* フラグメントシェーダーとかの文字列定数達を集める
*/
public class ShaderConst {
public static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65;
public static final int GL_TEXTURE_2D = 0x0DE1;
public static final String SHADER_VERSION = "#version 100\n";
public static final String HEADER_2D = "";
public static final String SAMPLER_2D = "sampler2D";
public static final String HEADER_OES = "#extension GL_OES_EGL_image_external : require\n";
public static final String SAMPLER_OES = "samplerExternalOES";
public static final int KERNEL_SIZE3x3 = 9;
public static final int KERNEL_SIZE5x = 25;
public static final int NO_TEXTURE = -1;
public static final int[] TEX_NUMBERS = {
GLES20.GL_TEXTURE0, GLES20.GL_TEXTURE1,
GLES20.GL_TEXTURE2, GLES20.GL_TEXTURE3,
GLES20.GL_TEXTURE4, GLES20.GL_TEXTURE5,
GLES20.GL_TEXTURE6, GLES20.GL_TEXTURE7,
GLES20.GL_TEXTURE8, GLES20.GL_TEXTURE9,
GLES20.GL_TEXTURE10, GLES20.GL_TEXTURE11,
GLES20.GL_TEXTURE12, GLES20.GL_TEXTURE13,
GLES20.GL_TEXTURE14, GLES20.GL_TEXTURE15,
GLES20.GL_TEXTURE16, GLES20.GL_TEXTURE17,
GLES20.GL_TEXTURE18, GLES20.GL_TEXTURE19,
GLES20.GL_TEXTURE20, GLES20.GL_TEXTURE21,
GLES20.GL_TEXTURE22, GLES20.GL_TEXTURE23,
GLES20.GL_TEXTURE24, GLES20.GL_TEXTURE25,
GLES20.GL_TEXTURE26, GLES20.GL_TEXTURE27,
GLES20.GL_TEXTURE28, GLES20.GL_TEXTURE29,
GLES20.GL_TEXTURE30, GLES20.GL_TEXTURE31,
};
// 関数文字列定義
/**
* RGBをHSVに変換
* {R[0.0-1.0], G[0.0-1.0], B([0.0-1.0]} => {H[0.0-1.0], S[0.0-1.0], V[0.0-1.0]}
*/
public static final String FUNC_RGB2HSV
= "vec3 rgb2hsv(vec3 c) {\n" +
"vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n" +
"vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n" +
"vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n" +
"float d = q.x - min(q.w, q.y);\n" +
"float e = 1.0e-10;\n" +
"return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n" +
"}\n";
/**
* HSVをRGBに変換
* {H[0.0-1.0], S[0.0-1.0], V[0.0-1.0]} => {R[0.0-1.0], G[0.0-1.0], B([0.0-1.0]}
*/
public static final String FUNC_HSV2RGB
= "vec3 hsv2rgb(vec3 c) {\n" +
"vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" +
"vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n" +
"return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n" +
"}\n";
/**
* RGBの輝度を取得
* 変換係数との内積を計算するだけ
* 係数は(0.2125, 0.7154, 0.0721)
*/
public static final String FUNC_GET_INTENSITY
= "const highp vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);\n" +
"highp float getIntensity(vec3 c) {\n" +
"return dot(c.rgb, luminanceWeighting);\n" +
"}\n";
// 頂点シェーダー
/**
* モデルビュー変換行列とテクスチャ変換行列適用するだけの頂点シェーダー
*/
public static final String VERTEX_SHADER = SHADER_VERSION +
"uniform mat4 uMVPMatrix;\n" + // モデルビュー変換行列
"uniform mat4 uTexMatrix;\n" + // テクスチャ変換行列
"attribute highp vec4 aPosition;\n" + // 頂点座標
"attribute highp vec4 aTextureCoord;\n" + // テクスチャ情報
"varying highp vec2 vTextureCoord;\n" + // フラグメントシェーダーへ引き渡すテクスチャ座標
"void main() {\n" +
" gl_Position = uMVPMatrix * aPosition;\n" +
" vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" +
"}\n";
// フラグメントシェーダー
public static final String FRAGMENT_SHADER_SIMPLE_OES
= SHADER_VERSION
+ HEADER_OES
+ "precision mediump float;\n"
+ "uniform samplerExternalOES sTexture;\n"
+ "varying highp vec2 vTextureCoord;\n"
+ "void main() {\n"
+ " gl_FragColor = texture2D(sTexture, vTextureCoord);\n"
+ "}";
public static final String FRAGMENT_SHADER_SIMPLE
= SHADER_VERSION
+ HEADER_2D
+ "precision mediump float;\n"
+ "uniform sampler2D sTexture;\n"
+ "varying highp vec2 vTextureCoord;\n"
+ "void main() {\n"
+ " gl_FragColor = texture2D(sTexture, vTextureCoord);\n"
+ "}";
//
// Simple fragment shader for use with "normal" 2D textures.
private static final String FRAGMENT_SHADER_BASE = SHADER_VERSION +
"%s" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform %s sTexture;\n" +
"void main() {\n" +
" gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
"}\n";
public static final String FRAGMENT_SHADER_2D
= String.format(FRAGMENT_SHADER_BASE, HEADER_2D, SAMPLER_2D);
public static final String FRAGMENT_SHADER_EXT
= String.format(FRAGMENT_SHADER_BASE, HEADER_OES, SAMPLER_OES);
// Fragment shader that converts color to black & white with a simple transformation.
private static final String FRAGMENT_SHADER_BW_BASE = SHADER_VERSION +
"%s" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform %s sTexture;\n" +
"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";
public static final String FRAGMENT_SHADER_BW
= String.format(FRAGMENT_SHADER_BW_BASE, HEADER_2D, SAMPLER_2D);
public static final String FRAGMENT_SHADER_EXT_BW
= String.format(FRAGMENT_SHADER_BW_BASE, HEADER_OES, SAMPLER_OES);
// Fragment shader that attempts to produce a high contrast image
private static final String FRAGMENT_SHADER_NIGHT_BASE = SHADER_VERSION +
"%s" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform %s sTexture;\n" +
"void main() {\n" +
" vec4 tc = texture2D(sTexture, vTextureCoord);\n" +
" float color = ((tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11) - 0.5 * 1.5) + 0.8;\n" +
" gl_FragColor = vec4(color, color + 0.15, color, 1.0);\n" +
"}\n";
public static final String FRAGMENT_SHADER_NIGHT
= String.format(FRAGMENT_SHADER_NIGHT_BASE, HEADER_2D, SAMPLER_2D);
public static final String FRAGMENT_SHADER_EXT_NIGHT
= String.format(FRAGMENT_SHADER_NIGHT_BASE, HEADER_OES, SAMPLER_OES);
// Fragment shader that applies a Chroma Key effect, making green pixels transparent
private static final String FRAGMENT_SHADER_CHROMA_KEY_BASE = SHADER_VERSION +
"%s" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform %s sTexture;\n" +
"void main() {\n" +
" vec4 tc = texture2D(sTexture, vTextureCoord);\n" +
" float color = ((tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11) - 0.5 * 1.5) + 0.8;\n" +
" if(tc.g > 0.6 && tc.b < 0.6 && tc.r < 0.6){ \n" +
" gl_FragColor = vec4(0, 0, 0, 0.0);\n" +
" }else{ \n" +
" gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
" }\n" +
"}\n";
public static final String FRAGMENT_SHADER_CHROMA_KEY
= String.format(FRAGMENT_SHADER_CHROMA_KEY_BASE, HEADER_2D, SAMPLER_2D);
public static final String FRAGMENT_SHADER_EXT_CHROMA_KEY
= String.format(FRAGMENT_SHADER_CHROMA_KEY_BASE, HEADER_OES, SAMPLER_OES);
private static final String FRAGMENT_SHADER_SQUEEZE_BASE = SHADER_VERSION +
"%s" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform %s sTexture;\n" +
"uniform vec2 uPosition;\n" +
"void main() {\n" +
" vec2 texCoord = vTextureCoord.xy;\n" +
" vec2 normCoord = 2.0 * texCoord - 1.0;\n"+
" float r = length(normCoord); // to polar coords \n" +
" float phi = atan(normCoord.y + uPosition.y, normCoord.x + uPosition.x); // to polar coords \n"+
" r = pow(r, 1.0/1.8) * 0.8;\n"+ // Squeeze it
" normCoord.x = r * cos(phi); \n" +
" normCoord.y = r * sin(phi); \n" +
" texCoord = normCoord / 2.0 + 0.5;\n"+
" gl_FragColor = texture2D(sTexture, texCoord);\n"+
"}\n";
public static final String FRAGMENT_SHADER_SQUEEZE
= String.format(FRAGMENT_SHADER_SQUEEZE_BASE, HEADER_2D, SAMPLER_2D);
public static final String FRAGMENT_SHADER_EXT_SQUEEZE
= String.format(FRAGMENT_SHADER_SQUEEZE_BASE, HEADER_OES, SAMPLER_OES);
public static final String FRAGMENT_SHADER_EXT_TWIRL =
"#version 100\n" +
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform vec2 uPosition;\n" +
"void main() {\n" +
" vec2 texCoord = vTextureCoord.xy;\n" +
" vec2 normCoord = 2.0 * texCoord - 1.0;\n"+
" float r = length(normCoord); // to polar coords \n" +
" float phi = atan(normCoord.y + uPosition.y, normCoord.x + uPosition.x); // to polar coords \n"+
" phi = phi + (1.0 - smoothstep(-0.5, 0.5, r)) * 4.0;\n"+ // Twirl it
" normCoord.x = r * cos(phi); \n" +
" normCoord.y = r * sin(phi); \n" +
" texCoord = normCoord / 2.0 + 0.5;\n"+
" gl_FragColor = texture2D(sTexture, texCoord);\n"+
"}\n";
public static final String FRAGMENT_SHADER_EXT_TUNNEL = SHADER_VERSION +
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform vec2 uPosition;\n" +
"void main() {\n" +
" vec2 texCoord = vTextureCoord.xy;\n" +
" vec2 normCoord = 2.0 * texCoord - 1.0;\n"+
" float r = length(normCoord); // to polar coords \n" +
" float phi = atan(normCoord.y + uPosition.y, normCoord.x + uPosition.x); // to polar coords \n"+
" if (r > 0.5) r = 0.5;\n"+ // Tunnel
" normCoord.x = r * cos(phi); \n" +
" normCoord.y = r * sin(phi); \n" +
" texCoord = normCoord / 2.0 + 0.5;\n"+
" gl_FragColor = texture2D(sTexture, texCoord);\n"+
"}\n";
public static final String FRAGMENT_SHADER_EXT_BULGE = SHADER_VERSION +
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform vec2 uPosition;\n" +
"void main() {\n" +
" vec2 texCoord = vTextureCoord.xy;\n" +
" vec2 normCoord = 2.0 * texCoord - 1.0;\n"+
" float r = length(normCoord); // to polar coords \n" +
" float phi = atan(normCoord.y + uPosition.y, normCoord.x + uPosition.x); // to polar coords \n"+
" r = r * smoothstep(-0.1, 0.5, r);\n"+ // Bulge
" normCoord.x = r * cos(phi); \n" +
" normCoord.y = r * sin(phi); \n" +
" texCoord = normCoord / 2.0 + 0.5;\n"+
" gl_FragColor = texture2D(sTexture, texCoord);\n"+
"}\n";
public static final String FRAGMENT_SHADER_EXT_DENT = SHADER_VERSION +
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform vec2 uPosition;\n" +
"void main() {\n" +
" vec2 texCoord = vTextureCoord.xy;\n" +
" vec2 normCoord = 2.0 * texCoord - 1.0;\n"+
" float r = length(normCoord); // to polar coords \n" +
" float phi = atan(normCoord.y + uPosition.y, normCoord.x + uPosition.x); // to polar coords \n"+
" r = 2.0 * r - r * smoothstep(0.0, 0.7, r);\n"+ // Dent
" normCoord.x = r * cos(phi); \n" +
" normCoord.y = r * sin(phi); \n" +
" texCoord = normCoord / 2.0 + 0.5;\n"+
" gl_FragColor = texture2D(sTexture, texCoord);\n"+
"}\n";
public static final String FRAGMENT_SHADER_EXT_FISHEYE = SHADER_VERSION +
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform vec2 uPosition;\n" +
"void main() {\n" +
" vec2 texCoord = vTextureCoord.xy;\n" +
" vec2 normCoord = 2.0 * texCoord - 1.0;\n"+
" float r = length(normCoord); // to polar coords \n" +
" float phi = atan(normCoord.y + uPosition.y, normCoord.x + uPosition.x); // to polar coords \n"+
" r = r * r / sqrt(2.0);\n"+ // Fisheye
" normCoord.x = r * cos(phi); \n" +
" normCoord.y = r * sin(phi); \n" +
" texCoord = normCoord / 2.0 + 0.5;\n"+
" gl_FragColor = texture2D(sTexture, texCoord);\n"+
"}\n";
public static final String FRAGMENT_SHADER_EXT_STRETCH = SHADER_VERSION +
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform vec2 uPosition;\n" +
"void main() {\n" +
" vec2 texCoord = vTextureCoord.xy;\n" +
" vec2 normCoord = 2.0 * texCoord - 1.0;\n"+
" vec2 s = sign(normCoord + uPosition);\n"+
" normCoord = abs(normCoord);\n"+
" normCoord = 0.5 * normCoord + 0.5 * smoothstep(0.25, 0.5, normCoord) * normCoord;\n"+
" normCoord = s * normCoord;\n"+
" texCoord = normCoord / 2.0 + 0.5;\n"+
" gl_FragColor = texture2D(sTexture, texCoord);\n"+
"}\n";
public static final String FRAGMENT_SHADER_EXT_MIRROR = SHADER_VERSION +
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform vec2 uPosition;\n" +
"void main() {\n" +
" vec2 texCoord = vTextureCoord.xy;\n" +
" vec2 normCoord = 2.0 * texCoord - 1.0;\n"+
" normCoord.x = normCoord.x * sign(normCoord.x + uPosition.x);\n"+
" texCoord = normCoord / 2.0 + 0.5;\n"+
" gl_FragColor = texture2D(sTexture, texCoord);\n"+
"}\n";
public static final String FRAGMENT_SHADER_SOBEL_BASE = SHADER_VERSION +
"%s" +
"#define KERNEL_SIZE3x3 " + KERNEL_SIZE3x3 + "\n" +
"precision highp float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform %s sTexture;\n" +
"uniform float uKernel[18];\n" +
"uniform vec2 uTexOffset[KERNEL_SIZE3x3];\n" +
"uniform float uColorAdjust;\n" +
"void main() {\n" +
" vec3 t0 = texture2D(sTexture, vTextureCoord + uTexOffset[0]).rgb;\n" +
" vec3 t1 = texture2D(sTexture, vTextureCoord + uTexOffset[1]).rgb;\n" +
" vec3 t2 = texture2D(sTexture, vTextureCoord + uTexOffset[2]).rgb;\n" +
" vec3 t3 = texture2D(sTexture, vTextureCoord + uTexOffset[3]).rgb;\n" +
" vec3 t4 = texture2D(sTexture, vTextureCoord + uTexOffset[4]).rgb;\n" +
" vec3 t5 = texture2D(sTexture, vTextureCoord + uTexOffset[5]).rgb;\n" +
" vec3 t6 = texture2D(sTexture, vTextureCoord + uTexOffset[6]).rgb;\n" +
" vec3 t7 = texture2D(sTexture, vTextureCoord + uTexOffset[7]).rgb;\n" +
" vec3 t8 = texture2D(sTexture, vTextureCoord + uTexOffset[8]).rgb;\n" +
" vec3 sumH = t0 * uKernel[0] + t1 * uKernel[1] + t2 * uKernel[2]\n" +
" + t3 * uKernel[3] + t4 * uKernel[4] + t5 * uKernel[5]\n" +
" + t6 * uKernel[6] + t7 * uKernel[7] + t8 * uKernel[8];\n" +
// " vec3 sumV = t0 * uKernel[ 9] + t1 * uKernel[10] + t2 * uKernel[11]\n" +
// " + t3 * uKernel[12] + t4 * uKernel[13] + t5 * uKernel[14]\n" +
// " + t6 * uKernel[15] + t7 * uKernel[16] + t8 * uKernel[17];\n" +
// " float mag = length(abs(sumH) + abs(sumV));\n" +
" float mag = length(sumH);\n" +
" gl_FragColor = vec4(vec3(mag), 1.0);\n" +
"}\n";
public static final String FRAGMENT_SHADER_SOBEL
= String.format(FRAGMENT_SHADER_SOBEL_BASE, HEADER_2D, SAMPLER_2D);
public static final String FRAGMENT_SHADER_EXT_SOBEL
= String.format(FRAGMENT_SHADER_SOBEL_BASE, HEADER_OES, SAMPLER_OES);
public static final float[] KERNEL_NULL = { 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f};
public static final float[] KERNEL_SOBEL_H = { 1f, 0f, -1f, 2f, 0f, -2f, 1f, 0f, -1f, }; // ソーベル(1次微分)
public static final float[] KERNEL_SOBEL_V = { 1f, 2f, 1f, 0f, 0f, 0f, -1f, -2f, -1f, };
public static final float[] KERNEL_SOBEL2_H = { 3f, 0f, -3f, 10f, 0f, -10f, 3f, 0f, -3f, };
public static final float[] KERNEL_SOBEL2_V = { 3f, 10f, 3f, 0f, 0f, 0f, -3f, -10f, -3f, };
public static final float[] KERNEL_SHARPNESS = { 0f, -1f, 0f, -1f, 5f, -1f, 0f, -1f, 0f,}; // シャープネス
public static final float[] KERNEL_EDGE_DETECT = { -1f, -1f, -1f, -1f, 8f, -1f, -1f, -1f, -1f, }; // エッジ検出
public static final float[] KERNEL_EMBOSS = { 2f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, -1f }; // エンボス, オフセット0.5f
public static final float[] KERNEL_SMOOTH = { 1/9f, 1/9f, 1/9f, 1/9f, 1/9f, 1/9f, 1/9f, 1/9f, 1/9f, }; // 移動平均
public static final float[] KERNEL_GAUSSIAN = { 1/16f, 2/16f, 1/16f, 2/16f, 4/16f, 2/16f, 1/16f, 2/16f, 1/16f, }; // ガウシアン(ノイズ除去/)
public static final float[] KERNEL_BRIGHTEN = { 1f, 1f, 1f, 1f, 2f, 1f, 1f, 1f, 1f, };
public static final float[] KERNEL_LAPLACIAN = { 1f, 1f, 1f, 1f, -8f, 1f, 1f, 1f, 1f, }; // ラプラシアン(2次微分)
private static final String FRAGMENT_SHADER_FILT3x3_BASE = SHADER_VERSION +
"%s" +
"#define KERNEL_SIZE3x3 " + KERNEL_SIZE3x3 + "\n" +
"precision highp float;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform %s sTexture;\n" +
"uniform float uKernel[18];\n" +
"uniform vec2 uTexOffset[KERNEL_SIZE3x3];\n" +
"uniform float uColorAdjust;\n" +
"void main() {\n" +
" vec4 sum = vec4(0.0);\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[0]) * uKernel[0];\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[1]) * uKernel[1];\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[2]) * uKernel[2];\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[3]) * uKernel[3];\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[4]) * uKernel[4];\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[5]) * uKernel[5];\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[6]) * uKernel[6];\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[7]) * uKernel[7];\n" +
" sum += texture2D(sTexture, vTextureCoord + uTexOffset[8]) * uKernel[8];\n" +
" gl_FragColor = sum + uColorAdjust;\n" +
"}\n";
public static final String FRAGMENT_SHADER_FILT3x3
= String.format(FRAGMENT_SHADER_FILT3x3_BASE, HEADER_2D, SAMPLER_2D);
public static final String FRAGMENT_SHADER_EXT_FILT3x3
= String.format(FRAGMENT_SHADER_FILT3x3_BASE, HEADER_OES, SAMPLER_OES);
}