2ntブログ

プログラマに必要な基礎知識 コンピュータグラフィクスの基礎

3Dの計算式だとか画像圧縮の仕組みだとか、そういう難しい上級な話ではありません。
てゆーかそんなもん私も知りませんw
今回はコンピュータで画像を表示する仕組みの基礎を述べます。
具体的には映像をどうやって数値化データにしているのかと、数値化された映像データをどうやって画面に表示しているのかです。




コンピュータの映像は全てドットと言われる四角い点で表現されています。
この文字なども、よーく目を凝らしてみると■の集まりでできているのが見えるでしょ?
つまりコンピュータでは完璧なギザギザのない線ってゆーのは、この仕組み上、垂直と水平の線以外は無理なんですわ。
斜めの線とか円とかよーく目を凝らしてみると、必ずギザギザになってるはずです。

このドットを小さくする事で、ギザギザを見えにくくしているだけなのが今のコンピュータでの映像です。

よってドットが大きく、それによって1画面上に表示できるドットの総数が少なかった時代なんかは文字ですら表現するのが大変でした。
ファミコン時代のテレビゲームが、「ひらがな」しか基本的に表示していなかったのはこの為で、別に子供向けだから「漢字」を使っていなかったわけじゃないんです。
「ひらがな」の方が「漢字」より格段に少ないドット数で書けたからって事です。
ファミコン時代にも、高くて有名だった光栄の歴史シミュレーションものは一部君主や武将の名前とか漢字表記を無理やりしてましたが、「ひらがな」などより縦横2倍の大きさで表示されてました。
つまり「漢字」などの複雑な形の文字は「ひらがな」の4倍のドット数を使わないと表現できないってことです。
これは今の時代にも受け継がれていて、「全角」とか「半角」とかあるのはその為です。

ギザギザの無い「アナログ」な絵をコンピュータなどのドットで表現する「デジタル」の映像に変換する場合、最も原始的というか昔よくやってた方法は「方眼紙」に絵を描く事でした。
そして方眼紙の目が半分以上黒くなってるところをコンピュータ上でドットを点灯させると、それっぽい絵が出来上がったって寸法です。

ちなみにコンピュータでドットが点灯してない状態は「黒」になります。
ドットが点灯していると「白」になるのが普通です。
今でこそExcelでもWordでも白紙の上に黒い文字を書くようになってますが、本来は逆なんです。
つまり白い紙に黒い線で絵や文字を書くと、コンピュータ内部ではその分を消灯、つまり消してるわけですね。

まぁそれはおいといて、このようにして「アナログ」を「デジタル」な絵に変換します。
次にそれらをどうやって数値データに変換するかって事ですが、カラー映像はおいといて「白黒」それも黒(ドット消灯)と白(ドット点灯)の2色しかない最も古い原始的なデジタル映像で説明します。
まずドットが消灯している状態を「0」とします。
そしてドットが点灯している状態を「1」であらわします。
これだけです。
これはそのまま2進数そのものです。
そしてコンピュータの保管域の最小単位である1バイトには8ビット、つまり2進数8桁分のデータが入るので、8ドット分のデータを保管できる事になります。
この場合の8ドットは通常は縦8ドット分です。
こうして画面左上から縦8ドットを右端までずーっと保管したら次は画面左上から9ドット下がった所をまた縦8ドット分左から右へずーっと保管するみたいな感じです。

古いパソコンや家庭用ゲーム機で、画面全体を上下左右に動かす場合に、なんか一瞬画面の上下がズレたように表示される事がありましたが、この仕組みを知っているとなるほどと納得がいくはずです。
つまり画面左上から8ドットづつ横へ新しい画像データを更新していき、一番右までたどり着いたら1段下がってまた左から順番に画面を書き換えるというのをやっていたからです。

