2008/12/30
テレビと DeepColor
テレビ売り場に足を踏み入れて、いかに自分が取り残されているか実感。
何を今更という感じでしょうが、最近のテレビは進化してるなと。
全然知りませんでした。
・機能
何でもつながる?ありとあらゆるコネクタが付いてる。
豊富な映像入出力だけでなく、
LAN コネクタは当たり前、NAS 専用の LAN 端子とか USB やら iLINK の 1394 やら
電話線とか中には eSATA まで。
インターネットブラウザも入ってて、ダウンロードしたアプリが動いたりもするらしい。
テレビに USB キーボードもつながる。
HDD 内蔵とか SD カードとか、自分で再生したり録画したり。
どうやって作っているんだろうと思ったら、どのメーカーもマニュアルにも
GPL と使用した Linux kernel の記載があった。
携帯電話のように、今できる機能は何でも入ってるといった感じです。
・画像補整競争
解像度もフルHDで、技術革新によりパネルの性能も向上しています。
でも入力データはフォーマットが決まっており、モニタが対応したからといって急に
変えるわけにもいかず。
そんな中差別化を図る手段が、限られた入力リソースをいかにきれいに見せるか。
デジカメの現像のようにさまざまな画像処理を経て、それぞれメーカー毎の絵作りが行われています。
色の補正、解像度変換、残像を減らすため工夫。中間フレームを生成してフレーム
レートを数倍にして、フィルタで映像内のモーションブラーを除去したり。
それだけハードウエアの処理性能が向上しているということです。
業務用の高度なモニタだと、キャリブレーション調整後のガンマ補正や色域を
一定にするために演算精度を上げています。パネルの多階調化も正確さのため。
一方家庭用テレビの場合は、同様の演算能力をきれいに見せるために使います。
カタログによると内部演算は 10~18 ビットで行われているそうです。
DeepColor というのはこのように従来より多階調の色情報を扱うこと。
入力信号は HDMI v1.3 以降で対応しているので、DeepColor 対応はモニタ側が直接
多階調の情報を受け取れるかどうかを意味しているようです。
実際に使われている液晶パネルも 10bit のものが増えています。
従来フルカラーは 1pixel あたり 24bit (24bpp) で、1ch あたり 8bit = 256階調でした。
10bit の場合は 1024 階調。1pixel あたり 30bit (30bpp) となります。
同じようにカタログに出てくる xv.Color は、色の段階の細かさを表す DeepColor
と違って、色の広さ方向の拡張を表しているようです。
入力情報が最初から多階調に対応しているならともかく、現状ほとんど無いため
その差を埋める技術が画質の差につながるわけです。
昔 Xbox1 の時代でも、ビュアでテレビに出した絵の色がシーンによって違うと
デザイナーに呼び出されることがありました。
まだ CRT だったけど、入力の情報にあわせて動的にトーンコントロールが行われていたためです。
あらかじめテレビ側の設定を変えておかないと、明るいシーンと暗いシーンでトーンが
変わってしまいます。
今だとそれ以上に、テレビで絵が変わってしまう可能性がありそうです。
HDMI 1.3a や DisplayPort では、信号自体 DeepColor に対応しています。
・Wikipedia High-Definition Multimedia Interface
・Wikipedia DisplayPort
・24 bpp ( 8 bit x 3)
・30 bpp ( 10 bit x 3)
・26 bpp ( 12 bit x 3)
・48 bpp ( 16 bit x 3)
GPU の PixelShader も今では当たり前のように内部演算は 32bit 浮動小数で行われています。
1pixel あたり 3ch で数えると 96bit です。
フレームバッファもより深い深度を持つことが可能です。
HDR で 16fp (64bpp) も使われているし、同じ 10bit 階調なら 32bpp の
R10G10B10A2 もあります。
今更ながら、Direct3D 10.1 で 16bit (64bit) 整数バッファへのブレンディングが
サポートされたのはこのためだったのかと気がつきました。
今後 DisplayPort が普及したら、PC もフルカラー = 24bit ではなく
より色数が増えて 30bit 以上になりそうです。
例えば下記スライド。
・WinHEC 2008
・Display Technologies - pptx
何を今更という感じでしょうが、最近のテレビは進化してるなと。
全然知りませんでした。
・機能
何でもつながる?ありとあらゆるコネクタが付いてる。
豊富な映像入出力だけでなく、
LAN コネクタは当たり前、NAS 専用の LAN 端子とか USB やら iLINK の 1394 やら
電話線とか中には eSATA まで。
インターネットブラウザも入ってて、ダウンロードしたアプリが動いたりもするらしい。
テレビに USB キーボードもつながる。
HDD 内蔵とか SD カードとか、自分で再生したり録画したり。
どうやって作っているんだろうと思ったら、どのメーカーもマニュアルにも
GPL と使用した Linux kernel の記載があった。
携帯電話のように、今できる機能は何でも入ってるといった感じです。
・画像補整競争
解像度もフルHDで、技術革新によりパネルの性能も向上しています。
でも入力データはフォーマットが決まっており、モニタが対応したからといって急に
変えるわけにもいかず。
そんな中差別化を図る手段が、限られた入力リソースをいかにきれいに見せるか。
デジカメの現像のようにさまざまな画像処理を経て、それぞれメーカー毎の絵作りが行われています。
色の補正、解像度変換、残像を減らすため工夫。中間フレームを生成してフレーム
レートを数倍にして、フィルタで映像内のモーションブラーを除去したり。
それだけハードウエアの処理性能が向上しているということです。
業務用の高度なモニタだと、キャリブレーション調整後のガンマ補正や色域を
一定にするために演算精度を上げています。パネルの多階調化も正確さのため。
一方家庭用テレビの場合は、同様の演算能力をきれいに見せるために使います。
カタログによると内部演算は 10~18 ビットで行われているそうです。
DeepColor というのはこのように従来より多階調の色情報を扱うこと。
入力信号は HDMI v1.3 以降で対応しているので、DeepColor 対応はモニタ側が直接
多階調の情報を受け取れるかどうかを意味しているようです。
実際に使われている液晶パネルも 10bit のものが増えています。
従来フルカラーは 1pixel あたり 24bit (24bpp) で、1ch あたり 8bit = 256階調でした。
10bit の場合は 1024 階調。1pixel あたり 30bit (30bpp) となります。
同じようにカタログに出てくる xv.Color は、色の段階の細かさを表す DeepColor
と違って、色の広さ方向の拡張を表しているようです。
入力情報が最初から多階調に対応しているならともかく、現状ほとんど無いため
その差を埋める技術が画質の差につながるわけです。
昔 Xbox1 の時代でも、ビュアでテレビに出した絵の色がシーンによって違うと
デザイナーに呼び出されることがありました。
まだ CRT だったけど、入力の情報にあわせて動的にトーンコントロールが行われていたためです。
あらかじめテレビ側の設定を変えておかないと、明るいシーンと暗いシーンでトーンが
変わってしまいます。
今だとそれ以上に、テレビで絵が変わってしまう可能性がありそうです。
HDMI 1.3a や DisplayPort では、信号自体 DeepColor に対応しています。
・Wikipedia High-Definition Multimedia Interface
・Wikipedia DisplayPort
・24 bpp ( 8 bit x 3)
・30 bpp ( 10 bit x 3)
・26 bpp ( 12 bit x 3)
・48 bpp ( 16 bit x 3)
GPU の PixelShader も今では当たり前のように内部演算は 32bit 浮動小数で行われています。
1pixel あたり 3ch で数えると 96bit です。
フレームバッファもより深い深度を持つことが可能です。
HDR で 16fp (64bpp) も使われているし、同じ 10bit 階調なら 32bpp の
R10G10B10A2 もあります。
今更ながら、Direct3D 10.1 で 16bit (64bit) 整数バッファへのブレンディングが
サポートされたのはこのためだったのかと気がつきました。
今後 DisplayPort が普及したら、PC もフルカラー = 24bit ではなく
より色数が増えて 30bit 以上になりそうです。
例えば下記スライド。
・WinHEC 2008
・Display Technologies - pptx
投影されるスクリーンのピクセル長から TessFactor を求めるように変更。
これを曲率で補正します。
前回の頂点形式の tscale はそのまま曲率を意味するようになりました。
この値を無視すれば直線部分も分割可能。

