【发布时间】:2016-03-22 06:55:01
【问题描述】:
我正在使用单个 Quad 和片段着色器在 WebGL 中绘制圆/椭圆,以便以独立于分辨率的方式绘制它们(边缘距离抗锯齿)
这是我目前的片段着色器:
'#extension GL_OES_standard_derivatives : enable',
'precision mediump float;',
'varying vec2 coord;',
'vec4 circleColor = vec4(1.0, 0.5, 0.0, 1.0);',
'vec4 outlineColor = vec4(0.0, 0.0, 0.0, 1.0);',
'uniform float strokeWidth;',
'float outerEdgeCenter = 0.5 - strokeWidth;',
'void main(void){',
'float dx = 0.5 - coord.x;',
'float dy = 0.5 - coord.y;',
'float distance = sqrt(dx*dx + dy*dy);',
'float delta = fwidth(distance);',
'float alpha = 1.0 - smoothstep(0.45 - delta, 0.45, distance);',
'float stroke = 1.0 - smoothstep(outerEdgeCenter - delta, outerEdgeCenter + delta, distance);',
'gl_FragColor = vec4( mix(outlineColor.rgb, circleColor.rgb, stroke), alpha );',
'}'
这会创建一个带有黑色轮廓的橙色圆圈,无论大小如何,该圆圈都具有完美的抗锯齿效果。
但是,一旦我变换四边形(缩放它)以将圆变成椭圆,distance 计算就会随之变换,从而导致轮廓也缩放。我的理解是,我需要以某种方式通过反转它来解释四边形的变换。
我希望 distance 即使在变换四边形时也能保持一致,实际上会在整个圆/椭圆周围产生恒定宽度的轮廓。
任何帮助将不胜感激。
【问题讨论】:
标签: javascript webgl shader fragment-shader