3時限目さて、ここからは本格的にシェーダプログラムだけで絵をつくるステップに進む。従来のグラフィックスプログラムで絵を出す概念とは、おそらく少し違うので注意が必要だ。従来のグラフィックスプログラムとの違い従来のグラフィックスプログラム2時限目まででFragmentProgramによって出力されるグラフィックスの色が決定されることがわかったと思う。FragmentProgramは出力されるすべてのピクセルに共通した処理しかかけない制約がある。いままでのサンプルは頂点から渡された補間された頂点座標を使い、グラデーションなどの滑らかに変化するグラフィックスを表示してきた。四角やら、円やらの図形を表示するにはどのようにすればよいだろうか?従来のグラフィックスプログラムであれば、四角やら円を書くときは、図形を描き始める座標を指定して書くだろう。-0.5)を中心に半径0.3の円を描く}これから画像を出力する先を”キャンバス”と定義するなら、”キャンバス”に1つのプログラムとなる。今から図形を描こうとするときに、基準点が”キャンバス”になっているのでこのようなプログラムをすんなりと理解できると思う。この書き方ではピクセルごとに共通した処理では書くことができない。1ピクセルごとの処理を定義して全体を描くFragmentProgramだけで絵を描くためには、各ピクセルに共通した処理で絵を表現する必要がある。各ピクセルに共通した処理を書く必要があるのあれば、基準点を”キャンバス”ではなく”ピクセル単位”にするのが自然ではないだろうか。そこでピクセル単位で考えてみる。ピクセル単位で図形を描くことを考えると、そのピクセルが円の中にあるか四角の中にあるか、それ以外の場合なのかを考えればよい。この基準の違いはプログラムを書く上で非常に重要となる。この違いを踏まえて、ピクセル基準のプログラムを書くと以下のようになるだろう。return;}このプログラムを動かすと以下のよこのプログラムを動かすと以下のようになる。とから円の中心からのベクトルを計算し、そのベクトルの長さが半径以下かどうか調べてます。1ピクセルを制すものはグラフィックスを制す全ピクセルに共通するFragmentProgramを書く考え方は、かなり重要な考え方だと思う。従来の"キャンバス"に1つのプログラムを実行するプログラムの考え方はシングルタスクのプログラムの考え方しかできず、プログラムを並列に実行することは困難である。ピクセル単位のプログラムを書いておけば、ピクセル単位で処理は独立しているのでマルチスレッドでプログラムを処理することが可能になる。並列化することが困難であったプログラムも用意に並列化することが可能だろう。ピクセル単位で考えることについてはある程度の慣れは必要だ。昨今のGPUのパワーを最大限に引き出すにはこのピクセル単位の考え方は必須となるだろう。アスペクト比を修正するなんか円がつぶれているが、ウインドウのアスペクト比と、4kGfxMonの座標系のアスペクト比が異なるためである。これはVertexProgramからFragmentProgramに渡すp値をいじってやれば解決する。--(変更なし)まぁこんなかんじ。X座標が(-1〜1)だったのが(-1.7778〜1.7778)になっているので注意アスペクト比の設定は最終的にターゲットとする解像度にあわして設定しておくと良いでしょう。4kGfxMonのウインドウアスペクト比はメニューから変更することができます。4kGfxMonメニューウインドウのアスペクト比は4kGfxMonのウインドウ上を右クリックして、コンテキストメニューから変更することができる。ついでに他のメニューの話もしておこう。4kGfxMonのウインドウを常に一番手前にくるように設定できる。頻繁にプレビューするときに使ってくれ。ウインドウのアスペクト比を指定値に固定する機能だ。4kGfxMonのウインドウをリサイズしたときに自動的に選択されているアスペクト比に固定する。現在のバージョンではフリーのアスペクトにはできない。Gfxをリリースするときはたいていいずれかのアスペクトのフルスクリーンでリリースすることが多いからね。こんなもんでいんじゃないかと。現在描画している画像を作り出すのにかかる時間を計測する。10回描画して平均時間を計測するような仕組みだ。適当なので目安程度に。4kGfxMonで作ったシェーダプログラムを実行ファイルにするための手順の1つだ。ここのついては5時限目に詳しく説明する。おまけちょこっと改造。工夫次第でいろいろできます。