サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
CES 2025
asura.iaigiri.com
※<注1> 2009/03/01 一部記事とプログラムの修正を行いました。以前の記事はこちらから閲覧できます。 ※<注2> 2009/03/04 プログラムを修正。四角形ポリゴンにも対応しました。 さすがにサンプル作るのに,いつも箱とか平面だとへぼいので,メッシュファイルを読み込んでみます。 使うファイルはAlias Wavefront OBJ File(*.obj)です。 いろいろなファイルがありますけども,そのなかでもOBJファイルはシンプルでわかりやすいほうだと思います。 まずはファイルの読み込みをつくる前にざっとファイルフォーマットの説明をします。 上のようなメッシュファイルを表示するためにはOBJファイルとMTLファイルの2つを使います。 OBJファイルの方は幾何形状のデータを取り扱います。要するに頂点座標とか法線ベクトルとかテクスチャ座標とか,面を構成するのに必要なデータとかそ
球面調和関数を使ってキューブマップを近似してみました。 下の図はかなり手抜きアリアリで適当に作ってます。 SHを5次まで計算して,圧縮画像が出力されるようにプログラムを作りました。 下図は,元画像と球面調和関数を使って近似した画像を比較したものです。 最初のセットがPaul Debevecさんのとこから持ってきた画像で,次のセットは以前XNAのサンプルで使ったことのあるTerragen使って作った画像です。 さて,近似データの作成ですが…それほど難しくはありません。 SH投影して,球面調和関数のスケーリング係数を求めます。あとはこの求まったスケーリング係数を使って球面調和関数の値をスケーリング倍して,足し合わせてやれば近似できます。トライゼットの西川さんが書かれている記事に説明があるので【コラム】3Dグラフィックス・マニアックス(68)事前計算放射輝度伝搬(PRT)~PRTの基本。静的PR
そろそろ,GI系もまともに勉強しなきゃヤヴァイんじゃないかと思ったので,まずはSHからお勉強です。 プログラム的にはXNAで実装したものとほぼ同じものです。 球面調和関数ですが,「いったいこの難しそうな響きの関数は何につかうの?」と思われるでしょう。球面調和関数は,レンダリング方程式を近似して解く際に用いられたりします。 まずはレンダリング方程式から…。 レンダリング方程式は,その名の通りレンダリングを司る方程式です。この方程式は1986にJames Kajiyaによって発表された"The Rendering Equation"という論文に書かれているものだそうです。この論文発表以降,レンダリング方程式の解を正確に近似できるということが,GI(Global Illumiation:大局照明)の定義として用いられるようになったそうです。 GI系の論文を見るとレンダリング方程式がよく出てくるの
今回はバネのシミュレーションの応用ということで,布のシミュレーションです。 ※もうちょいそれっぽく見えるようにパラメータを調節しました。(2007/11/15) 布っぽく見せるためには,布の性質である「編まれた方向に伸びにくい」「せん断に対して伸びやすい」「非常に曲がりやすい」という性質を再現しないといけないそうです。 この性質を質点バネモデルで表現する場合には,Stretch(引っ張りに対して抵抗する接続),Shear(せん断に対して抵抗する接続), Bending(曲げに対して抵抗する接続)を持たせてそれぞれのバネ定数を各接続の性質を再現するように適切に設定します。 質点にかかる力は… によって求められるそうです。 で,バネを接続するのに有名なやつに「Landerモデル」と「Choiモデル」っていうのがあるそうです。 ↑Landerモデル ↑Choiモデル 布関連の研究については,あま
Perspective Shadow Maps(透視シャドウマップ)を試してみました。 尚,今回のプログラムの実装に当たっては,Game Programing Gems 4を参考にしています。 Perspective Shadow Mapsは,StammingerとDrettakisがSIGGRAPH 2002で発表したシャドウマップに関する手法です。( 論文はこちらのページ) シャドウマップは,影を生成するための手法として,使われていますが,よく知られている問題があります。 それは,エイリアシングの問題です。Perspective Shadow Map(透視シャドウマップ)は,このエイリアシングの問題を解決するための一つの手法です。透視シャドウマップは正規化されたデバイス座標空間上で生成します。すなわち,透視変換後の空間でシャドウマップを生成するということです。さて,この様に透視変換後の
ようやくLight Space Perspective Shadow Mapsの実装をしました。 Light Space Perspective Shadow Mapsの論文はこちらのページからダウンロードできます。 元の論文では、Light Space Perspective Shadow MapsをLiSPSMという風に略していますが、"i"だけ小文字なので何か気持ち悪いので、うちのページではLSPSMと略していくことにします。 画像空間アルゴリズムで問題になるのは、エイリアシングです。もちろん、シャドウマップ技法もその問題を抱えています。このエイリアシングのアーティファクトを低減しようとするいくつかのアプローチがあります。その中で良さそうなアイデアのひとつに透視シャドウマップ(PSM: Perspective Shadow Maps)があります。残念ながら、元々の透視シャドウマップ技
布のシミュレーションをやってみたかったので,今回はその下準備として1次元のシンプルなバネのシミュレーションをやってみます。 バネのシミュレーションを行うには重りの位置を物理計算によって求めることが必要となります。 では,どうやって重りの位置を求めればよいでしょうか?重りの位置を求めるために次の関係を利用します。 加速度がわかれば,それを時間で積分することによって速度が求められます。さらに速度を時間で積分することによって位置が求められます。 よって,運動方程式により,まず加速度を求めます。つぎに時間で積分して速度を求め,さらに時間で積分して位置を求め,もとめた位置をOpenGLで表示しれやればいいということになります。 まずは,バネにおもりをつけた時の運動方程式を考えてみます。 重りの質量をm,バネ定数をk,自然長をxc,現在の位置をxとすると重りにかかる力は上のような関係になります。 ここ
C#使うならやっぱしフォームじゃなく,WPFでしょ! …ということで,今回はWPF上にOpenGLのビューを作成するサンプルを作ってみました。 WPFでOpenGLのビューを表示するに当たって,一番の問題はレンダリングコンテキストの作成です。 WPFをかじったことがある方ならわかると思いますが,WPFはそもそもHWNDやHDCといったハンドルを意識しないように設計されています。 そうなんです!そこが問題なんです。 レンダリングコンテキストを作成するためにはwglCreateContext()メソッドを使うのですが,まずこのメソッドの引数にHDCが必要です。さらにHDCを取得するためにHWNDが必要になります。そんなわけでWPFですんなりと実装できないようになっちゃってます。 wglCreateContext()とか古い関数使わなくて済むようにMicrosoftの方でC#のコードを用意してく
前回GLUTを使ってフォームの作成やらをやったんですが…,C#を使っているのにGLUTを使うのはいかがなものかと思います。 そんなわけで,今回はWindowsフォームアプリケーションでプログラムを作ってみます。今回もTaoFrameworkを使いますが,Taoに付属しているGLUTは使いません。 まずは,Visual Studioを立ち上げて,プロジェクトを作ります。Windowsフォームアプリケーションを選択して,プロジェクトを作ってください。 選択すると,Visual Studioの方でガガッとコードを作ってくれます。次に,ソリューションエクスプローラーで,作成したプロジェクトを右クリックします。「追加→新しい項目」を選択します。 すると,下のようなダイアログが出てくるので,左側にあるカテゴリから「Visual C#アイテム→Windows Forms」を選択。右側に書いてあるテンプレ
「そろそろGPUのお勉強も始めないと時代についていけなくなってしまう!」そんなことをひしひしと感じてきているので,いろんなサイトやいろんな本をみてGPUのお勉強を始めることにしました。 GLSLもいいんですが,文献が一番多そうなCg言語を使っていくことにきめました! そんなわけで,今回はGg言語をつかうためにCg Toolkitのインストールしてみます。 Cg言語(C for Graphics)とは2002年6月にnVIDIAが発表したC言語ライクな3Dグラフィックス用言語のことです。 従来,GPUの機能を生かしたプログラムを行うには,アセンブリ言語によるコーディングが必要だったみたいなんですけど,Cg言語という高級言語の登場で,C言語風のプログラムをできるようになり,手軽にGPUを制御できるようになったそうです。実際にPlayStation2なんかはアセンブラで組んでたみたいですね。Po
球面調和関数の深い意味などはよく理解していなので,テキト~な説明していきます。鵜呑みにされないようにお願いします。 「そもそも,なんで球面調和関数がでてくるのさ?」ってことなんですが,遮蔽情報を圧縮するための技術として,球面調和関数が使われるためだそうです。圧縮せずにまともにキューブマップに格納してしまうと,結構な量のビデオメモリを食ってしまうようです。そんなわけで球面調和関数を使って圧縮しようっていうことらしいです。 球面調和関数は一般的には,複素数上で定義されるのですが,実数にしか興味がないので実部だけ取り扱っていきます。球面調和関数は元々量子力学で使われるものらしいです。道理で式とかがムズカシイはずだ…。 さて,球面調和関数の定義ですが… 以下のような3次元極座標系で考えます。 球面調和関数は慣例的にシンボルyで表され,次のように定義されます。 ただし,lは正の整数で,mは-lから+
最近の自分は,C#とJavaを使うことが多くなってきました。たまにC++に戻ると,プロパティが使いたいなぁ~とか,文字列の取扱が面倒だなぁ~と思うことが多いです。C++からC#に移ろうかなと本格的に思ってきたので,C#でOpenGLを使ってみます。 自分で,ラッパーを作るのもいいんですが…,正直面倒です。 そんなわけで,Tao Frameworkを使っていくことにしてみました。CgやらSDLやらGLFWやら色々と入っていて,使いやすそうなんでチョイスしてみました。 まずは,Tao Frameworkをダウンロードしましょう。http://www.taoframework.com/にアクセスします。 すると,画面上部のメニューにDownloadという項目があるので,クリックします。 ページが切り替わると,URLが書いてあるので,クリックします。 すると,再びページが移動します。移動すると下の
まず原理ですが,2次元のスクリーンを3次元の物体に投影するというものです。 上の図を見るとわかるように基本的に透視変換と同じ原理です。よって,ライトを視点とみなして透視変換行列を作成して,その行列を掛けてやればよいということになります。 ここで復習ですが…。 皆さんご存じの通り,普通画像は左上が原点となりますが,これをテクスチャ空間に持ってくると座標系が違うためのこのままテクスチャマッピングを行うと上下が反転してしまいます。このままだとおかしいのでテクスチャ座標のt成分(DirectXやXNA GSだとv成分)をマイナス1倍して座標を反転させて,向きを合わせる処理をどこかでやる必要があります。 これを踏まえた上で話に戻ります。 射影テクスチャリングで気をつけなければいけないことはテクスチャ座標を計算するところです。 ライトからみた射影空間とテクスチャ座標が若干異なる点です。具体的には射影空
DDSファイルフォーマットですが,MSDNなんかにも載っていたりするんですけど,Hyperでんちさんのページの方がわかりやすいと思うのでそちらを参考にしてください。 DDSファイルの読み込みですが,OpenGLの拡張機能を使うので,まずはGLEWをインストールしましょう。 ① まずはGLEWを配布しているhttp://glew.sourceforge.net/に飛びます。 ② Download Centerという文字の下あたりにBinaries Windowsというのがあるのでそれをクリックしてダウンロードページ移動して,ファイルをダウンロードしてください。 ③ ダウンロードしたファイルを解凍してください。解凍すると解凍したフォルダ内にさらにlibというフォルダがあるのでクリックします。 ④ libフォルダの中にあるglew32.libとglews32.libをGLUTをインストールしたと
バンプマッピングとは,上の画像のように凹凸を表現する手法の一つです。どうやって,凹凸があるように見せているかというと,法線ベクトルを操作して,ラインティングの計算をピクセルごとに変化させて凹凸があるように見せています。バンプマッピングの利点は実際にポリゴンを変形させて凹凸を見せるのではなく,法線ベクトルを変化させて凹凸を見せるので,ポリゴン数を増やさなくても済むという良い点があります。バンプマップの弱点としては,実際にはポリゴンで凹凸をつくっているわけではないので,正面から見ると凹凸があるようにみえますが,横から見ると厚みがなくて,平らなのがばれるという点です。 バンプマッピングするためのテクスチャ,つまりバンプマップですが,バンプマップの有名なものに高さマップと法線マップがありますが,今回のプログラムでは法線マップを使用します。 ちなみに法線マップというのは下のような画像になります。 な
今回は,頂点バッファオブジェクトについて調べて,試してみました。 ※2010/11/22 Bugfix サンプルプログラムを修正しました。 いままでは,glVertex3fv()とか使ってfor文でぐるんぐるん回しながら描画していたわけですが,さすがに面倒くさくなってきました。またパフォーマンスを考えるとあんまし実用的なやり方では内容に思えます。 DirectXなんかでは頂点バッファを使って描画するのが当たり前なのですが,実はOpenGLでも同じようなことができるようです。 そんなわけで,頂点バッファオブジェクト(VBO : Vertex Buffer Object)を使ってDirectXライクに,描画してみます。OpenGL 1.5からBuffer Objectstというのが使えるようになりました。これは,色々な配列をグラフィックスメモリに置いてやって効率を上げてみましょうというものだそ
今回はDirectXやXNA GameStudioなどで使われているXファイル(*.x)の読み込みを作ってみました。 まず,ファイルフォーマットですが,MSDNに詳しい説明が載っているで Xファイルには大きく分けて2つのフォーマットがあります。1つ目はバイナリフォーマット,2つ目はテキストフォーマットです。 今回のプログラムではテキストフォーマットのみ対応しています。またフレームの構造などは読み込んでないのでスキニングとかやりたい人は自分で,修正を加えてみてください。 ※[2011/01/12 追記] Xファイルを読み込んでスキニングを行うサンプルプログラムを書きました。こちらからダウンロードできます。 今回読み込みプログラムの作成にあたり,『3D格闘ゲームプログラミング(著者:松浦健一郎/司ゆき 出版社:SoftBank Creative)』を参考にさせていただきました。 モデルファイル
Occlusion Queryを使って,物体を描画するのにどれくらいピクセルが割り当てられているかを調べ,ピクセルが全く割り当てられていない場合,カリングをして物体を描画しないようにしてしまう. …というのが自分なりの理解です. 今回,Occlusion Cullingを実装するのに,Occlusion Queryというものを使用します.これは,OpenGL 1.5から使えるようになった機能だったと思うので,まずOpenGL 1.5以上に対応している必要があります.まぁ,最近のGPUとかを積んでいるなら問題ないじゃないかと思います. それで肝心なのは使い方です. まずは,glGenQuery()関数を使って,クエリのIDみたいなものを生成しておきます.下のような感じです. 00068: GLuint g_teapotQuery = 0; 00069: GLuint g_planeQuery
ランバート照明は視線方向に依存しない光源の入射方向と面の法線だけで算出される陰影処理技法です。 この技法ではランバートの余弦則(Lambert's cosine law)が定義されています。この法則が意味しているのは「物体の表面で反射する光の輝度は,光の入射ベクトルLと表面に対する法線ベクトルNとが成す角度の余弦に比例する」ということです。 ランバートの余弦則を数式で表すと次のようになります。 ただし,Idは光の強さ,θは入射角,kdは物体の反射係数,Nは法線ベクトル,Lは物体から光源へと向かうライトベクトルを示します。 また,cosθの値が負の場合(法線がライトと反対の方向を向いてしまっている場合)には値は0にします。 ランバートの余弦則にのっとった入射した光の強さが見る色に比例するような光を拡散反射光(Diffuse reflection light)と言うそうです。 これだけだと光の
さすがにサンプル作るのに,いつも箱とか平面だとへぼいので,メッシュファイルを読み込んでみます。 使うファイルはAlias Wavefront OBJ File(*.obj)です。 いろいろなファイルがありますけども,そのなかでもOBJファイルはシンプルでわかりやすいほうだと思います。 まずはファイルの読み込みをつくる前にざっとファイルフォーマットの説明をします。 上のようなメッシュファイルを表示するためにはOBJファイルとMTLファイルの2つを使います。 OBJファイルの方は幾何形状のデータを取り扱います。要するに頂点座標とか法線ベクトルとかテクスチャ座標とか,面を構成するのに必要なデータとかそういうのが書かれています。 一方MTLファイルの方は,材質データを取り扱います。環境色とか拡散反射光とかテクスチャのファイル名とかそういうのが書かれています。 とりあえず,まずOBJファイルのほうか
フレームバッファオブジェクトを使うと,オフスクリーンレンダリングができるとのうわさを手に入れて,プログラムは手元にあるのですが,内部レンダーバッファがどうとか,フレームバッファがどうとかという詳しい話がわからんので,プログラムで使うときのやり方だけまとめておきます。 framebuffer object(FBO)は,OpenGLでプラットフォームに依存せずにオフスクリーンレンダリングを実現する機構だそうです。ちなみにFBOはOpenGL拡張EXT_framebuffer_objectとして規定されているようです。ちなみにOpenGL 2.0の正式仕様にはないようです。このFBOはOpenGL 1.5以上じゃないと使えなかった気がするので,その辺は気を付けてください。 使い方の流れですが,以下のような感じです。 <準備> ① レンダーバッファを作成 ② レンダーバッファの設定をする ③ 貼り
あるものを作りたいと思ったのですが,まずは凸包を作成する必要があったので, 今回は凸包を作成するのに使われるQuickhullアルゴリズムを実装してみました。 QuickhullアルゴリズムはQuickという名の通り,クイックソートの考え方に似ています。 今回は2次元という風に限定して説明しますが,3次元の場合は同様にしてできるそうです。 まず下の図のように点の集合があると仮定します。 最初に,これらの点の集合の中からx座標が最大と最小となる2点を求めて,稜線を引きます。 次に,線が引かれることによって,線の上側と下側の2つの領域にわけることができます。下の図の場合はうまく2つの領域に分かれますが,場合によっては線の上側に点がない場合もあり,2つの領域にわかれない場合もあります。 つぎに,各領域に関して着目し,各点から稜線に向かって垂線を下ろし,垂線の長さが最大となる点を求めます。 垂直距
更新情報…。 ※重要なお知らせ Project Asuraは新URLへの移行を致しました。 新URLはhttp://www.project-asura.com/です。 2011/10/23 PROGRAM <DirectX> 「Lambertモデル」を追加しました☆ PROGRAM <DirectX> 「Half-Lambertモデル」を追加しました☆ PROGRAM <DirectX> 「Blinn-Phongモデル」を追加しました☆ PROGRAM <DirectX> 「Phongモデル」を追加しました☆ PROGRAM <DirectX> 「Cook-Torranceモデル」を追加しました☆ PROGRAM <DirectX> 「リムライティング」を追加しました☆ PROGRAM <DirectX> 「半球ライティング」を追加しました☆ 2011/08/19 PROGRAM <Dir
◆ DirectX DirectX関係とか… ★ Primer : 入門記事 DirectX11入門 テクスチャマッピング メッシュを表示してみる!(1) Xファイル レンダリングテクスチャ ★ Lighting : 照明処理 Lambertモデル Half-Lambertモデル Blinn-Phongモデル Phongモデル Cook-Torranceモデル リムライティング 半球ライティング ★ Post Effect : フィルタ処理 モノクロフィルタ セピアフィルタ ネガティブフィルタ ガウスフィルタ Laplacianフィルタ Sobelフィルタ Prewittフィルタ Robertsフィルタ ★ Motion : モーション スキニング ◆ XNA GS XNA Game Studio関係とか… ★ Primer : 入門記事 XNA Game Studioのインストール T
このページを最初にブックマークしてみませんか?
『asura.iaigiri.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く