次に「カラー」を再現する方法ですが、これには「光の三原色」を使います。
つまり「赤」「緑」「青」の色を1ドット上に配置するんですね。
「RGB」って言う映像信号を聞いたことがあると思いますが、これの事です(レッド・グリーン・ブルー)。
この3色を単純に点灯させるかさせないかで「色」を表現した場合、2×2×2=8通りの組み合わせ、つまり8色表示ができる事になります。
古いコンピュータやテレビゲーム機の同時発色数とか見ると、8色になってるのはその為です。
あとはこの光の三原色の光度合いをそれぞれ段階的に「少し」光るとか「すごく」光るとかできるようにすれば、それに応じて再現できる色も増えるって寸法です。
現在の「フルカラー」つまり人間が判別できる色の最大色と言われていて、それ以上は表現できるようにしても無駄だからここまででいいだろうって色の「1677万色」は「赤」「青」「緑」それぞれを8ビット256段階で光具合を表現できるようにしたものです。
256×256×256で約1667万(正確には16,777,216)色って事です。
ちなみに色も含めたドットの点滅に使うのは8×3で24ビットなのですが、現在のPCの画面の色の設定を見るとたぶん32ビットカラーとかになっていると思います。
これはコンピュータが一度に扱えるビット数が32ビット以上になった事に合わせているだけで、実際には「色」として使われているビット数は24ビットのままで、残りの8ビットは全く使われていないか、あるいは半透明処理など特殊な映像合成などに使われているとのことです。
現在のパソコンは1ドットあたり24~32ビット、つまり2バイト分のメモリが必要な事が分かります。

私のPCは1920×1080ドット(あるいはピクセル)の画面モードなので、横1920×縦1080×2バイトで1画面のフルカラー映像を表示するのに最低でも4,147,200バイト、つまり約4MB使っていることになります。
拡大も縮小もしないでそのまま表示させた時に1920×1080ドットの大きさで表示される絵や写真のCGデータは4MB程度って事ですね。
JPEGとか実際はそれを更に圧縮しているのでもっと小さくなります。

動画の場合は「パラパラ漫画」の原理で知られる通り、1枚の絵を素早く次々と画面に表示する事で、あたかも動いているかのように見せるので、「フルHD」と言われるこの1920×1080ドットの動画映像は1秒あたりたとえばアニメなどの標準の12枚の絵を見せるなら4×12で48MB必要、10秒ならその10倍で480MB、1分なら2GB以上必要になる事が分かります。
ただしこれは無圧縮の場合の理論値なので実際はもっと少ないですが、それでも動画ってのがすんげー容量食うのが分かると思います。
ちなみにこの1秒間に何枚の絵を表示するかをフレームレートとか言ったりもします。
単位はfpsで、たとえば映画館で見る映画などは24fps、つまり1秒間に24枚(コマ)の絵を表示できるそうです。
アナログ時代のテレビもだいたい同じで、今のデジタルハイビジョン放送はその2倍の60fpsぐらいあるようです。
だからより綺麗で滑らからな動画が見えるわけですね。
このfps値が低いと、カメラで高速で動く物体を撮った時のように、1コマの絵がブレた状態で写ってしまうということです。
野球中継なんかで投球をよくハイスピードカメラで撮影したもののスローが流れますが、あれもハイスピードじゃない普通のカメラのスローだと、ボールがブレて写ります。
AAで表すと ハイスピードじゃないカメラで撮った映像をスロー再生するとボールが 三○ こんな感じで見えて、ハイスピードカメラのスロー映像はボールが ○ で見えるって感じです。

どーでもいいですねw

ともかくコンピュータの映像ってのはすごくメモリを食うものなんだ、あらゆるデータの中で一番容量がでかくなるんだって事をプログラマの人は認識して下さいって事です。

特にゲームを作ってる人、クライアントが重くなるのはこれが最大の要因なんですよ。
課金額を増やすために次々新しいグラフィックのカードだの機体だの投入する馬鹿企業が多いですが、やめれって事をです。

コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR