我正在使用 WebGL 创建游戏。我目前正在从事菜单设计,我发现使用 Web 技术的一大优势是我可以使用 HTML 作为 GUI。
游戏使用像素艺术,因此为了与这种艺术风格保持一致,我希望菜单也有像素化的按钮和文本。我想知道是否使用 CSS 过滤器或类似的东西我能够像素化 DOM 元素的渲染,或者我是否需要事先创建完整的按钮图像(更不吸引人)。
谢谢!
您可以使用 SVG 滤镜来实现此目的。
<svg>
<filter id="pixelateStr4" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="16" height="16"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="8" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="8" height="16"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="8" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="16" height="8"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="8" result="dilatedFallbackY"></femorphology>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
</svg>
并使用 CSS 将其应用到叠加层
.overlay{
backdrop-filter: url(#pixelateStr3);
}
波纹管是完整的片段
.imgAni {
-webkit-animation: pixelAni 5s;
animation: pixelAni 5s;
}
.img1 {
-webkit-backdrop-filter: url("#pixelateStr1");
backdrop-filter: url("#pixelateStr1");
}
.img2 {
-webkit-backdrop-filter: url("#pixelateStr2");
backdrop-filter: url("#pixelateStr2");
}
.img3 {
-webkit-backdrop-filter: url("#pixelateStr3");
backdrop-filter: url("#pixelateStr3");
}
.img4 {
-webkit-backdrop-filter: url("#pixelateStr4");
backdrop-filter: url("#pixelateStr4");
}
.img5 {
-webkit-backdrop-filter: url("#pixelateStr5");
backdrop-filter: url("#pixelateStr5");
}
.img6 {
-webkit-backdrop-filter: url("#pixelateStr6");
backdrop-filter: url("#pixelateStr6");
}
.img7 {
-webkit-backdrop-filter: url("#pixelateStr7");
backdrop-filter: url("#pixelateStr7");
}
.filter {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 3;
pointer-events: none;
}
.content {
position: relative;
width: 25vw;
height: 50vh;
float: left;
background: #ff0;
}
.content h1 {
font-size: 4.5vw;
padding: 2vw;
z-index: 2;
position: relative;
color: #00f;
font-family: monospace;
margin: 0;
}
.content span {
background: #f00;
border-radius: 50%;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 50%;
height: 50%;
z-index: 1;
}
@-webkit-keyframes pixelAni {
99.9% {
-webkit-backdrop-filter: url("#pixelateAni");
backdrop-filter: url("#pixelateAni");
}
}
@keyframes pixelAni {
99.9% {
-webkit-backdrop-filter: url("#pixelateAni");
backdrop-filter: url("#pixelateAni");
}
}
html,body{padding:0;margin:0;}
<div class="content">
<div class="filter imgAni"></div>
<h1 contenteditable="true">HOW Pixel ATED?</h1><span></span>
</div>
<div class="content">
<div class="filter img1"></div>
<h1 contenteditable="true">HOW Pixel ATED?</h1><span></span>
</div>
<div class="content">
<div class="filter img2"></div>
<h1 contenteditable="true">HOW Pixel ATED?</h1><span></span>
</div>
<div class="content">
<div class="filter img3"></div>
<h1 contenteditable="true">HOW Pixel ATED?</h1><span></span>
</div>
<div class="content">
<div class="filter img4"></div>
<h1 contenteditable="true">HOW Pixel ATED?</h1><span></span>
</div>
<div class="content">
<div class="filter img5"></div>
<h1 contenteditable="true">HOW Pixel ATED?</h1><span></span>
</div>
<div class="content">
<div class="filter img6"></div>
<h1 contenteditable="true">HOW Pixel ATED?</h1><span></span>
</div>
<div class="content">
<div class="filter img7"></div>
<h1 contenteditable="true">HOW Pixel ATED?</h1><span></span>
</div>
<svg>
<filter id="pixelateAni" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="2" height="2"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="1" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="1" height="2"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="1" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="2" height="1"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="1" result="dilatedFallbackY"></femorphology>
<animate calcmode="discrete" xlink:href="#composite" attributename="width" values="128; 64; 32; 16; 8; 4; 2" dur="5s" fill="freeze" repeatcount="once"></animate>
<animate calcmode="discrete" xlink:href="#composite" attributename="height" values="128; 64; 32; 16; 8; 4; 2" dur="5s" fill="freeze" repeatcount="once"></animate>
<animate calcmode="discrete" xlink:href="#morphology" attributename="radius" values="64; 32; 16; 8; 4; 2; 1" dur="5s" fill="freeze" repeatcount="once"></animate>
<animate calcmode="discrete" xlink:href="#compositeX" attributename="width" values="64; 32; 16; 8; 4; 2; 1" dur="5s" fill="freeze" repeatcount="once"></animate>
<animate calcmode="discrete" xlink:href="#compositeX" attributename="height" values="128; 64; 32; 16; 8; 4; 2" dur="5s" fill="freeze" repeatcount="once"></animate>
<animate calcmode="discrete" xlink:href="#morphologyX" attributename="radius" values="64; 32; 16; 8; 4; 2; 1" dur="5s" fill="freeze" repeatcount="once"></animate>
<animate calcmode="discrete" xlink:href="#compositeY" attributename="width" values="128; 64; 32; 16; 8; 4; 2" dur="5s" fill="freeze" repeatcount="once"></animate>
<animate calcmode="discrete" xlink:href="#compositeY" attributename="height" values="64; 32; 16; 8; 4; 2; 1" dur="5s" fill="freeze" repeatcount="once"></animate>
<animate calcmode="discrete" xlink:href="#morphologyY" attributename="radius" values="64; 32; 16; 8; 4; 2; 1" dur="5s" fill="freeze" repeatcount="once"></animate>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
<filter id="pixelateStr7" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="128" height="128"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="64" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="64" height="128"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="64" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="128" height="64"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="64" result="dilatedFallbackY"></femorphology>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
<filter id="pixelateStr6" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="64" height="64"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="32" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="32" height="64"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="32" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="64" height="32"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="32" result="dilatedFallbackY"></femorphology>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
<filter id="pixelateStr5" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="32" height="32"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="16" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="16" height="32"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="16" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="32" height="16"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="16" result="dilatedFallbackY"></femorphology>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
<filter id="pixelateStr4" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="16" height="16"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="8" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="8" height="16"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="8" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="16" height="8"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="8" result="dilatedFallbackY"></femorphology>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
<filter id="pixelateStr3" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="8" height="8"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="4" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="4" height="8"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="4" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="8" height="4"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="4" result="dilatedFallbackY"></femorphology>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
<filter id="pixelateStr2" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="4" height="4"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="2" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="2" height="4"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="2" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="4" height="2"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="2" result="dilatedFallbackY"></femorphology>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
<filter id="pixelateStr1" x="0" y="0" width="100%" height="100%">
<!-- First layer: Normal pixelation effect-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="composite" in2="SourceGraphic" operator="in" width="2" height="2"></fecomposite>
<fetile result="tiled"></fetile>
<fecomposite in="SourceGraphic" in2="tiled" operator="in"></fecomposite>
<femorphology id="morphology" operator="dilate" radius="1" result="dilatedPixelation"></femorphology>
<!-- Second layer: Fallback with full-width tiling-->
<feflood x="1" y="1" height="1" width="1" result="floodFallbackX"></feflood>
<fecomposite id="compositeX" in2="SourceGraphic" operator="in" width="1" height="2"></fecomposite>
<fetile result="fullTileX"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileX" operator="in"></fecomposite>
<femorphology id="morphologyX" operator="dilate" radius="1" result="dilatedFallbackX"></femorphology>
<!-- Third layer: Fallback with full-height tiling-->
<feflood x="1" y="1" height="1" width="1"></feflood>
<fecomposite id="compositeY" in2="SourceGraphic" operator="in" width="2" height="1"></fecomposite>
<fetile result="fullTileY"></fetile>
<fecomposite in="SourceGraphic" in2="fullTileY" operator="in"></fecomposite>
<femorphology id="morphologyY" operator="dilate" radius="1" result="dilatedFallbackY"></femorphology>
<!-- Combine all three layers-->
<femerge>
<femergenode in="dilatedFallbackX"></femergenode>
<femergenode in="dilatedFallbackY"></femergenode>
<femergenode in="dilatedPixelation"></femergenode>
</femerge>
</filter>
</svg>
这是一个代码笔,在实践中展示了这一点(https://codepen.io/QuiteQuinn/pen/KKOVvrN)