在OpenGL / GLSL中绘制贝塞尔曲线的内部阴影

问题描述 投票:0回答:2

我正在尝试为包含四个三次贝塞尔曲线的对象绘制内部辉光/阴影。要绘制一条贝塞尔曲线,我将其分成多个部分,然后计算从当前像素到每个线段的距离,最后将其与min混合:

// No GL_MAX blending mode in OpenGL ES 2.0 d_min = min(d_min, d)

其中d是每个线段的距离。放大了两个线段的混合示例:

enter image description here

[当您有〜25个代表较短贝塞尔曲线的线段时,效果很好

enter image description here

[贝塞尔曲线及其各自的渐变相结合的地方的“排水沟”除外。

Q:如何避免这些伪影?有没有更好的绘制内部辉光/阴影的方法?

enter image description here

opengl opengl-es glsl glsles
2个回答
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线性化以增强阴影效果...

© www.soinside.com 2019 - 2024. All rights reserved.