拡大してもフォントが荒れず、同一フォント内でもエッジの長さや奥行きに応じて変わります。
ただし分割数は GS だと限界があります。
GeometryShader の出力は最大 1024 float なので、仮に出力が最小の float4
SV_Position のみとしても 1エッジあたり 21 分割まで。
21 * 3 vertex * 4 edge = 252
252* 4 float = 1008
↑負荷は軽くなったけど TessFactor の求め方はまだまだ改良の余地あり。

↑直線部も均等に割ってランダムな振動を加えたもの。(WARP)
2D のディスプレースメントマップのような感じ。
エッジをじりじり動かせます。手書きアニメーション風の表現とかできるかも。
コンバータにはかなり苦労したけど、実際に画面が出て動くようになるとさまざまな
応用ができて楽しい。
描画が軽いうちは WARP デバイス (D3D_DRIVER_TYPE_WARP) はかなり使えます。
ステートの組み合わせを間違えても GPU がハングアップすることがないので、
いろいろ実験したりテストするとき 精神的 に楽です。
GPU がハングアップすると画面が停止して何もできない状態に陥ります。
たいていはドライバがタイムアウトすると GPU をリセットするので
しばらく待っていれば復活します。
でもうっかりミスだったりするとこの待ち時間が後悔の時間。万が一復活しない場合は
たとえ内部で正常に動いていてもリセットが必要というプレッシャーも。
短時間でも画面のフリーズは無い方がよいです。
関連エントリ
・Direct3D11/DirectX11 (17) GPU を使ったアウトラインフォントの描画の(5)
・Direct3D11/DirectX11 (16) GPU を使ったアウトラインフォントの描画の(4)
・Direct3D11/DirectX11 (15) GPU を使ったアウトラインフォントの描画の(3)
・Direct3D11/DirectX11 (14) GPU を使ったアウトラインフォントの描画の(2)
・Direct3D11/DirectX11 (10) テセレータの補間
・Direct3D11/DirectX11 (9) テセレータによるアウトラインフォントの描画など
これを曲率で補正します。
前回の頂点形式の tscale はそのまま曲率を意味するようになりました。
この値を無視すれば直線部分も分割可能。

