效果图

shader
"attribute vec4 position;\n" +
"attribute vec4 inputTextureCoordinate;\n" +
"\n" +
"uniform highp float texelWidth; \n" +
"uniform highp float texelHeight; \n" +
"\n" +
"varying vec2 textureCoordinate;\n" +
"varying vec2 leftTextureCoordinate;\n" +
"varying vec2 rightTextureCoordinate;\n" +
"\n" +
"varying vec2 topTextureCoordinate;\n" +
"varying vec2 topLeftTextureCoordinate;\n" +
"varying vec2 topRightTextureCoordinate;\n" +
"\n" +
"varying vec2 bottomTextureCoordinate;\n" +
"varying vec2 bottomLeftTextureCoordinate;\n" +
"varying vec2 bottomRightTextureCoordinate;\n" +
"\n" +
"void main()\n" +
"{\n" +
" gl_Position = position;\n" +
"\n" +
" vec2 widthStep = vec2(texelWidth, 0.0);\n" +
" vec2 heightStep = vec2(0.0, texelHeight);\n" +
" vec2 widthHeightStep = vec2(texelWidth, texelHeight);\n" +
" vec2 widthNegativeHeightStep = vec2(texelWidth, -texelHeight);\n" +
"\n" +
" textureCoordinate = inputTextureCoordinate.xy;\n" +
" leftTextureCoordinate = inputTextureCoordinate.xy - widthStep;\n" +
" rightTextureCoordinate = inputTextureCoordinate.xy + widthStep;\n" +
"\n" +
" topTextureCoordinate = inputTextureCoordinate.xy - heightStep;\n" +
" topLeftTextureCoordinate = inputTextureCoordinate.xy - widthHeightStep;\n" +
" topRightTextureCoordinate = inputTextureCoordinate.xy + widthNegativeHeightStep;\n" +
"\n" +
" bottomTextureCoordinate = inputTextureCoordinate.xy + heightStep;\n" +
" bottomLeftTextureCoordinate = inputTextureCoordinate.xy - widthNegativeHeightStep;\n" +
" bottomRightTextureCoordinate = inputTextureCoordinate.xy + widthHeightStep;\n" +
"}";
"varying vec2 textureCoordinate;\n" +
"varying vec2 leftTextureCoordinate;\n" +
"varying vec2 rightTextureCoordinate;\n" +
"\n" +
"varying vec2 topTextureCoordinate;\n" +
"varying vec2 topLeftTextureCoordinate;\n" +
"varying vec2 topRightTextureCoordinate;\n" +
"\n" +
"varying vec2 bottomTextureCoordinate;\n" +
"varying vec2 bottomLeftTextureCoordinate;\n" +
"varying vec2 bottomRightTextureCoordinate;\n" +
"\n" +
"uniform sampler2D inputImageTexture;\n" +
"\n" +
"void main()\n" +
"{\n" +
"float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r;\n" +
"float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r;\n" +
"float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r;\n" +
"float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r;\n" +
"float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r;\n" +
"float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r;\n" +
"float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r;\n" +
"float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r;\n" +
"float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r;\n" +
"\n" +
"float pixelIntensitySum = bottomLeftIntensity + topRightIntensity + topLeftIntensity + bottomRightIntensity + leftIntensity + rightIntensity + bottomIntensity + topIntensity + centerIntensity;\n" +
"float sumTest = step(1.5, pixelIntensitySum);\n" +
"float pixelTest = step(0.01, centerIntensity);\n" +
"\n" +
"gl_FragColor = vec4(vec3(sumTest * pixelTest), 1.0);\n" +
"}\n";
原理
step: pixelIntensitySum < 1.5, 返回0,否则返回1
取9个点,然后计算R值的和,即9个点的和大于1.5和中心位置的值大于0.01,才会有值。
