Остановить размытие пиксельного шрифта при рендеринге - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь создать маленькую игру в пиксельном ретро-стиле и использую пиксельный шрифт. К сожалению, я не могу отобразить шрифт с такими же резкими краями, как в исходном шрифте.

О моем mcve:

Я использую этот шрифт для fonts/pokemon_classic.ttf (я не нашел способа разместить этот шрифт в Интернете, поэтому не используйте jsfiddle), но вы можете использовать любой пиксельный шрифт, который вам нравится. Пример ниже отображает шрифт следующим образом:

screenshot of blurry text

Как я могу сделать этот текст таким же четким, как и в исходном шрифте? Это должно выглядеть так (отредактированное изображение):

edited blurry image which shows the text sharp

масштаб root может измениться во время выполнения, чтобы соответствовать экрану

Менее элегантное решение, которое, вероятно, сработало бы, состоит в том, чтобы зафиксировать альфа каждого пикселя равным 0 или 1 в зависимости от некоторого порога, но я не знаю, как это сделать.

JS:

PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST;
let scale = 30;
let app = new PIXI.Application();
document.body.appendChild(app.view);

app.renderer.view.style.position = "absolute";
app.renderer.view.style.display = "block";
app.renderer.autoResize = true;
app.renderer.resize(window.innerWidth, window.innerHeight);

let root = new PIXI.Container();
app.stage.addChild(root);
root.scale.set(scale);

document.fonts.load('8pt "pokemon"').then(() => {
    let text = new PIXI.Text("Test", {fontFamily: 'pokemon', fontSize: 8, fill: 0xff1010});
    root.addChild(text);
});

CSS:

@font-face {
    font-family: 'pokemon';
    src: url("fonts/pokemon_classic.ttf");
}

* {
    padding: 0;
    margin: 0;
}

1 Ответ

1 голос
/ 19 апреля 2019

Вещи, которые могут сделать текст размытым ....

  1. SCALE_MODE
  2. Субпиксельное позиционирование. Включите roundPixels при создании нового PIXI.Application для v4, v5, который вы можете установить глобально через PIXI.settings.ROUND_PIXELS = true; или индивидуально, displayObject.roundPixels = true;
  3. Пересчет

Так что вы хороши на # 1, но # 2 и # 3 могут быть проблемы.

...