拡大してもフォントが荒れず、同一フォント内でもエッジの長さや奥行きに応じて変わります。
ただし分割数は GS だと限界があります。
GeometryShader の出力は最大 1024 float なので、仮に出力が最小の float4
SV_Position のみとしても 1エッジあたり 21 分割まで。
21 * 3 vertex * 4 edge = 252
252* 4 float = 1008
↑負荷は軽くなったけど TessFactor の求め方はまだまだ改良の余地あり。

↑直線部も均等に割ってランダムな振動を加えたもの。(WARP)
2D のディスプレースメントマップのような感じ。
エッジをじりじり動かせます。手書きアニメーション風の表現とかできるかも。
コンバータにはかなり苦労したけど、実際に画面が出て動くようになるとさまざまな
応用ができて楽しい。
描画が軽いうちは WARP デバイス (D3D_DRIVER_TYPE_WARP) はかなり使えます。
ステートの組み合わせを間違えても GPU がハングアップすることがないので、
いろいろ実験したりテストするとき 精神的 に楽です。
GPU がハングアップすると画面が停止して何もできない状態に陥ります。
たいていはドライバがタイムアウトすると GPU をリセットするので
しばらく待っていれば復活します。
でもうっかりミスだったりするとこの待ち時間が後悔の時間。万が一復活しない場合は
たとえ内部で正常に動いていてもリセットが必要というプレッシャーも。
短時間でも画面のフリーズは無い方がよいです。
関連エントリ
・Direct3D11/DirectX11 (17) GPU を使ったアウトラインフォントの描画の(5)
・Direct3D11/DirectX11 (16) GPU を使ったアウトラインフォントの描画の(4)
・Direct3D11/DirectX11 (15) GPU を使ったアウトラインフォントの描画の(3)
・Direct3D11/DirectX11 (14) GPU を使ったアウトラインフォントの描画の(2)
・Direct3D11/DirectX11 (10) テセレータの補間
・Direct3D11/DirectX11 (9) テセレータによるアウトラインフォントの描画など
やっとフォントデータ丸ごとコンバータを通るようになりました。


