renderoptions の設定のしかた

Vim は 8.0 で DirectX に対応しました。 しかし誰もそれの良い設定のしかたを知らないはずなので解説します。

本記事は Vim Advent Calendar 2016 の 25日目(最終日)の記事です。

TL;DR

Vim で DirectX を使うには以下のようにしてください。

  1. OS の ClearType テキストの調整 を実施する
  2. Vim を UTF-8 モードで起動し、好きなフォントを設定する
  3. set rop=type:directx,renmode:5 で DirectX を有効化する

Vim の DirectX サポート

御存知の通り2016年の9月に Vim 8.0 がリリースされました。 10年ぶりのメジャーアップデートということで たいそう話題 になりました。 特に Windows 界隈のユーザーにとっては、 テキストエディタが DirectX に対応したということで 「なんでやねん!」 と話題になったかと記憶しています。

知らない人に Vim がどのように DirectX を利用しているか超絶手短に解説しますと、 フォントを綺麗にレンダリングするため、ということに尽きます。 DirectX のうち Direct Write という機能を、 互換性のためにハードウェアアクセラレーションの恩恵を期待できない方法で利用しているので、 DirectX という言葉から連想される「速くなる」とかそういうことは一切ありません。 残念ながら、逆に遅くなります。

Windows においてフォントを綺麗にレンダリングするというのは、 言葉ほど簡単ではありません。 といいますのも、Windowsが実行されるハードウェアは千差万別です。 某リンゴマークや某ロボットアイコンのOSとはそこが違うのです。 たくさんのユーザーのハードウェアに合わせて綺麗にレンダリングできるように、 ちょっとした数のパラメータが存在します。 Vim の DirectX 対応においてもそれは同様で、パラメーターのうち以下の6個を 'renderoptions' オプション (以下 rop) によって指定できるようになっています。

  • gamma
  • contrast
  • level
  • geom
  • renmode
  • taamode

しかしこの rop で指定できる6個パラメータ、 その効果ひいては定番の設定方法についてはほとんど知られていません。 だってこの機能のパッチの作者である私ですら つい先日まで正しいことを全く知らなかったのです。 他人が知りようはないってものです。 さぁ、またしても前置きが長くなってしまいましたが、 この記事では rop の各パラメーターの効果と、 実際の良い設定方法を解説します。

パラメーターの意味

パラメーターの意味の解説を始める前に、 以下の解説は特に断りが無い限り、 白系の地に黒系の文字のハッキリとしたコントラストの配色を利用した場合のものとします。 逆の配色やコントラストの弱い配色を利用している場合には、 実際の効果が解説とは異なることがあるでしょう。

gamma

gammaガンマレベル であり、 ピクセルの値と実際に表示される明るさの(非線形な)関係を指定します。 有効な値は 1.0 から 2.2 で、デフォルト値は 1.9 です。

小さな値ほど線が太くかつ濃く描画され、 大きな値になるについて細く薄く描画されるようになります。 なお黒系の地に白系の文字を利用している場合は、この関係が逆になります。

また最大値は 2.2 としましたが、それよりも大きな値も設定できます。 しかし 10.0 などとすると文字が白飛びしてしまい、判読できず実用的ではありません。

設定自体は 0.001 の単位で論理上の効果を持ちますが、 ディスプレイに反映され人間の目で知覚できるという意味では 0.3 の単位で調整するのが良いでしょう。

contrast

contrastコントラスト比 であり、 明るいところと暗いところの差を指定します。 有効な値は整数で 0 から 6 で、デフォルト値は 1 です。

数値が大きいほどコントラスト比が大きくなり、 明暗の差が強調され鮮やかになります…が、 フォント描画においては太くなったような印象を与えます。

level

level は ClearType レベルであり、 フォント描画における中間色の利用度合いを指定します。 有効な値は 0.0 から 1.0 で、デフォルト値は 1.0 です。

値が大きいほどエッジなどに中間色を積極的に利用します。 中間色が多く利用されている場合、 人によってはギラギラした印象を受けるかもしれません。 逆に値が小さいほど中間色の使用は抑えられ、 0 では完全にグレイスケールになります。

設定自体は 0.01 の単位で論理上の効果を持ちますが、 知覚できるレベルを考慮すると 0.25 ずつ調整するくらいで良いでしょう。

geom

geom はディスプレイのピクセルの構造を意味しており、 サブピクセルによる最適化 の際に用いられます。 有効な値は 0, 1 もしくは 2 です。

現在一般的な液晶モニタや有機ELモニタで利用する場合は、 まず 1 を選択してください。 非常に稀ではありますが、 この状態で水平方向のエッジが気持ちダブってみえた場合には 2 に変更してみてください。 それでもダメならば 0 を使用してください。

