Мне нужно скопировать свойство 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;
}
}