表示は Direct3D11 beta + RADEON HD4850
ハードウエアで動かすために GeometryShader 4.0 を使っています。
Reference Driver なら GeometryShader ではなくテセレータを使用可能。
fps 表示もアウトラインフォント

プロポーショナルフォントの処理が無いので字間が少々おかしい。
CPU Rendering の WARP Driver でも 30fps くらいは出ます。
Reference Driver だと 2.4fps 程度。
(WindowsVista x64 Core2 Duo)
頂点形式は float2 x4、これを 4頂点で 1パッチとして描画しています。
4頂点なら LINELIST_ADJ で GeometryShader に渡せます。
1頂点が 1エッジに相当します。tscale はテセレータに対する係数。
係数が 0 だと分割しないので直線部分に使用します。
カーブが急な部分、エッジが長い部分は係数を大きくするなどの調整も可能です。
cx cy はパッチの中心座標を埋め込んだもの。
フォントデータは SVG か FXG を使用しています。glyph や path 等。
パス情報自体はほぼ同じ形式なのでデコード処理は共通化できます。
使用していませんが XAML も attribute に埋め込まれたパスの書式は同一でした。
内外判定は NonZero 相当。自己交差したパスは未対応。
・Paths SVG 1.1
・FXG 1.0 Public Specification
・パス マークアップ構文
関連エントリ
・Direct3D11/DirectX11 (16) GPU を使ったアウトラインフォントの描画の(4)
・Direct3D11/DirectX11 (15) GPU を使ったアウトラインフォントの描画の(3)
・Direct3D11/DirectX11 (14) GPU を使ったアウトラインフォントの描画の(2)
・Direct3D11/DirectX11 (10) テセレータの補間
・Direct3D11/DirectX11 (9) テセレータによるアウトラインフォントの描画など
・Direct3D11/DirectX11 (8) テセレータの動作


表示は Direct3D11 beta + RADEON HD4850
ハードウエアで動かすために GeometryShader 4.0 を使っています。
Reference Driver なら GeometryShader ではなくテセレータを使用可能。
fps 表示もアウトラインフォント

プロポーショナルフォントの処理が無いので字間が少々おかしい。
CPU Rendering の WARP Driver でも 30fps くらいは出ます。
Reference Driver だと 2.4fps 程度。
(WindowsVista x64 Core2 Duo)
頂点形式は float2 x4、これを 4頂点で 1パッチとして描画しています。
4頂点なら LINELIST_ADJ で GeometryShader に渡せます。
px py c0x c0y c1x c1y tscale cx px py c0x c0y c1x c1y tscale cy px py c0x c0y c1x c1y tscale 0 px py c0x c0y c1x c1y tscale 0
1頂点が 1エッジに相当します。tscale はテセレータに対する係数。
係数が 0 だと分割しないので直線部分に使用します。
カーブが急な部分、エッジが長い部分は係数を大きくするなどの調整も可能です。
cx cy はパッチの中心座標を埋め込んだもの。
フォントデータは SVG か FXG を使用しています。glyph や path 等。
パス情報自体はほぼ同じ形式なのでデコード処理は共通化できます。
使用していませんが XAML も attribute に埋め込まれたパスの書式は同一でした。
内外判定は NonZero 相当。自己交差したパスは未対応。
・Paths SVG 1.1
・FXG 1.0 Public Specification
・パス マークアップ構文
関連エントリ
・Direct3D11/DirectX11 (16) GPU を使ったアウトラインフォントの描画の(4)
・Direct3D11/DirectX11 (15) GPU を使ったアウトラインフォントの描画の(3)
・Direct3D11/DirectX11 (14) GPU を使ったアウトラインフォントの描画の(2)
・Direct3D11/DirectX11 (10) テセレータの補間
・Direct3D11/DirectX11 (9) テセレータによるアウトラインフォントの描画など
・Direct3D11/DirectX11 (8) テセレータの動作