液晶以外の、プロジェクタやCRTモニタを利用している場合は 0 を使ってください。 それらのモニタでは、普通はサブピクセル最適化を利用できません。

renmode

renmode にはフォントのレンダリング方法を指定します。 有効な値は 0 から 6 の整数値で、デフォルトは 0 です。

設定の調整を開始する前に、必ず利用するフォントとサイズを設定してください。 最適なレンダリング方法はフォントとサイズによって異なります。 サイズは、通常の解像度においては 1.5 の倍数を避けるようにすることで、 設定効果の目視が容易となるでしょう。

私の手持ちのフォントでサイズ 14 くらいで試した限りでは、 大半のフォントに対して 5 が安定して綺麗だと感じました。 しかし 1 と 6 は逆の意味で安定して粗く、使い物にならないと感じました。

taamode

taamode にはアンチエイリアスのモードを指定します。 有効な値は 0 から 3 で、デフォルト値は 0 です。

ですが残念ながら、現在の実装では正常に機能していないようです。 設定を変えながらスクリーンショットを採取しドット単位で比較した結果、 設定による差異が一切観測できませんでした。 この原因が観測ミスによるものなのか、バグによるものかは現在のところ不明です。

これには作者である私もビックリ。 この記事の方針の大幅変更の要因となりました。

参考文献

設定・調整方法

さぁ、各パラメーターの意味がわかったところで実際の設定と調整を始めるわけですが、 その前に必ず :set enc=utf-8 で Vim の内部を UTF-8 モードにしてください。 DirectX 対応は UTF-8 モードでしか機能しないようになっています。 私は、その制限を導入した張本人であるにも関わらず、 そのことを忘れて1時間近くを無駄にしたことがあります。

それも考慮するとパラメーターの設定・調整手順の完全版は以下のようになります。

  1. UTF-8 モードにする - set enc=utf-8
  2. 利用したいフォントを設定する - 例: set gfn=Ricty_Diminished:h14:cSHIFTJIS
  3. DirectX を有効にする - set rop=type:directx
  4. geom を調整する - 例: set rop=type:directx,geom:1
    1. 液晶や有機ELならば 1 もしくは 2 を設定する
    2. それ以外ならば 0 を設定する
  5. renmode を調整する - 例: set rop=type:directx,geom:1,renmode:5
    • 通常は 5 で良いはず
    • 満足できない場合は 2, 3, 4 を順番に試す
    • それでもダメなら 16 が利用できるが、望みは薄い
    • 最後は諦めて 0 とする
  6. (オプション) エッジからギラギラする印象を受けるようであれば、 level を調整する - 例:

    set rop=type:directx,geom:1,renmode:5,level:0.75
    

    これでもギラギラを感じるようであれば 0.5, 0.25, 0 と徐々にレベルを落としていく

  7. (オプション) gammacontrast で、線の太さと濃さを調整する

    gamma の値は 2.2 から始め 0.3 刻みで 1.0 まで減らしながら調整する。 決めきれない場合はデフォルトの 1.9 で溜飲を下げる。

    contrast0 から始め 6 まで試してみる。 決めきれない場合はデフォルトの 1 で溜飲を下げる。

ただしこの手順 6 と 7 の level, gamma 及び contrast は相互に関係し、 主観に働きかけるものであるため、Vim上での調整作業は容易ではありません。 そこで Windows 自身の設定とその方法 (ClearType テキストの調整) を流用してしまいます。 Vim の DirectX 対応では、前述のパラメーターを指定しなかった場合には、 Windows 自身の設定を流用するようになっています。 そこでフォントに依存する renmode 以外のパラメーターの設定は、 それを使って省略することができるのです。

すると設定手順は以下のように簡略化されます。

  1. ClearType テキストの調整 を使って好みの設定をする

    Cortana さんに ClearType と聞くか、 コントロールパネル → ディスプレイ → ClearType テキストの調整 とたどる。

  2. Vim を UTF-8 モードで好みのフォントとサイズで起動する
  3. DirectX をとりあえず renmode:5 を指定して有効化する - 例:

    set rop=type:directx,renmode:5
    
  4. (オプション) renmode を調整する
    • 2, 3, 4 を順番に試す
    • それでもダメなら 16 が利用できるが、望みは薄い
    • 最後は諦めて 0 とする

どうです? 簡単そうでしょう?

まとめ

Vim の DirextX 対応設定である、 renderoptions の設定・調整方法を詳しく解説しました。 また簡単な方法も紹介しました。 是非 Vim の DirectX による描画を試してみてください。

最後の最後に、残念なお知らせがあります。 DirectX を利用している場合に画面描画がとんでもなく遅くなる 現象が確認されています。 詳細な発生条件は、上記のリンクを参照してください。

(´・ω・`)