我想从纹理生成平滑(一致的宽度和连续的)轮廓,例如以下纹理:
我目前运行一个着色器,它进行非常基本的边缘检测,最终得到以下结果:
void main(void) {
vec2 texCoord = vec2(((vProjectedCoords.x / vProjectedCoords.w) + 1.0 ) / 2.0,
((vProjectedCoords.y / vProjectedCoords.w) + 1.0 ) / 2.0 );
float borderWidth = uWidth; // in px
float step_u = borderWidth * 1.0 / uCanvasWidth;
float step_v = borderWidth * 1.0 / uCanvasHeight;
vec4 centerPixel = texture2D(uTextureFilled, texCoord);
vec4 rightPixel = texture2D(uTextureFilled, texCoord + vec2(step_u, 0.0));
vec4 bottomPixel = texture2D(uTextureFilled, texCoord + vec2(0.0, step_v));
// now manually compute the derivatives
float _dFdX = length(rightPixel - centerPixel) / step_u;
float _dFdY = length(bottomPixel - centerPixel) / step_v;
gl_FragColor.r = max(max(centerPixel.r, rightPixel.r), bottomPixel.r);
gl_FragColor.g = max(max(centerPixel.g, rightPixel.g), bottomPixel.g);
gl_FragColor.b = max(max(centerPixel.b, rightPixel.b), bottomPixel.b);
gl_FragColor.a = max(_dFdX, _dFdY);
return;
显然生成的轮廓并不干净,但即使应用适当的 sobel 过滤也不能增强那么多结果。
我想获得几乎像素完美的轮廓,如果可能的话,最好也忽略输入纹理中的噪声。
谢谢!
编辑:可能需要添加一些平滑的步骤,例如: https ://www.shadertoy.com/view/4ssSRl