在OpenGL / GLSL中为Bezier曲线绘制内部阴影

时间:2016-01-23 21:28:53

标签: opengl opengl-es glsl glsles

我试图为由四条三次贝塞尔曲线组成的物体绘制内部发光/阴影。要绘制单个贝塞尔曲线,我将其分割成段,然后计算从当前像素到每个线段的距离,最后我将其与ContentBinary混合:

min

其中// No GL_MAX blending mode in OpenGL ES 2.0 d_min = min(d_min, d) 是每个细分的距离。放大两个线段的混合示例:

enter image description here

当你有~25个代表短贝塞尔曲线的段

时,它的效果相当不错

enter image description here

除了"排水沟"在Bezier曲线和它们各自的渐变相结合的地方。

问:如何避免这些瑕疵?是否有更好的方法来绘制内部发光/阴影?

enter image description here

2 个答案:

答案 0 :(得分:1)

如何对曲线进行模糊处理,然后将结果隐藏到内部区域?

答案 1 :(得分:0)

请参阅:

它基本上将输入的4顶点几何块转换为具有定义的曲线宽度d的BEZIER立方。

在一个片段中,您可以获得到曲线ll的距离的信息,因此您可以直接使用它来阴影您的东西。对于使用白色背景和黑色以及以下几点的情况:

double pnt[]=                   // cubic curve control points
    {
    +0.9,-0.8,0.0,
    +0.5,+0.8,0.0,
    -0.5,+0.8,0.0,
    -0.9,-0.8,0.0,
    };

我得到了以下输出(d=0.05):

output

我只是将顶点着色器中的最终着色线更改为:

l=ll/d; // distance from center of curve 0..1
col=vec4(l,l,l,1.0);

您可以通过lsqrt使pow线性化,以增强阴影效果...