ブラウン管・グリッチ(CRT / Glitch)

本体が描き終えた色に、走査線・シャドウマスク・ロールバー・ざらつき・砂嵐・ 周辺の落ち込みと、映像が乱れたときの帯のずれ・升の破綻・色ずれを重ねます。 頂点を動かす「裂け」も持っています。

走査線とシャドウマスクだけをかけた状態
走査線とシャドウマスクだけをかけた状態
立体に一式かけた状態。シルエットの上に走査線と縞が乗る
立体に一式かけた状態。シルエットの上に走査線と縞が乗る

このモジュールはドット絵風の後にかかります(crt-glitch.scmodule の afters)。升目に落としてからブラウン管をかける順で、逆にすると走査線と縞が 升目に飲まれます。

画面を撮り直さずに何をしているか

画面を歪める・ぼかす・実際にずらすことはできません。 モジュールは 隣接ピクセルを読めないためです。ずらしが要るところ(帯のずれ・升の破綻・ 色ずれ・砂嵐の引き裂き)は、勾配 (ddx/ddy) からの 1 次近似で 「ずらした先の色」を推定しています。

この近似には次の性質があります。

  • 面の上で色が滑らかに変わるところではよく合う
  • シルエットや模様の境目では大きく外れる。色ずれはそこで消えるように 弱めてある(そうしないと縁に色の輪が残る)。乱れた帯と升の破綻は硬い破綻が 欲しい効果なので、上限で頭打ちにするだけで縁でも切らない
  • 勾配は 2x2 のピクセルごとに 1 つしか無いので、2 ピクセルより細かい ずらしは段が付く

したがって色ずれは、縁がくっきり分かれる絵ではほとんど見えません。 広くなだらかな階調がある絵でだけ効きます。ブラウン管らしさは走査線と シャドウマスクが担っていて、こちらはずらしを伴わないので制約を受けません。

入っていないもの

効果入れていない理由
りん光の残像前のフレームが要る
滲み・グロー隣接ピクセルの重み付き和が要る
ゴースト(ずらして重ねる)1 次近似では段を重ねても 1 回ずらすのと同じ式に潰れる
画面の丸み入力映像の再サンプリングが必要。モデル頂点による近似は頂点密度と画面内の位置に依存するため

ゴーストが潰れるのは次の理由です。i 段目の色は c + g・d・i になるので、 重み w_i で平均すると Σ w_i (c + g・d・i) / Σ w_i = c + g・d・(i の加重平均) となり、1 回ずらしたのと同じ形になります。段ごとに色を回せば潰れなくなりますが、 それは色が変わるだけで、像が「ずれて重なる」ようには見えません。 実測でも、色を回さずに 3 段重ねたときの差は平均 0.15 / 255 しか出ませんでした。

走査線とシャドウマスク

プロパティ説明
Amount全体の強さ。0 で無効
Scanlines / Scanline Pitch横方向の暗い線と、その間隔(画面ピクセル)
Shadow Mask / Mask PitchRGB の縦縞と、R・G・B 3 本 1 組の幅(画面ピクセル)
Vignette画面の外側ほど暗くする
Chromatic Aberration赤と青を逆向きに離す幅(画面ピクセル)

縞は 3 つに割り切ってあります。位相をずらした余弦を重ねると、山と山の 中間で 2 色が同時に持ち上がり、面全体が黄色や水色に寄って見えるためです。 該当する縞を 2.4、隣を 0.3 にしてあり、平均は 1 なので全体の明るさは 変わりません。

縞と線はどちらも画面ピクセル単位なので、遠くのアバターでは縞が細かく なりすぎて色が偏って見えます。遠景で使うなら間隔を広げてください。

ざらつきと砂嵐

中間調へ寄せた色付きのざらつき。明部と暗部では粒が消える
中間調へ寄せた色付きのざらつき。明部と暗部では粒が消える
砂嵐で半分ほど置き換えた状態
砂嵐で半分ほど置き換えた状態
ロールバーだけ。時間で上下に流れる
ロールバーだけ。時間で上下に流れる
プロパティ説明
Grain / Grain Size画面に散らす粒と、その大きさ(画面ピクセル)
Midtone Bias上げるほど中間調にだけ粒が乗り、明部と暗部で消える
Color Grain0 で明るさだけ、上げると RGB が別々に揺れて色の粒になる
Static像を無彩色のノイズへ置き換える割合
Static Tearing置き換える前に行ごとに横へずらす幅(画面ピクセル)
Roll Bar / Roll Speed垂直同期がずれた画面に出る、ゆっくり流れる明るい帯

砂嵐は走査線とシャドウマスクの前に置き換えます。ブラウン管が砂嵐を 映しているのと同じ順で、縞と線は砂嵐の上に乗ります。

ForwardAdd では、ライト数に応じて粒や砂嵐が増えないよう、それらの生成は ForwardBase だけで行います。砂嵐による元画像の減衰と横裂けは各パスへ適用します。

ざらつきの時間は 24 分の 1 秒、乱れの時間は 12 分の 1 秒に刻んであります。 滑らかに動かすと粒が流れて見えるので、コマで切り替わるようにしてあります。

乱れと裂け

横帯の乱れ。横にずれ、帯によっては色が入れ替わる
横帯の乱れ。横にずれ、帯によっては色が入れ替わる
升の破綻。四角く切って横へずらし、色を段に落とす
升の破綻。四角く切って横へずらし、色を段に落とす
プロパティ説明
Band Glitch横帯の出やすさ。0 で 1 本も出ず、1 ですべての帯が出る
Band Height / Band Shift帯の高さと横ずれの幅(どちらも画面ピクセル)
Band Channel Swap帯で RGB を入れ替える量
Block Glitch升の破綻の出やすさ
Block Size / Block Shift升の大きさと横ずれの幅(どちらも画面ピクセル)
Block Color Crush升ごとに色を段へ落とす量
Vertex Tearing / Tear Band Height頂点を帯ごとに横へずらす幅と、帯の高さ(どちらもメートル)

横帯は走査が横にずれた画に、升の破綻は圧縮が壊れた画に近い見た目です。 Block Color Crush は加算合成できない非線形処理なので ForwardBase だけに適用し、 ForwardAdd では升の横ずらしだけを適用します。これによりライトごとの量子化は避けますが、 追加ライトの寄与そのものは色の段へ落ちません。

Band Glitch はピクセル側の帯と頂点の裂けの両方を出します。 裂けはモデルの高さで帯を切り、視線と上方向から作った向きへずらすので、 画面に対して水平に裂けます。帯を頂点の粗さより細かくしても分かれません。

作例

表現効かせるもの
ブラウン管Scanlines + Shadow Mask + Vignette、Grain はごく弱く
フィルムGrain を上げ、Midtone Bias と Color Grain を上げる。Scanlines は 0
受信の途切れた放送Static + Static Tearing + Roll Bar
通信の乱れBand Glitch + Band Shift + Band Channel Swap
圧縮の破綻Block Glitch + Block Shift + Block Color Crush
実体が乱れる上に Vertex Tearing を足す
レトロゲーム機ドット絵風と重ね、Scanline Pitch を升目の大きさに合わせる