頂点配列から画面にポリゴンが映るまで

正確性に大きく欠けるはずです☆
中身を全然理解してなさそうな処理の流れ画像
f:id:Nsan:20211115224405j:plain


シェーダーや色付けの部分が間に合わなかったので次回へ


以下お勉強推移


2021/10/13
お決まりの順番で頂点配列をライブラリとかに渡して,変換行列を設定すると
なんかよくわからんけど画面上にポリゴンが表示される

ライブラリとかOSとかなにやってんの?

2021/10/24

「基本のポリゴンの形はなんで三角形なの?」

から始める

これといった回答は見当たらないが,どうやら処理速度を上げようとすると三角形になるらしい

1.任意のN点を通る形を表示しようと思えばその形を表示ができる(?)が,計算は複雑になる
2.任意の3点を通る平面(三角形)は一意に定まる
3.任意の4点を通そうとすると色んな形になる(平面・三角錐など)
4.同じアルゴリズムで大量に処理できる三角形が扱いやすい
5.三角形だとデータ数も多くならないらしい?

以上から

「どうやって三角形をディスプレイに表示してるの?」

長くなりそうな予感がする

まず,3次元空間上の三角形とすると
自分が指定した空間3点の座標をスクリーン(今お前が見てるディスプレイ)上の座標に置き換える作業が必要,
3点に囲まれた平面に色を塗る必要もあるけど

「どうやってスクリーン上の座標指定してるの?」

LED(発光ダイオード)/LED表示器/ドットマトリクスLED 秋月電子通商-電子部品・ネット通販
この辺りの発展形だと思ってる

1.プログラムによってスクリーン上の各点に指定した色で光るような信号値を送ってるのだと思う
1-1.プログラム上の0とか1とかの値がどうやってアナログ信号値になるかは,D/A変換という言葉で終わらせておく
2.ラスタースキャン方式により,スクリーンの「左から右」「上から下」方向へ順に信号値を読み取り光が出力される
2021/11/1
2-1.この読み取りはプログラム側からではなく,ディスプレイ側が勝手に行う
2-2.プログラムとディスプレイとでずれないように表示するために同期が必要となる(垂直同期・水平同期,リフレッシュレート)

3.実際にはCPUからGPUのVRAMへ画面データを送り,同期されたタイミングでGPUがディスプレイに信号を送っていると思われる
(3-1.画面のちらつき防止のためのダブルバッファリングとかでも交換タイミングはGPUが勝手に決めてる?)

以上から
・スクリーン上の座標はプログラムで直接指定できる
・プログラムで指定したスクリーン上の座標に指定色を出す信号を送って表示している
高級言語からGPUのVRAMへどうやって格納しているかはOS・ライブラリ・GPU等に依存している?

が結論

参考
表示方式|液晶の世界:シャープ
液晶ディスプレイ - Wikipedia
グラフィックボード(CRTC)その1
【特集】NVIDIAのさまざまなディスプレイ垂直同期方式をもう一度整理する - PC Watch
VRAM - Wikipedia
VRAMへのアクセスをプログラムで書くと - 『すぐに使える!液晶搭載マイコン・モジュール』blog
Linux - PCのVRAMに直接アセンブリ言語でデータを書き込む。|teratail



2021/11/8

「どうやって空間上の座標からスクリーン上の座標へ変換してるの?」

モデル座標系(頂点情報) -[モデル変換]-> ワールド座標系 -[ビュー変換]->ビュー座標系-[投影変換(射影変換)]->デバイス座標系 -[ビューポート変換]-> スクリーン座標系
という手順らしい
主に行列による変換だしggればすぐ出てくるので省略

参考
http://www.cgg.cs.tsukuba.ac.jp/~endo/lecture/2020/cgbasics/03/03.pdf
グラフィックス科学演習 / Graphics Science Seminar
モデルビュー変換


「オブジェクトの描画順序は?」

適当にやると奥にあるはずのオブジェクトが手前に見えたりしてしまう

スキャンラインやレイトレーシングなどあるけど,Zバッファ法がゲームに使われてるらしい
こちらも資料豊富なので省略
法線算出やバックフェースカリング(隠れ面消去)なども資料ある
なお,不透明と半透明は,わけて描画するらしい

参考
http://www.cloud.teu.ac.jp/public/MDF/toudouhk/lectures/cg2014/08_rendering1/08_rendering1.pdf
【Unity】Zバッファとレンダリング順の仕組み - Qiita
シェーダを書けるプログラマになろう #1 シェーダを理解しよう - Unity道場2019 2月 - YouTube



以上から「どうやって三角形をディスプレイに表示してるの?」は

  1. 頂点情報を取得する
  2. 各種変換を通してスクリーン座標系にして画面に映すデータを作る
  3. GPUのVRAMへ画面データを送り,同期されたタイミングでGPUがディスプレイに信号を送る
  4. ディスプレイが更新を行い,表示される

なお,1.2.3.はCPUとGPU上で反復横跳びする
が結論

参考
DirectX11によるポリゴン描画のための準備処理実装方法【DirectX11】
https://tokoik.github.io/gg/ggbook02.pdf
ゲームグラフィックス特論 A / B − 授業概要


「なんで頂点インデックスがいるの?」

複雑なモデルの三角形メッシュ全部の頂点を保存しようとすると
頂点が重複するし,動かそうとすると処理大変
なので,頂点の位置とメッシュを作るのに必要な頂点をわけようってことらしい

よって
頂点情報の重複消去
が結論

参考
その30 気になる頂点インデックスの意義
ポリゴン