もんしょの巣穴blog

OpenGL ES 2.0 その00

つい先日あったIGDAの新年会で知り合いがiPhoneで3Dオブジェクトを出しているのを見せてもらいました。
で、ちょっと面白そうだったので調べてみると、OpenGL ES 2.0のWindows用エミュレータがあるじゃないか。
…こいつはやるしかねぇな。

と言うわけで、短期集中(たぶん長期にはならないと思う)のOpenGL ES 2.0チュートリアルって感じで。
まずは0回目と言うことでインストール、サンプルプログラム動作まで。
なお、本格的にiPhoneでゲームを作りたい人はOpenGL ES 1.1を勉強しましょう。
2.0は次のiPhoneでは使えるという話ですが(確定というわけでもない?)、少なくとも今は1.1しか使えません。
私の場合、プログラマブルシェーダが使えないのがイヤなので2.0にしました。固定シェーダなんて今更やってられん。

さて、まずはWindows用エミュレータ、およびSDKを手に入れましょう。
置いてある場所は私が知っているのは2カ所です。
1つはAMD/ATIのサイト。こちらにはRenderMonkeyなんかもあって、これがGLES2.0に対応しています。
本格的にGLSLをやろうという人ならこっちの方がいいかもしれませんが、GeForce使ってるとどうも動作が怪しいらしい。
まあ、ATIなんだからRadeon特化でも仕方ない気がしますが。
もう1つはImaginationのサイト。聞いたことがないという人もいるかと思いますが、PowerVRの会社と言えば懐かしむ人もいるかもしれません(特にセガ系の人)。
こちらのSDKはGeForceでも問題ないようです。実際、今のところ問題は出ていません。
はい、GeForce使ってるのでこっちを選びました。URLは以下です。

http://www.imgtec.com/powervr/insider/sdkdownloads/index.asp#GLES2

DLするには登録する必要がありますが、無料なのでちゃっちゃと登録しちゃいましょう。
DLしたファイルを実行すればインストーラが立ち上がるので、指示に従ってインストール。
次に重要なことですが、DLLをSYSTEM32にコピーする必要があります。
DLLはインストールフォルダ下の、Builds/OGLES2/WindowsPC/Lib の下にあります。
2つあるので両方ともコピーしましょう。
また、ここにある2つのLIBもビルドの際にリンクします。VisualStudioのディレクトリ設定にここを追加しておくと良いでしょう。
ここまできたらあとは適当なサンプルをVisualStudioで開きます。Demos か TrainingCourse にプロジェクトがあります。
コンパイルが通れば(たぶん通るはず)実行。実行できなかったら…がんばれ。
なお、1からプロジェクトを作成する場合、以下の方法で作成できます。

1.Win32プロジェクトを作成
2.プロジェクトのプロパティで以下の設定を行う
  [全般][文字セット] : マルチバイト文字セットを使用する
  [C/C++][プリプロセッサ][プリプロセッサの定義] : BUILD_OGLES2 を追加
  [リンカ][入力][追加の依存ファイル] : libEGL.lib libGLESv2.lib
3.以下のディレクトリをインクルードファイルディレクトリ、およびライブラリディレクトリに登録
  [インクルード] : Builds/OGLES2/Include; Builds/OGLES2/WindowsPC/Include;
  [ライブラリ] : Builds\OGLES2\WindowsPC\Lib;

これだけ。あとは適当なサンプルでもコピーして、うまくいけばOK。
何ら苦労することなく動いたのでちょっと拍子抜けでしたね。

私もまだいじり始めて1週間も経っていないのでよくわかっていない部分もありますが、適当にやっていきたいと思います。
適当が一番。適当、適当。

スポンサーサイト
  1. 2009/01/26(月) 00:10:07|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

STLのallocatorメモ

『Effective STL』を買いました。
STLはよく使っているものの、効果的な使い方をしていないのではないかと新しい会社に入社して気づきました。
今更って言うな。
で、読みながらちょっとプログラム。

STLのコンテナはallocatorを使って独自のメモリ確保が可能ですが、よく解説で見られるallocatorサンプルではVisualStudioでエラーが出ることがあります。
vectorだと出ないけど、listだと出る。これは rebind<U>::other を使用しているからです。
内部ではallocatorのコピーコンストラクタが発行されるのですが、この時、

allocator<T>( const allocator<U>& )

というコピーコンストラクタ(正確にはコピーじゃないが)が必要になるためのようです。
なので、この定義を作成してやる必要があるのですが、基本的には何もしなくても問題ないようです。
エラーメッセージとして allocator<T>( const allocator<T>& )が?と言われますが、実際には上記のような意味です。テンプレートはエラーメッセージがわかりにくい。

また、rebind<U>::other は通常 allocator<T> のT型以外のメモリ確保が必要になった時に使用されるのですが、普通は allocator<T> と同じアロケータを使用します。
もし、T型とU型は別のアロケート処理をしたい場合、rebind<U>::other を別のアロケータにしてみたらどうなるか?
エラーを回避してやってみた結果、list では実際にメモリ確保されるのはListNodeなので rebind<U>::other が動きました。
では vector なら allocator<T> が動くのか、と思ったら rebind<U>::other が動きました。ホワイ?
まあ、あまりそういう機会はないと思いますが、使いたいと思っても使わない方がいいかも。
使うなら、テンプレートの特殊化を使った方がいいかもしれませんが、どうやったら特殊化できるのか不明。
いろいろ試してみたけどエラーを無くせなかったです。

テンプレートって難しいよね。

  1. 2009/01/11(日) 17:52:44|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

あけました

年が明けました。
昨年、祖母が亡くなっているので、おめでとうと言ってはいけないらしいです。
ともかく、今年もよろしくお願いします。

パーバーテクスライティングは基本的に行わない方向で。
パーピクセルライティングを基本にする方がグラフィッククオリティも高いし。
しかし、シェーダの自動生成も難しいね。
先月から作ってますが、やっと雛形ができました。
あとは細かい変更と、正式なコンバータ、シーンとの整合性の取り方がうまくいけばそれなりに公開できるかも。
とはいえ、たぶんフラグメントを増やしていく過程で多くの修正を余儀なくされるものと思われます。
ある程度汎用的ならいいや、って感じで作ってしまったのですが、本格的に汎用化するつもりならこれでは駄目なんじゃないかと思っています。
かなり変則的なシェーディングを必要とする場合はいろいろうまくいきません。
たとえば、ディフューズとスペキュラで別の法線を使うとか、そういうのには対応できません。
そんなことする必要があるのかどうかわかりませんが、アニメ調のゲームなら必要かもしれません。
少なくとも、そういうかなり特殊なシェーダは自動化が難しいと思います。
計算自体は何とかなりそうですが、入出力情報の整合性を取るのが難しい。
あと、ライトベクトル等で使用するためにテクスチャ座標がかなりの数使用できないと厳しいかも。
ピクセルシェーダ入力として法線が使えないし。座標も確か使えないはず。
その辺のベクトルは全部テクスチャ座標で。デプスとかも必要だし。
まあ、少しずつ作っていこうとは思います。

あ、そうそう、次の仕事は決まっています。というか、明日から初出社。
前の会社に7,8年もいたので、新しい会社に馴染めるかどうか不安です。
みんないい人そうなので、そういう点では問題ないと思います。問題は自分自身。
がんばるよ。

  1. 2009/01/04(日) 18:17:48|
  2. 未分類
  3. | トラックバック:0
  4. | コメント:2

プロフィール

monsho

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する