FILTROS SVG

Para ejemplificar el uso de los filtros SVG vamos a crear un objeto con efecto 3D solo con filtros. Primero veremos el efecto de cada filtro de forma individual sobre el texto, después iremos aplicandolos juntos al texto y por último veremos el resultado completo.

Con los filtros que vamos a ver tambiĆ©n crearemos un texto con apariencia de neón, estilo cartel luminoso.

Definición de la forma

Primero vamos a definir la forma a la que vamos a aplicarle los filtros.

<path id="flecha" d="M110, 30 L190, 10 170, 90 150, 70 30, 180 20, 170 130, 50 Z" style="fill: #66ff33; stroke: red;">

feColorMatrix

El primer filtro que le vamos a aplicar va a ser <feColorMatrix> Podemos elegir diferentes tipos, matrix | saturate | hueRotate | luminanceToAlpha y trambién podremos definir los valores, según el tipo.

En este caso hemos usado:

<filter id="hueRotate" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feColorMatrix type="hueRotate" in="SourceGraphic" values="90%"/>
</filter> <filter id="saturate" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feColorMatrix type="saturate" in="SourceGraphic" values="0.5"/>
</filter>

feGaussianBlur

Ahora vamos a aplicar un desenfoque gausiano, vamos a ver el resultado tanto si aplicamos al canal alfa como a los gráficos.

<filter id="gBlurA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feGaussianBlur in="SourceAlpha" stdDeviation="4"/>
</filter>
<filter id="gBlurG" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feGaussianBlur in="SourceGraphics" stdDeviation="4"/>
</filter>

feOffset

Con <feOffset> vamos a crear un marco desplazando la entrada original que le pasemos al filtro, esto generará un efecto de sombra. Vamos a ver el efecto del filtro tanto teniendo en la entrada los gráficos como el canal Alpha.

<filter id="offA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feOffset in="SourceAlpha" dx="7" dy="7"/>
</filter>
<filter id="offG" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feOffset in="SourceGraphics" dx="7" dy="7"/>
</filter>

De estas formas, lo único que vemos es la figura con la que estamos trabajando un poco desplazada. Vamos a usar <feMerge> y <feMergeNode> para juntar el filtro con la imagen original y ver el efecto.

<filter id="sumaFiltros1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feOffset in="SourceAlpha" dx="7" dy="7" result="off"/>
  <feMerge>
    <feMergeNode in="off"></feMergeNode>
    <feMergeNode in="SourceGraphics"></feMergeNode>
  </feMerge>
</filter>

Luces - feSpecularLighting y fePointLight

Vamos a crear un punto de luz, que juntaremos con el gráfico con el que estamos trabajando con <feComposite> para crear la iluminación

<filter id="luzA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feSpecularLighting surfaceScale="5" specularConstant=".75" specularExponent="20" lighting-color="#bbbbbb" result="luzOut"/>
    <fePointLight x="-5000" y="-10000" z="20000"/>
  <feSpecularLighting>
  <feComposite in="luzOut" in2="SourceAlpha" operator="in" result="luzOut"/>
  <feComposite in="SourceGraphic" in2="luzOut" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" result="litPaint"/>
</filter>
<filter id="luzG" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" heigth="100%">
  <feSpecularLighting surfaceScale="5" specularConstant=".75" specularExponent="20" lighting-color="#bbbbbb" result="luzOut"/>
    <fePointLight x="500" y="100" z="200"/>
  <feSpecularLighting>
  <feComposite in="luzOut" in2="SourceAlpha" operator="in" result="luzOut"/>
  <feComposite in="SourceGraphic" in2="luzOut" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" result="litPaint"/>
</filter>

Composición con los filtros vistos.

Con <feMerge> y <feMergeNode> como hemos visto antes vamos a fusionar todos los filtros vistos, para crear un efecto de 3D. Para ello, vamos a ir almacenando los resultados de aplicar los diferentes filtros con la propiedad result y será lo que usemos como entrada para aplicar los siguintes filtros.

<filter id="3D" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
  <feOffset in="SourceAlpha" stdDeviation="-3" result="blurIn"/>
  <feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blur"/>
  <feOffset in="blur" in2="blurIn" dx="5" dy="4" result="boff"/>
  <feSpecularLighting in="SourceGraphic" surfaceScale="4" specularConstant=".75" specularExponent="20" lighting-color="#bbbbbb" result="luzOut">
    <fePointLight x="500" y="100" z="200"/>
  </feSpecularLighting>
  <feComposite in="luzOut" in2="SourceGraphic" operator="in" result="luzOut"/>
  <feComposite in="SourceGraphic" in2="luzOut" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" result="litPaint"/>
  <feMerge>
    <feMergeNode in="boff"></feMergeNode>
    <feMergeNode in="litPaint"></feMergeNode>
  </feMerge>
</filter>

Combinación de filtros y formas SVG

<svg width="1000" height="200">   <filter id ="blur1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
    <feGaussianBlur in="SourceGraphic" stdDeviation="30"/>
  </filter>
  <filter id ="blur2" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
    <feGaussianBlur in="SourceGraphic" stdDeviation="50"/>
  </filter>
  <filter id ="off1" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%>
    <feOffset in="SourceAlpha" dx="1" dy="10" result="off"/>
    <feGaussianBlur in="off" stdDeviation="7"/>
  </filter>
  <rect x="50" y="60" width="250" height="80" fill="#a2a2a2" filter="url(#off1)"/>
  <rect x="50" y="50" width="250" height="80" fill="#a2a2a2"/>
  <rect x="300" y="45" width="600" height="100" fill="white" opacity="0.3"/>
  <rect x="300" y="45" width="600" height="100" fill="00ff00" opacity="0.7" filter="url(#blur2)"/>
  <rect x="300" y="45" width="600" height="100" fill="#4dff4d" filter="url(#blur1)"/>
</svg>