イメージシンセシス トップページ
GLSL(OpenGL Shading Language)の演習
■ レンダリングパイプライン
◆ シェーダプログラムによる基本図形の描画のしくみ
上の「図:シェーダプログラムとラスタライザ」を参照のこと.
- OpenGLアプリケーション(*.c,*.cpp)
頂点情報(座標や色など)を指定して基本図形(線分やポリゴンなど)の描画を行う.
頂点情報がバーテックスシェーダに渡される.
↓
- バーテックスシェーダ(頂点シェーダ)(*.vert)
OpenGLアプリケーションから渡された頂点情報を用いて,頂点ごとの処理を行う.
すべての頂点に対して,同じシェーダプログラム(*.vert)が適用される.
処理結果がラスタライザに渡される.
↓
- ラスタライザ
頂点の座標を用いて基本図形がスクリーンに投影される.
そして,OpenGLアプリケーション,あるいは,バーテックスシェーダによって与えられた頂点情報(色など)がスクリーン上でラスタライズ(補間)され,投影された基本図形の内部に含まれるピクセルごとのフラグメント情報(色など)とされ,フラグメントシェーダに渡される.
なお,個々のピクセル位置に対応する基本図形の要素をフラグメントと呼ぶ(フラグメント(fragment)は破片,断片という意味).
例えば,2つの基本図形が部分的に重なって描かれる場合,重なっている部分の各ピクセル位置では,それぞれの図形からフラグメントが生成される.つまり,1つのピクセルに対して2つのフラグメントが生成される.
N個の基本図形が重なる場合には,N個のフラグメントが生成される.
↓
- フラグメントシェーダ(*.frag)
ラスタライザから渡されたフラグメント情報を用いて,フラグメントごとの処理を行う.
すべてのフラグメントに対して,同じシェーダプログラム(*.frag)が適用される.
処理結果が出力画像として表示される.
基本図形の重なりによって,1つのピクセルに対して複数のフラグメントが生成されている場合には,最も視点に近い(つまり,最も奥行き値(デプス値,Z値)が小さな)フラグメントが表示される.
■ シェーダプログラム
- 上記ページの一番下の「第1版ソースファイル」でリンクされているサンプルプログラム glsl1 を実行してみる.
↓
ウィンドウ内に青色の背景と赤色の4角形ポリゴンが表示される.
左ボタンを押しながらマウスを動かすことで,4角形ポリゴンが3次元回転する.
なお,シェーダプログラム(*.vert,*.frag)は,OpenGLアプリケーション(*.c,*.cpp)のコンパイル(ビルド)時にはコンパイルされず,アプリケーションの実行時にコンパイルされる.
- 上記ページを読んで,サンプルプログラム glsl1 の基本的な内容を理解する.
■ GLSLの変数
◆ 変数の種類
- 型修飾子
- attribute
OpenGLアプリケーションからバーテックスシェーダに渡される値を格納する変数.
頂点に関する値を格納する.
頂点の位置(gl_Vertex),色(gl_Color),法線ベクトル(gl_Normal)など.
- varying
バーテックスシェーダからフラグメントシェーダに渡される値を格納する変数.
頂点ごとの値がスクリーン上でラスタライズ(補間)されてフラグメント(ピクセル)ごとの値に変換される.
- uniform
OpenGLアプリケーションからバーテックスシェーダとフラグメントシェーダに渡される値を格納する変数.
頂点やフラグメント(ピクセル)ごとに変化しない値を格納する.
- const
値が変化しない定数を格納する変数.
- OpenGLアプリケーション
↓ attribute変数
- バーテックスシェーダ
↓ varying変数
- フラグメントシェーダ
- 変数の定義
- 組み込み変数
GLSLが用意している変数.
- ユーザ定義変数
ユーザが定義する変数.
■ 演習
上で実行したサンプルプログラム glsl1 を以下のページのように変更して実行してみる.
■ 課題
(1) 課題内容
GLSLを用いたシェーダプログラムを作成する(演習で扱ったプログラム以外のものとすること).
画像や映像を扱うもの,何かの処理を高速化するものなど,テーマは何でもよい.
ただし,単に(シェーダを使わないで計算した)最終結果をシェーダで表示するだけのプログラムではなく,プログラムの本質的な部分にシェーダを用いたプログラムを作成すること.
※ 簡単なプログラムでよいので,自分の努力で出来る範囲で自力で作成すること.
当然,他人が作成したプログラムやネットでダウンロードしたプログラムなどは提出しないこと.
(2) 提出物
- レポート
以下の内容をレポートに書く.PDFにして提出する.
- 目的と概要
プログラムの目的と概要を簡潔に書く.
- 実装内容
プログラムの内容について詳しく書く.
理論やアルゴリズムなどがあれば,それらも説明する.
- 実行結果
プログラムを実行した結果について書く.
プログラムを実行して得られた画像やデータなど,プログラムの目的が達成されたことを示す実験結果も掲載する.
- 考察
実行結果に対する考察を書く.
- 開発・実行環境
使用したプログラミング言語,OS,パソコンのスペック(CPU,GPU,メモリ容量など)などを書く.また,どのような環境で開発・実行を行ったかを書く(例えば,Windows 10上でVisual Studio 2015を使った,Unix上でコマンドラインからコンパイルと実行を行った,など).プログラムのコンパイル(ビルド)と実行の方法についても書く.
- 意見・感想
講義に対する意見や感想などがあれば….
- プログラムのソースファイルとデータファイル
プログラムをコンパイル(ビルド)して実行するために必要な全てのファイル(ソースファイル,自作のヘッダファイル,画像等のデータファイルなど)を提出する. Visual Studioで開発した場合には,ソルーションのフォルダ全体を提出する.
(3) 提出方法
- 提出期限
- 前期に成績を出して欲しい場合(9月修了など)
令和6年8月19日(月)
- 後期に成績が出てもよい場合(前期の成績は「保留」とします.)
令和6年10月末日
- 提出先:藤本忠博(fujitada@iwate-u.ac.jp)に次のいずれかの方法で提出
- メールにファイル添付
(メールで送ることができるファイル容量の場合のみ.
受け取りの返事がない場合には,問い合わせて下さい.)
- サーバ等にファイルをアップロードして,ダウンロードの方法を連絡
- USBメモリ等でファイルを持参