カテゴリー別アーカイブ: OpenGL

Squeak から OpenGL を利用する


 最近は携帯機器でも 3D グラフィクスが楽しめるようになってきました。そうなるとやはり自分の手でも作ってみたくなる物です。そして出来れば自分の好きな開発環境で使う事が出来ればなお嬉しいものです。ということで、Squeak からでも OpenGL を簡単に扱う事が出来るので方法を紹介したいと思います。なお、環境としてはまっさらな Squeak 4.4 を MacOS X で動かしています。

OpenGL を使えるように拡張する

 実は拡張方法は Squeak 上に情報があります。 “Help” メニューから “Extending the system” を選択します。
Extending the system
 そうすると “How to extend the system” というウィンドウが表示されます。ここには様々なプログラムが書かれているので、(必要に応じて編集するなどして) “Do it” すればシステムを拡張することが出来ます。まずは FFI(Foreign function interface) の拡張を導入します。私は Mac を使っているので、Windows と Unix 向けの記述を削除して、下記のような状態にして “Do it” します。
FFI
 インストールが終わったら続けて OpenGL 拡張を導入します。下記の部分を選択して “Do it” します。
OpenGL
 これで Squeak から、OpenGL が使えるようになります。

サンプルを動かしてみる

 それでは、サンプルを動かして動作を確認してみましょう。 Workspace で 下記のコードを “Do it” してみましょう。

OpenGL example

 下のように赤い四角形が回転する Morph が表示されるはずです(速くて良く分からないかもしれません)。クリックすると終了します。
OpenGL example
 これで、Squeak でも 3D グラフィクスプログラムを楽しむことが出来ます。

ポリゴンのプリミティブタイプの違いと使いどころ


OpenGL などの描画 API を使ってポリゴンを描画する時にプリミティブタイプを選択することになります。一般的には下図に示したようなプリミティブから選択することになります。左から「トライアングルリスト(triangle list)」、「トライアングルストリップ(triangle strip)」、「トライアングルファン(triangle fan)」です。

一番直感的なのはトライアングルリストだと思います。トライアングルストリップ、トライアングルファンに至ってはわざわざ選択する必要があるのかどうかもすぐには感じられません。とはいえ、描画手段が用意されているのですから何かしら使いどころはあるはずです。一体、それぞれの使いどころはどのようなところなのでしょうか?


トライアングルリスト

トライアングルリストはとにかく直感的で扱いやすいところが特徴です。その反面、「ポリゴン数 x 3」(x Byte 数)というその他のプリミティブに比べるとデータ量が多くなってしまうことが難点です。

トライアングルストリップ

トライアングルストリップは最初のポリゴンは3頂点分のデータが必要ですが、その後は1頂点分のデータ量で1ポリゴンを描画し続けることが出来ます。トライアングルリストと比べるとポリゴン数が増えれば増えるほど経済的に有利になります。また、同じポリゴン数であればトライアングルリストよりも描画効率が良くなります。そのため可能であればトライアングルストリップとして描画すると良いでしょう。

しかし、マテリアルなどの関係上どうしてもつなげられないポリゴンも出来てしまいます。そうした場合は、

  • 複数のトライアングルリストとしてまとめて描画する
  • 三角形一つのトライアングルストリップとして一つずつ描画する

とすることになります。

トライアングルファン

一番使いどころがなさそうなトライアングルファンですが、次のような場合には有用です。

  • 多角形ポリゴンを三角形ポリゴンに分割する
  • 三角形ポリゴンをある矩形領域に収まるように分割する

まずは「多角形ポリゴンを三角形ポリゴンに分割する」場合を考えてみます。なぜモデルデータにポリゴンを使うのかでも書きましたが、一般的には三角形ポリゴンでないと描画が出来ません。しかし、モデルデータとして多角形のデータが含まれている場合は三角形に分割して描画 API に渡すことになります。その際はトライアングルファンとして描画すれば、トライアングルリストなどで描画するよりも簡単に出来ます。

次に「三角形ポリゴンをある矩形領域に収まるように分割する」場合を考えます。下図の様な矩形領域にポリゴンを収めたいとします。ポリゴンと矩形の各辺との交点を結ぶと三角形から多角形になります。ここからは先ほどと同じでこの多角形を三角形に分割し、トライアングルファンとすれば良いです。

このようにプリミティブタイプには複数の種類が存在しますが、それぞれの特性を理解して場合によって使い分けると、効率的に処理することが出来ます。

Emacs での glsl-mode の導入


私はエディタとしてずっと Emacs を愛用しているので、シェーダを書くときにも Emacs の恩恵が得られると便利です。探してみると Emacs Lisp がありましたので、紹介します。

ちなみに下記では Windows 用の Emacs クローンの Meadow を例にしていますが、他の環境でも同様にすれば使えるはずです。

機能としては

  • シンタックスハイライト
  • インデント(TAB または C-M-\)
  • .vert ファイルと .frag ファイルの切り替え(S-lefttab あるいは ff-find-other-file)

があります。

ダウンロードと設定

まず、下記から Emacs Lisp をダウンロード(またはコピー & ペースト)します。
glsl-mode.el

そしたら次のような適当なディレクトリにファイルを保存します。(ついでに “emacs-lisp-byte-compile” などでバイトコンパイルしておくと良いと思います)
C:\meadow\packages\lisp\glsl-mode\glsl-mode.el

次に設定ファイル(~/.emacs.d/init.el) に次を加えます。

(autoload 'glsl-mode "glsl-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.vert\\'" . glsl-mode))
(add-to-list 'auto-mode-alist '("\\.frag\\'" . glsl-mode))

こうすると .vert(頂点シェーダ)ファイルや .frag(フラグメントシェーダ)ファイルを読み込めば自動的に glsl-mode になります。

おまけ cg-mode

NVIDIA 系な方は Cg を利用している方もいるかと思います。 Cg にも cg-mode があるようなので、利用してみると良いかと思います。
cg-mode.el