SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C++で線を描画する際のさまざまなテクニック

C++による高品質な線の描画手法

クリッピング処理

 「glclipper.h」で実装しています。

 クリッピングとは、画面からはみ出した線を削る処理のことです。メモリのバッファーオーバーラン、バッファーアンダーラン、などを避けるためにもこの処理を入れる必要があります。画面に映っていない余分な線の描画を省くことによって、処理の高速化をねらうこともできます。

 これについてはFussyさんのアルゴリズムに基づいていますので、特に解説するところはありません。変更点は、いろいろな型に対応できるようにtemplate化したことと、零割りを起こさないための対策を行ったことです。

画質を上げる方法

 単純に線を描くやり方だと常に1ピクセルの幅で描かれるため、シャープですがドットが気になってしまい自然な感じが出ません。これは線のモデルを離散化する処理があまりにも単純だからです。アンチエイリアシング処理を行うことによって線の見た目を滑らかできます。少しぼやけたような見た目になってしまう欠点があり、処理時間も長くなってしまいますが、それらはトレードオフです。

 アンチエイリアシング処理は、各画素の輝度もしくは不透明度を変えることによって実現します。補正を行う要素は、いくつかあります。

ピクセル中央からの距離による補正

 ピクセル中央からの距離によって、輝度に対して重み付けを行います。

ピクセル占有率による補正

 画素中を通る線が占める面積の割合によって輝度を変化させます。線の端の場合は特に考慮する必要があります。

傾きによる補正

 モニタ上で表現する際に、斜めに近い線ほど(隙間が多くなるせいか?)暗くなりがちなので、輝度の補正処理を掛けます。

ガンマ補正

 「glcolorconverter.h」で実装しています。

 モニタのガンマ値にあった輝度の補正処理を行います。Windowsの場合は標準的なgamma値が2.22のようですが、結構ばらつきがあるようです。本来はRGBごとに補正を行うべきなのでしょうが、サンプルプログラムの実装では、まとめて補正を行っています。

背景色との混ぜ合わせ

 「glcolorblender.h」で実装しています。

 完全に不透明でない色を描画する場合、背景色との混ぜ合わせ処理が必要になります。この処理は結構計算の負荷が高くなりがちですが、画質を上げるのには欠かせません。いろいろな混ぜ合わせ方法がありますが、今回のサンプルプログラムでは単純に加算合成とします。

その他

 人の視覚特性や表示装置の特性を考慮するとモアレを軽減させたり解像度を向上させて、画質を上げる事ができます。今回のサンプルの実装では扱っていません。

さまざまな線分描画の実装

 今回のサンプルプログラムでは、4種類の線分描画を実装しています。

Bresenham

 「glLineDrawer_Bresenham.h」で実装しています。

 アンチエイリアス処理を行っていない線分描画です。4種類のうち、一番処理速度が速い描画アルゴリズムです。Jack Bresenhamという人が考案した、かなり昔からあるもののようです。さらに高速なDoubleStepやFourStepのアルゴリズムもありますが、大変そうだったので実装していません。

DDA

 「glLineDrawer_DDA.h」で実装しています。

 アンチエイリアス処理を行わない線分描画です。DDAとは、Digital Differential Analyzer(デジタル微分解析機)の略のようです。計算回数を少なくしようとしてるうちに、自然にこのようになってしまいます。4種類のうち、2番目に処理速度が速い描画アルゴリズムです。画質というか描画精度がBresenhamより高いです。

Wu

 「glLineDrawer_Wu.h」で実装しています。

 2ピクセル幅で描く、アンチエイリアス処理を行う線分描画です。4種類のうち、3番目に処理速度が速く、2番目に画質が高い描画アルゴリズムです。Wu, Xiaolin という人が1991年に発表したようです。

Nelson

 「glLineDrawer_Nelson.h」で実装しています。

 3ピクセル幅で描く、アンチエイリアス処理を行う線分描画です。4種類のうち、最も処理速度が遅く、一番画質が高い描画アルゴリズムです。Scott R. Nelsonという人が1996年に発表したようです。

まとめ

 映画製作などで使われる華々しいコンピューターグラフィックスに比べてしまうと児戯にも等しい、単純な線を描くための実装ですが、初学者の方が画面上に線を描く処理を作る際に参考になれば幸いです。

参考資料

修正履歴

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

べるぽん(ベルポン)

職業:プログラマ日記:http://d.hatena.ne.jp/berupon/物置:http://www.geocities.jp/beruponu/index.html 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/335 2006/03/27 14:12

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー