はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

Windows Terminalの見た目をブラウン管風にできるOSSを作りました

はじめに

先日Windows Terminalをブラウン管風の見た目にできるOSSを公開しました。

今回はその紹介と、技術的にどう実現したかについて書きたいと思います。

概要

冒頭でも紹介した通り、今回作成したwt-crt-effectを利用することで簡単にWindows Terminalの見た目をブラウン管風にできます。

github.com

実際の見た目

一応公式でRetro terminal effectsというのはすでにありまして、見た目をレトロにすることは可能です。

learn.microsoft.com

ただ魚眼レンズだったり、もうちょっとやり過ぎなくらいの見た目にしたいなと思い自作してみました。ただ文字が見やすいかというとなんともなので、もし使われる方はある程度覚悟した方がよいと思います。

インストール方法

まずはレポジトリをcloneしてください。

# ghコマンドを用いた例
# お好きな手法でcloneしてください
$ gh repo clone hanachiru/wt-crt-effect

続いてcloneしてきたレポジトリにカレントディレクトリを移動して、以下のコマンドを実行すれば完了です。

# 権限を付与する
$ chmod +x ./install.ps1

# シェーダーを適用
$ ./install.ps1

# 元に戻す
$ ./install.ps1 -Uninstall

技術的なこと

Windows Terminal 1.6以降はHLSLを用いてピクセルシェーダーを記述することが可能です。

Windows ターミナルを使用すると、ユーザーは、settings.json ファイル内のプロファイルに experimental.pixelShaderPath プロパティを追加することによって、ターミナルに適用されるピクセル シェーダーを提供できます。 ピクセル シェーダーは HLSL と呼ばれる言語で記述されます。

learn.microsoft.com

今回の例で言うとsettings.jsonに以下のようにプロパティが設定することで、指定した.hlslが読み込まれます。

{
    "profiles": {
        "defaults": {
            "experimental.pixelShaderPath": "C:\\path\\to\\wt-crt-effect\\shaders\\crt.hlsl"
        }
    }
}

crt.hlslの中身は以下のとおりです。

github.com

実装するにあたって、以下は抑えておくと良いと思います。

// Windows Terminalが自動的に提供する情報
cbuffer PixelShaderSettings : register(b0) {
    float Time;        // シェーダーが読み込まれてからの経過時間(秒)
    float Scale;       // ディスプレイの拡大率
    float2 Resolution; // ターミナルの画面解像度(幅、高さのピクセル数)
    float4 Background; // 背景色 (RGBA)
}

// テクスチャとサンプラー
// uv(0.0〜1.0の座標)を指定して shaderTexture.Sample(samplerState, uv) と呼び出すことで、画面の特定の位置のRGBを取り出せる
Texture2D shaderTexture : register(t0);
SamplerState samplerState : register(s0);