Репликация box-shadow от CSS в GLSL - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно скопировать свойство box-shadow из CSS в GLSL для использования в проекте QtQuick. В основном у меня возникают проблемы, связанные со смещением X и Y, так как я не могу правильно определить область, которую я не хочу, чтобы шейдер рисовал. Вот код, который я использую:

uniform highp float qt_Opacity;
uniform mediump float relativeSizeX;
uniform mediump float relativeSizeY;
uniform mediump float maskOffsetWidth;
uniform mediump float maskOffsetHeight;
uniform mediump vec2 maskPosition;
uniform mediump vec2 maskPositionLimit;
uniform mediump float widthToHeightRatio;
uniform mediump float spread;
uniform lowp vec4 color;
varying highp vec2 qt_TexCoord0;

highp float linearstep(highp float e0, highp float e1, highp float x) {
    return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
}

void main() {
    lowp float alpha =
        smoothstep(0.0, relativeSizeX, 0.5 - abs(0.5 - qt_TexCoord0.x)) *
        smoothstep(0.0, relativeSizeY, 0.5 - abs(0.5 - qt_TexCoord0.y));

    highp float spreadMultiplier = linearstep(spread, 1.0 - spread, alpha);

    lowp float maskLimitWidth = 1.0 - maskOffsetWidth;
    lowp float maskLimitHeight = 1.0 - maskOffsetHeight;

    if ((qt_TexCoord0.x >= maskOffsetWidth && qt_TexCoord0.x <= maskLimitWidth
        && qt_TexCoord0.y >= maskOffsetHeight && qt_TexCoord0.y <= maskLimitHeight)) {
        vec2 maskCoord = qt_TexCoord0;
        maskCoord.x -= maskOffsetWidth;
        maskCoord.y -= maskOffsetHeight;
        gl_FragColor = vec4(0);
    } else {
        gl_FragColor = color * qt_Opacity * spreadMultiplier * spreadMultiplier;
    }
}
...