12/06/26 21:59:31.92 mR6HJejQ
よーし、パパゲームエンジン作っちゃうぞー
C#, .Net, OpenGL環境(だけどPSMとかに移植可)
シーングラフ、アニメーション、シェーダー、スケレタルアニメーション、コリジョン検出など
今日からここが俺の日記帳だ!
851:名前は開発中のものです。
12/06/27 09:58:10.93 U29IMiHf
やったー!
852: ◆qSKP3eYtY6
12/06/28 16:15:23.72 WtTC5o4X
シーングラフは「ノード ー コンポーネント」モデルとする
造語だけどUnityみたいな形といえばわかりやすい
3D空間上の1点が1ノードで、そこに色々な機能を持ったコンポーネントをアタッチして使うのが基本
Predicateで指定した条件が一致するノードを探すFind, FindAllと
指定のコンポーネント型を探すFind<TComp>, FindAll<TComp>がある
子ノードをたどってActionを実行するTakeもある
あとはSendMessage()で関数名(string)を指定してコンポーネントの関数を呼び出せる
ざっくりとガワだけ書くとこんな感じ
URLリンク(dl.dropbox.com)
(セキュリティ警告を外さないと見られないかも)
853: ◆qSKP3eYtY6
12/06/29 15:09:28.16 KafWz+Or
DDDのクラスは単一のObjectクラスを継承する(標準のObject)とは別
このObjectクラスにはUniqueID, UserID, UserObject等を含むがおもしくも何ともない話なので省略
Objectクラスの一番重要なのはアニメーション機能。
DDDではAnimationTrackを1基本アニメーション単位とする
このアニメーションを任意のプロパティ(Setter必要)にセットすると準備完了
Animate()関数の呼び出しで値が書き換わる
これはノードのアルファ値を書き換えている例
node.AddAnimationTrack (anim, () => node.Alpha);
第2引数が珍しい形だが、これがC#で最も簡単にプロパティを指定する方法
型はExpression<Func<T>>だが特に気にする必要はない
854: ◆qSKP3eYtY6
12/07/01 20:59:13.49 KktJ7lkD
アニメーションは「値型でSetter/Getterを持ったプロパティ」なら何でもセットできるようにする
この辺はC#の機能をフルに使っている
クラス的にはKeyframeSequence<T>とAnimationTrackが存在し、
複数のAnimationTrackをAnimationClipが管理する(再生速度などはこのクラス)
歩くとか走るはこのClipが相当する
Clipを差し替える時は特に仕組みを用意してないが(全てのTrackを手動で切り離すことになる)
この辺は考慮中。あるいは
node.AddAnimationTrack()ではなくnode.AddAnimationClip()でクリップ単位でアニメーションをセットしたほうがいいのかもしれない。
855: ◆qSKP3eYtY6
12/07/02 17:22:25.28 PZRbc+vH
MathパッケージにはVector2,3,4, Matrix3x3, 4x4, Quaternionが含まれる
すべてC#の構造体を使って実装される
これらの構造体はプロパティとしてアニメーションを付加されたりUniform変数としてシェーダーにエクスポートされる
特徴は次の2つ
(1) 構造体は不変量とする
どうしようかずいぶん迷ったがこれらの構造体は不変量、つまりnewした後は一切変更できない事にした。
不便そうだが直感に反してそうでもない。いちいち計算のたびに新しい構造体を作るがコストは安い。
(2) 必ずプロパティ(ComponentCount)と添え字演算子([])を実装する。これはエクスポートする時に必要となる
Vector2,3,4は1つにまとめてもいいが、今回はタイプセーフを優先して別クラス
座標系はOpenGLと同じ右手系でV=MVの形.
856: ◆qSKP3eYtY6
12/07/03 19:49:13.53 WXHikQCo
>>853
node.AddAniamationTrack()ではなくnode.AddAnimationClip()に変更
クリップ単位でセットすることにした。理由はその方が簡単
開発マシンをSSDにしてたら一日消えたんだぜ。まじ呪うMicrosoft
857: ◆qSKP3eYtY6
12/07/04 10:25:33.70 ZninQWD9
Uniform変数の実装について。
今現在よくある実装はSahderProgramやVertexBufferみたいなクラスに
いきなり値をSetUniform("Alpha", 1.0f)みたいに突っ込むがこれは良くない習慣だと思っている
(1) この関数を呼んだ時に値がセットされるので毎フレームOnDraw()の中で呼ぶ必要がある
(2) 毎回呼ぶので依存関係がわかりにくい。
DDDでは「データ構造と操作の分離」を基本思想としているので、以下のように実装しようと思う
ShaderArrayクラス。使用するUniform変数の情報を保存するコンテナクラス
AddUniform(name, object, property)でどのオブジェクトのどのプロパティをどの変数でエクスポートするかセットする
この段階ではまだ値はセットされず、後のRender()関数内部でこの情報に従って値がセットされる(データ構造と操作の分離)
※ 型とサイズ(vec2,3,4)はシェーダーをコンパイルした時に判定するのでここでは必要ない
※ Uniform変数の配列は当面なし。どう実装すべきか良いアイディアがない
858: ◆qSKP3eYtY6
12/07/04 14:35:40.37 ZninQWD9
ShaderProgramについて
シェーダーはShaderProgram1つで全て賄う(FragShader, VertShaderはなし)
クラス名を可能な限り少なくするのがDDDの思想
DDDはHWに依存しないのでコンパイルとリンクはRender()まで行われない(というかできない)
定義されたAttribute変数とUniform変数を列挙する列挙しがある。型はIEnumerable<ShaderVariable>.
ShaderVariableは>>857と>>858の両方で使用する
これもやはり「クラス数を可能な限り少なくする」ため
シェーダーで定義された変数名と型を調べてそれが>>857でセットした一覧にあればそのオブジェクトとプロパティから値を拾ってきてエクスポートする事になる
859:名前は開発中のものです。
12/07/04 14:40:27.10 ZninQWD9
シェーダーにエクスポート出来る変数はIExportableインターフェースとして明確化した
ComponentCountとValueTypeを返す添字演算子を持つ
よく考えるとIExportableはIAnimatableでもあるわけだが・・・
860: ◆qSKP3eYtY6
12/07/04 16:27:05.51 ZninQWD9
ある意味もっとお世話になるMesh周りはこうしようと思う
Mesh
VertexBuffer
IndexBuffer(s)
Appearance(s)
ShaderProgram
UniformArray(s)
Texture(s)
Material
PolygonMode,BlendMode,PointSpriteMode
(s)が付いているのは複数。IndexBufferとAppearanceが複数なのはサブメッシュ。
見え方は「Appearance」が担当する。
Appearanceは1つのShaderProgramとそこで使用するUniform変数のセット。あとTextureとMaterial。
Materialはユーザーがシェーダーに渡すパラメーターをセットしたObjectを置いておくためのプレースホルダー。Materialクラスは完全に空でユーザーが継承して使用する。
>>857の理由によりUniform変数には直接値をセットしない事に注意。
かならず値を取ってくる元になるObjectのプロパティがなければならない。
あとのPolygonMode, BlendMode, PointSpriteModeはシェーダーから触れないOpenGLの機能を変更するためのつまらないクラス
ポイントスプライトとは独立したノードではなくMeshクラスを使用する。
861: ◆qSKP3eYtY6
12/07/05 14:00:11.24 flNlSeDp
VertexBufferとIndexBuffer
バーテックス・バッファーはAttribute変数として送られる頂点ごとのデータのバッファー(x,y,z, 法線, テクスチャー座標など)
インデックス・バッファーはglDrawElement()で使うインデックス。
この辺のデータ構造はライブラリによって異なるが、どの方式が有利とかは多分無い
DDDではMeshの下にVertexBufferx1とIndexBufferxnを持つ
生の頂点データはVertexArray<T>クラスが保存する
これはそのままglBufferData()でGPUに送り込める形そのもの
操作は非ジェネリックな同名のVertexArrayを通して行う
IndexBufferは本当にintの配列をどかんと持っているだけ
やはりそのままglBufferData()でGPUに転送する
862:名前は開発中のものです。
12/07/05 14:05:32.16 flNlSeDp
描画できるプリミティブについて
トライアングル、ライン、ポイントスプライトの「リスト」形式のみ「ストリップ」には対応しない
これは現在のGPUではリスト形式を使ったほうが高速で、あえてストリップ形式を使う理由がないため
シンプルである事を価値とするので複数の手段は提供したくない
インデックスを指定する時にリスト形式だと冗長なのでストリップ形式でも指定できるようにしようかとも考えたが
上記の理由でバッサリ削除
この辺は異論も出そうだが実際に作っている人の裁量の範囲ないということで
863:名前は開発中のものです。
12/07/05 14:08:25.82 cRpEW0yx
あれ
インデックスは32bit限定?
ushort版はなし??
864:名前は開発中のものです。
12/07/05 16:20:07.98 2Z2qwIZw
これってこの部分を実装しましたという報告なのか、これからやりますなのか
865: ◆qSKP3eYtY6
12/07/05 16:37:17.91 flNlSeDp
>>862
intあればいいと思ったけど対称性悪いからIndexBuffer<T>にしといた
今の所ジェネリックなのはVertexArray<T>とIndexBuffer<T>とKeyframeSequence<T>
全部同名の非ジェネリック版ばあって操作はそちらから行う
866: ◆qSKP3eYtY6
12/07/05 16:40:06.48 flNlSeDp
>>864
今の所ガワ(API)だけ実装してある。中身はすっからかん
必要なフィールドとかは置いてあるので実装はそんなに苦労しないはず
それでも月単位で必要だけど
867: ◆qSKP3eYtY6
12/07/05 16:49:34.85 flNlSeDp
テクスチャーまわり
Image2DとTexture2D, TextureCube。あと基底クラスのTexture.
画像のロードは.NetのSystem.Drawingにやってもらう。
データの入力形式としては.NetのBitmapかbyte[].
フォーマットはLuminance, Alpha, LuminanceAlpha, RGB, RGB.
パック形式のRGB565, RGB5551はとりあえず対応しない。S3とかも対応しない
リピートはClampとRepeat. テクスチャー関数というかDecal, Modulteなどはシェーダー内部の話なのでここでは出てこない
あとテクスチャークラスに直接画像をロードするライブラリもあるけど今回は1クッション(Image2D)を置く
868: ◆qSKP3eYtY6
12/07/05 17:22:59.32 flNlSeDp
テクスチャーについて1つ注意点がある
通常CPU側にはTexture2Dクラスがあって、シェーダー側からアクセスする時は「テクスチャーユニット番号」を使用する
何番のユニットにロードされたかはTexuture2Dクラスの知る所ではなく、そのプロパティとしてテクスチャー番号を取得できない
(1つのTexuture2Dが別のユニットにセットされる事はあり得る)
従ってこれはAppearanceクラスの仕事(プロパティ)になる。
が、これは明らかにおかしくて本来はTexuture2Dクラスをシェーダー側のテクスチャー変数何とかにバインドするのが自然である
(ただしそれは上記の理由により不可能)
ではどうするか?
Texture2Dは同じ番号のユニットにロードされなければならないという制限を科す。
この制限のもとでTexture2D.TexturUnitでユニット番号が取れるようにすれば、
シェーダー側にユニット番号を自然な形でエクスポートする事ができる
869:名前は開発中のものです。
12/07/05 19:13:16.47 gC4tIXCC
svnかgitを使って公開して欲しいなぁ
870: ◆qSKP3eYtY6
12/07/06 14:05:57.42 FBQYllXg
>>869
してる。けどまだ見る価値はない
871:名前は開発中のものです。
12/07/06 14:11:27.57 FBQYllXg
BoundingVolume(BV)
BVは球かボックスで、カリング、ピッキング、LODで使われる。
コリジョン検出は別の専用のCollisionVolumeを用意する
たぶん珍しい形だと思うけどBVは独立したクラスにせずNodeの単なるパラメーターとする
BVはユーザー定義のBVと、シーンをフリーズ(後述)した際に自動で作られるBV階層のBVに分かれる
872: ◆qSKP3eYtY6
12/07/06 14:17:53.88 FBQYllXg
BVを使ったピッキングその1
var nodes = from n in world
let ri = n.Intersect (ray)
where ri.Hit
orderby ri.Distance
select new {Node=n, Intersection=ri};
var nearest = nodes.FirstOrDefault();
説明の必要がないぐらいソースを見れば何をやっているか明確、しかも汎用的でピッキング以外もOK
(自分で作る理由の1つがこれ)
欠点は全ノードに対して交差判定をとるので遅い事
LINQ構文はデータベースをモデルにしているので全件検索になってしまう
873: ◆qSKP3eYtY6
12/07/06 14:28:22.79 FBQYllXg
BVを使ったピッキングその2
float minDistance = Float.Max;
Node nearest = null;
world.Take ( n => {
var ri = n.Intersect2 (ray);
if (ri.Hit) {
if (ri.Distance < minDistance) {
nearest = n;
minDistance = ri.Distance;
}
return true;
}
return false;
})
前回のLINQ構文を使ったピッキングと異なりBV階層を利用してルートから交差判定を行いヒットしなければアーリーリタイア(return false)を行う
TakeはFunction<Node, bool>を引数にとり戻り値がtrueの限り再帰的に呼び出しを行うメソッド
BV階層を利用するのでシーンをフリーズしないと使えないけど速い
874:名前は開発中のものです。
12/07/06 14:40:43.77 FBQYllXg
シーンをトラバースしてある処理行うメソッドはいくつか用意する予定(詳細は決めてない)
IEnumerable<Node> Search (Predicate<Node> func)
=> 指定の述語(Predicate)に一致するノードを列挙する
void Take (Action<Node> func)
=> 全ノードに対してActionを実行する
void Take (Func<Node, bool> func)
=> 全ノードに対してtrueを返す限りFuncを実行する
これらのジェネリックデリゲートを使った構文はシーンのトラバース以外にも使用する予定
処理結果を受け取りたいはクロージャーが使える(ラムダ式からラムダ式を呼び出す関数のローカル変数にアクセスできる)ので
ほとんど全ての処理が記述できる
875: ◆qSKP3eYtY6
12/07/09 10:44:15.40 HsBojE2t
シーンのフリーズとOnUpdate()
昨日までうっかり勘違いしていたがシーンのノードのOnUpdate()の呼び出しは
シーンを上からトラバースするのではなくPriorityの順。
従ってOnUpdate()は再帰関数ではなく単発の普通の関数
コンポーネントの呼び出しは入れた順
順不同で呼び出されるのでモデルtoワールド行列とかキャッシュするためにもシーンのフリーズが必要
どのみちコリジョン(k-DOP)のワールド座標でパラメーターのキャッシュにも必要
フリーズしたら変更を伴う操作は一切受け付けなくなる
876: ◆qSKP3eYtY6
12/07/09 13:29:08.22 HsBojE2t
ライト
固定時代のライトは独立したノードだったが、シェーダー時代ではライトは単なるUniform変数の1つに過ぎない
さらにDeffered Shadingにおいてはライトはメッシュと同様にGPUに頂点データを送って
(計算済みのBGufferからパラメーターを拾ってきて)レンダリングするだけの存在である
従ってDDDにおいてLightは本当に単なるMeshの別名である
using Light = Mesh;
マテリアルは専用のLightMaterialが用意されていてシェーダーにエクスポートするColorやAttenuationはここで定義されている。
877: ◆qSKP3eYtY6
12/07/10 10:10:18.98 0DNkleuf
アニメーションイベントの設定
アニメーションクリップの指定の時刻を再生した時に任意のコールバック関数を呼び出すことが出来る
コールバック関数はdelegate void AnimationEventHandler(Node node, object args)型で
clip.AddEvent(time, name, handler, args)で登録する。追加情報としてobject型の引数を1つだけ指定できて使い方は任意
ハンドラーの第1引数はクリップではなくクリップがセットされたNode
(利便性を考えてこうなっているが深い階層でセットされるとNodeまでたどるのが大変なのでこの仕様は変更する可能性がある)
1つのクリップが複数のターゲットにセットされていた場合、コールバック関数は複数回呼ばれる。
コールバック関数の呼ばれるタイミングはゲームエンジンによって異なるが、
Animate(time)の中で値を変更しイベントを発火させると1つの処理単位としては内容が大きすぎる(と思う)
「シンプルであること」が価値と考えるDDDではこれを分割してRaise(start, end)とする。
Raise()は時刻(start,end]までに起こりうるイベントを全て呼び出す関数
通常start=time-Δt, end=timeで前フレームから現在のフレームまでに起こるイベントを発火させる
878: ◆qSKP3eYtY6
12/07/10 11:12:38.45 0DNkleuf
SkinnedMeshの実装
スケレタルアニメーション用にボーンを仕込んだメッシュの実装
このクラスのやるべき事は実は多くない。ボーン行列の計算とGPUへの転送だけである
ボーンはただのNodeで表し特別なクラスは作らない。
SetBones(Node[])したタイミングでボーン行列(=バインドポーズの逆行列)を計算し
プロパティIEnumerable<Matrix4x4> BoneMatricesで取得する
ボーンインデックスはこのNode[]のインデックスそのもの。
このプロパティは配列型で定義されたUniform変数に送られる
インデックスとウェイトはAttribute変数として頂点単位で送られる
ボーンの変形は「トランスフォームステージ」でユーザーがシェーダーの中で行い結果は一回書き戻す予定
OpenGLのTransofrm Feedback Buffer機能を使う予定だが、まだ詳細を詰め切れていない
879:名前は開発中のものです。
12/07/10 11:23:23.33 0DNkleuf
配列型のプロパティ
BoneMatricesプロパティは意外とこれが熟考が必要で、
(1) 配列型
IEnumerable<T>のプロパティを配列型とみなす
(2) アニメーション可能
アニメーショントラックは同名のトラックをクリップにAddTracks()で一括登録する
アニメーション対象がIEnumerable<T>を実装したプロパティの場合は同名のトラックが連続して存在するものと期待して長さ分適応する
(2) GPUにエクスポート可能
シェーダーが配列型のUniform変数を要求している時はそのまま列挙してセットすればOK。
でいけるはず。基本的には配列型のプロパティは例外。
多分ここにしか出てこないはず・・・
880: ◆qSKP3eYtY6
12/07/10 14:29:56.51 0DNkleuf
1つ迷っているのがトランスフォームシェーダーをどうやって供給すればいいかという事
今考えているのはレンダリング時に強制的にシェーダーを切り替えて実行する案
トランスフォームシェーダーは全メッシュで共通なのでこれで十分だと思われる
シルエットで描画したいとか一時的にシェーダー(というかアピアランス)を切り替えて描画するのは理にかなっていると思う
この辺実はあまり調査して無くて他のゲームエンジンがどうやってるのかよく知らね
881: ◆qSKP3eYtY6
12/07/10 15:34:37.39 0DNkleuf
MorphMesh
モーフィングは特に難しい処理はない。ベースのVertexBufferと同じ型のVertexBuuferをウェイトをかけて足すだけ
すべてCPU処理。ApplyMorphing()でベースのVertexBufferは上書きされるがデータ自体は置いておく必要がある(nullでは駄目)
882: ◆qSKP3eYtY6
12/07/11 10:01:05.26 75j/QepR
CollisonVolume
物理エンジンが組み込まれているわけではないので勝手に動いてぶつかり合うわけではない
設定したコリジョン領域同士がオーバーラップしたら指定のコールバック関数(OnCollision)が呼ばれる
CollisionVolume(CV)はコンポーネントの1種でNodeにアタッチするとコリジョン物体として振る舞うようになる
CVはk-DOP(k=26)を使う。k=26はAABB(6)にコーナカット(8)、エッジカット(12)を足したもの(6+8+12=26)
メリットは比較が速い(なにせ最大でも単なるfloatの大小比較26回だ)。デメリットは座標変換(とても重い)。
比較の座標系は常にグローバル座標を使う。必ずしも全てのケースでベストではないが気にしない
シーンをフリーズしたタイミングで(グローバル座標に変換した)CV階層をボトムアップで作成しキャッシュする
シーンをフリーズするのはこの為という意味が強い。
コンポーネントの方のCVはユーザー定義のローカルCVで、ノードの方のCVはの自動生成のグローバルなCV
オーバーラップしていればvirtual OnCollision(Collision )が呼ばれる。引数はコリジョンの発生した位置、法線、ノード
タイミングは後述のPhysics3D.Collide (world).
883: ◆qSKP3eYtY6
12/07/11 10:07:51.04 75j/QepR
Physics3D
2つある(.Net環境で定義されていない)プラットフォーム依存クラスの1つ。もう1つはGraphics3D
コリジョンの判定はPhysics3D.Collide(world)で行う。
これがWolrd.Collide()でないのは「シーンはポータブル」という思想を反映している
シーンにプラットフォーム依存の関数が入り込んではいけない
一応Physics3Dは物理エンジンを使用する為の接続口として考えているが、
この辺はまったく調べてないので実はわからん。
当面コリジョン衝突の判定だけ
884: ◆qSKP3eYtY6
12/07/11 10:13:48.96 75j/QepR
BoundingVolume
あとバウンディンブボリューム(BV)も同様にして実装される
やはりコンポーネントの一種。BoxとSphere(and/or)が設定できる
BVはカリング、交差判定(ピッキング)、LODで使用される
コリジョンボリューム(CV)とは何の関係もない
このあたりのボリュームは可視化できるようにして欲しいなあ
という要望は当然あると思うが現状で特に考えてない。
885: ◆qSKP3eYtY6
12/07/11 12:59:47.92 75j/QepR
LODSelector(コンポーネント)
LODは複数の子ノードを持ったノードにアタッチされたLODSelectorが行う
親ノードにアタッチされたBoundingVolume(BV)がLODの基準になる大きさ
AddCandidate(node, resolution)で子ノードとそれを何ピクセルぐらいで表示したいかを決める
例えばノードに(1)メッシュ(2)ビルボード(3)空ノードを100,10,0ピクセルで登録して
World.Select()を呼ぶとスクリーンに投影されたBVのピクセル数に一番近い子ノードのみを有効にする(残りは無効)
詳細レベルの切り替えはフリッカーを起こさないようにヒステリシスを設定できる。
例えば上記の例だとhys=0.1を指定すると10~10.9、100~?が遷移領域になる
ブレンドファクターを使って2つの子ノードを合成すべきかとも考えたが、
使わないだろうと判断して見送った。いきなり切り替わる
886: ◆qSKP3eYtY6
12/07/12 11:26:44.66 4kdlcnsW
ノードの継承をObject3D - Attachable - Nodeに再編成
今ひとつゴチャゴチャしていたので3階層に再編成した。
[1] Object3D
空間上の1点をあらわし座標変換を担当する抽象クラス。TRSMを保存
[2] Attachable
1.にコンポーネントをアタッチできるようにした物。ノード単体処理もここ
[3] Node
2.に親子階層をつけシーングラフを構成できるようにしたもの。再帰的な処理はここ
これですっきり。
887: ◆qSKP3eYtY6
12/07/13 13:21:25.35 XkwS8Q4i
Graphics3D
デバイスクラス。.Net環境の外の部分
Targetプロパティ:xN RenderToTextureのターゲット最大4枚
~Enabledプロパティ:機能の有効無効の制御
Selectionプロパティ:delegateでWorldからノードを取り出すLINQ構文の受け取りを想定
RenderPassイベント:delegateでレンダリングパスを記述する
Render()関数:RenderPassで指定したパスを実行する
最大の特徴は「不透明物体のみ取り出してzでソートしてカメラに近い方から描画」という処理を
後でエンジンの外からラムダ式を使って記述し(Selectionプロパティ)、RenderPassイベントに追加して
Render()関数でまとめて実行する事
従来型の記述よりだいぶすっきりと書けてると思う(たぶん)
888:名前は開発中のものです。
12/07/13 13:35:11.81 XkwS8Q4i
Mesh再考
どう考えてもこのままだとSkinnedMeshが実装できそうにないので再考した
(1) Mesh :静的メッシュ
(2) TransformMesh :TransformFeedbackシェーダーを含むメッシュ
(3) SkinnedMesh :その中でもボーンによる変形を行うトランスフォームメッシュ
(4) MorphMesh :CPUで変形するモーフ
スキンの変形にTranformFeedback(TFB)が必要で
将来的にSoftBodyとかパーティクルも実装可能な汎用クラスを考えてTranformMeshクラスを分離独立
889:名前は開発中のものです。
12/07/13 19:34:55.20 XkwS8Q4i
OpenGLリソースの保管
(.Netの範囲外である)描画コードは完全にシーンから分離する
そのためObjectとOpenGLリソース(int)の対応付けが必要になる
最初の案だとキャッシュとしてDictionary<Object, int>を考えていたが、
これだといったんキャッシュに入るとObjectの参照を保持し続けるのでシーン側で用済みになっても
ガーべっじコレクターが永遠に走らない
その都度リリースしてもらうかイベント登録とか考えたがどうもうまくない
そこで考えたのがObjectへの参照はWeakReferenceにしてディクショナリーのキーを
ObjectではなくObjectのハッシュコードに変える案
struct CacheLine {
WeakReference ref;
int resource;
}
Dictionary<int, CacheLine>
弱い参照は残っていてもGCには関係ないので消える。
後は定期的にGraphics3D.GC()を読んでもらえればキャッシュを捜査して
消えた弱い参照を消してOpenGLリソースを開放すれば完璧
890:名前は開発中のものです。
12/07/17 13:21:14.74 ZJ+ZLX+A
ひと通りAPIは決めたので月末までお休み
Doxygenでコメント埋めて抜けてるAPIを精査する
別段面白い作業ではないので一人でひっそりと。
891: ◆qSKP3eYtY6
12/07/31 14:17:03.52 eTCwGkpq
簡単に埋めてみた
URLリンク(dl.dropbox.com)
APIだけ見てもわけわからんと思うが・・・チュートリアルが必要だがそのうち何とかしよう。
一応ページ差し込みができるのは確認した(けどXMLで書かないといけないから書きにくい)
しかし時間かかるねえ・・・
エラー条件等も含めてがっつり書いておきたかったんだけどなかなかどうして進まない
892: ◆qSKP3eYtY6
12/08/02 10:02:54.60 u7Ky33VI
実装するべ。コードより先にドキュメントを完成させておきたかったけど
これ以上細部を詰める必要はほとんどない(今の仕様でまず問題ないと考えている)
全部実装するのは年内一杯ぐらいかかると思うけど
とりあえず今月はシーングラフ周りから。というわけでまた月末までお休み
893:名前は開発中のものです。
12/08/08 14:58:01.15 2/6Ybee5
irrlicht1.8aに追加でこんだけ実装した、エンジンの根本はもう実装終わりそう、やっとゲーム本体を組みに行けそう
win,osx互換、radeon,gf,intel互換、D3D,GL互換、SM2.0無印範囲で動作確認済み
・既存のHWSを改造して頂点色反映とか細々機能追加
・ソフトパーティクル
・FXAAを使えるように移植
・フォーラムに出てるXMLベースのシェーダ色々セットをD3DとGLで見た目が互換になるように改造、バグは潰し改良諸々
・自由度低い代わりに少し軽いブルーム
・A8対応(irrlichtはなぜかA8対応する気が無い?)
・A8テクスチャフォントと文章ノード
文字個々に、4頂点色個々設定可、フチも4頂点色個々設定可、フチも込みで裏から見ても大丈夫
文字の見た目重心で回転、拡大縮小、UVで上下左右反転、タブ位置揃え、タブサイズ可変
描画がそこそこ速い頂点配列モードと自由度が高い代わりに遅い文字個々ノードモードでこれら装飾が完全互換
頂点配列モード→ノードモードへはいつでも切り替え可
書体切り替え可、字間行間設定可
文字の初期配置と以降の変更は固定機能のほかにスクリプトでも可
(固定機能の 右詰,ジャスティファイ,ルビ がまだ未実装)
・この文章ノード専用のメッセージアニメータ
メッセージ表示速度やA濃度の変化距離(言い表し難い)をfloatで変更可な改行やタブサイズ対応の時間ベースアニメータ、フレーム数に依存しない
・celtストリーミング再生、oggページに分割しないで簡素に扱うためのダンパーも作った
・フルカラーもパレットも自然画もアニメ絵もPNG以上の圧縮率で、パレット画像の場合はPNGよりも展開が2倍↑速い独自コーデック、画像以外にもリソースのRAMキャッシュ用として使用、フルカラーは圧縮率を犠牲にすれば展開はもっと速くなる
・格ゲーでよくあるタイムストップ演出のためシーンマネージャ毎にタイムストップ可能にし違和感のないストップ解除も可能にした
・某エンジンで実装されてるエフェクトをパクる許可をもらったので盛り込んだ(推測で真似して実装しようとして挫折、数学苦手だ)
細々とした改造は他にも色々あるけど忘れた
894:名前は開発中のものです。
12/08/08 23:35:12.35 TqStE+nz
がんばれー
895:名前は開発中のものです。
12/08/09 02:01:20.69 TEaUWCM1
URLリンク(www.twin-tail.jp)
↑どこ行ったん?
896:名前は開発中のものです。
12/08/09 04:38:13.54 3/Xihug4
>>893
お疲れ様です
気長にまったり頑張ってください
897:名前は開発中のものです。
12/08/09 09:50:32.27 6TOyobo6
>>895
あ、そこ世話になったのに消えちゃったのか。
898:名前は開発中のものです。
12/08/27 16:10:01.26 NCPCFhPq
◆qSKP3eYtY6のひとブログやってる?
ブログ色々めぐってたら偶然それっぽいの見つけた。tu*daさん?
899:名前は開発中のものです。
12/08/29 17:17:49.00 81OpSOeF
ログ読んでたらなぜか既にDDD6のひとの名前がでてるw
それに叩かれてるけどログにある神奈川工科大のひとって
Unity for MMDのひとじゃないだろうか。
単なる名無しさんよりは名前出してる人のほうが成果だすのかも。
でも名無しでも>>893さんみたいに頑張ってるひといるし僕もがんばってみよ。
900: ◆qSKP3eYtY6
12/08/31 23:09:21.37 xFJnGOSk
今実装してるけど進まんねー
まあのんびりいこう
来月には三角形ぐらい出したい
901:名前は開発中のものです。
12/09/01 10:16:37.76 xmU3R1N+
>>900
つくってるのは趣味?
Unity使わないの?
902:名前は開発中のものです。
12/09/13 00:56:24.58 sGA/0Nry
米GarageGamesがゲームエンジン「Torque 3D」をオープンソースに
URLリンク(sourceforge.jp)
URLリンク(www.garagegames.com)
903:名前は開発中のものです。
12/09/13 08:30:02.26 58G1gAN7
ほーMITライセンスなんだ
思い切ったね
904:名前は開発中のものです。
12/09/13 11:57:11.78 LHU8GMTz
Torqueは結構迷走してるけど、会社自体は大丈夫なのかな。
でもMITライセンスは大歓迎だ。
905:名前は開発中のものです。
12/09/13 12:00:35.58 oVqq+2hk
とーきゅーって読むのかな
906:名前は開発中のものです。
12/09/13 12:15:21.64 seBnVBvk
トルク
907:名前は開発中のものです。
12/09/13 14:51:06.70 ckaemq4+
もう開発しないよ宣言な可能性
908:名前は開発中のものです。
12/09/13 15:53:04.73 seBnVBvk
>>907
そうだよ?
「UnityとかUDKとかVisionとかNeoAxisとか出てPCでもスマホでも新規客取れない状況だわ。
ならもういっそTorque使ってゲームを作った方が会社としてマシだわ。
これまで支えて来てくれた既存ユーザーと業界のために現行版のソースとバイナリはそのまま公開するわ」
っていう趣旨
909:DDD ◆qSKP3eYtY6
12/09/28 14:39:56.27 Ao+KlUIY
骨組み部分は動くようになったぞ
コア部分(Unityで言えばGUIでポコポコ作る部分)
URLリンク(codepad.org)
スクリプト部分(Unityで言えばユーザー定義のBehaviorスクリプト)
URLリンク(codepad.org)
動いているところ
URLリンク(v.youku.com)
ここまではこれ以上ないぐらいシンプルに実装できていると思う
来月はアニメーションとスキニング
910:名前は開発中のものです。
12/09/28 14:43:11.02 /GjltfpL
>>909
すげぇ
OpenGL3以降ベースのゲームエンジンって少ないから頑張って欲しい
911:名前は開発中のものです。
12/09/28 14:53:23.12 acwnFDZO
中華か…
912:名前は開発中のものです。
12/09/28 17:24:24.69 PqQHbJ7G
がんばってくれ。
いいものであるなら金払ってもいいから。
913:名前は開発中のものです。
12/10/03 13:54:44.18 41pE2PfQ
~無双、なんて(ry
914:名前は開発中のものです。
12/10/07 03:33:29.31 waNmdRMa
一人称カメラの動きを細かく設定できるエンジンって何があるか知らない?
915:名前は開発中のものです。
12/10/07 14:05:34.36 vN4vuB14
俺のエンジン(未公開)
916:名前は開発中のものです。
12/10/11 20:13:04.47 GvttqXGw
>>912
お前にとって良いものとは何なんだ?
箇条書きで答えよ!
917:名前は開発中のものです。
12/10/17 23:22:39.19 Pfzws2L+
本見ながらjavaでのAndroidゲーム作成勉強してるんですが、java自体が全部理解できてなくて一苦労。
皆さんはjavaをどうやって学びましたか?
918:名前は開発中のものです。
12/10/18 03:45:35.27 Fx0NYEIC
2chで聞かずに自分でググって学びましたよ
919:名前は開発中のものです。
12/10/18 07:39:11.43 nmJHTTqt
>>917
ゲーム作って学びました。
920:名前は開発中のものです。
12/10/18 11:59:59.97 cLLtBdhn
javaじゃなくてC#使ってるけど、言語自体って結局慣れだから、
わからないとこは飛ばしていって次進んで、わかんないとこにぶち当たったら
またわかんなかったとこに戻るみたいにするのがいいと思う。
知識って本を何週も回し読みしたら、その分力つくと思うし。
921:名前は開発中のものです。
12/10/18 15:40:44.04 ye+6Lt4M
オープンソース読むのもいいんじゃないかな?
ゲームエンジンも既に公開されてるのがあるから、
それを自分好みに改造しながらスキルつけるってのがいいのではなかろうか。
922:名前は開発中のものです。
12/10/18 19:15:35.62 ZEhkL4/X
みなさん、ありがとうございます!
分からないところは前に戻って復習しながら進めます。
ちょっと焦ってしまいました(・・;)
923:名前は開発中のものです。
12/10/18 22:40:03.22 cLLtBdhn
>>922 androidは詳しくないけど、ああいうのってvisual studioとかjava版のVSみたいなので
GUIアプリ作った経験があったほうがいいから、とりあえずCUIで文字列のみのをやったほうがいいかもね。
言語でつまってるならなおさら。
オブジェクト指向の話は知っといたほうがいいけど、言語のすべてをアプリ開発で使うわけじゃないし、
(map,vectorとか、知ってたほうがいいけど)気が向いたらアプリの本やってもいいと思う。言語と交互で。
読んでてわからないことがあったら、メモでもして必ず調べる。クラスとかメソッドならネットに説明あるから
924:名前は開発中のものです。
12/10/19 16:22:37.38 JZnGlke5
>>798
生きてたら再うpしてくれ
最新バーでも嬉しい
925:名前は開発中のものです。
12/10/20 22:15:44.75 z0wc2dTp
>>924
どっかに残ってなかったかな・・・。
最新版は色々変わりすぎ+変えている途中だから危険。
926:名前は開発中のものです。
12/10/25 21:39:37.55 gKqGB4cG
>>925
変わりまくってて良いから欲しいっす…
927:DDD ◆qSKP3eYtY6
12/11/02 11:07:40.77 nbtbyhZ7
生存確認がてらスキンアニメーション
・URLリンク(codepad.org)
・URLリンク(v.youku.com)
スキンアニメーションは基本的に2パスを想定していて
1パス目がTransformFeedbackを使った変形で、2パス目が変形後の頂点を(普通に)描画する。
用語はすべてJason GregoryのGame Engine Architectureにあわせてある。
ボーンのローカル座標からモデル座標に変換する方が「ポーズ行列」で静止姿勢が「バインドポーズ」。
従って「逆バインドポーズ行列」と「カレントポーズ行列」をかけたものが「スキニング行列」。
これらの行列はGetInvBindPoseMatrix(), GetCurrentPoseMatrix(), GetSkinningMatrix()で取得できる。
この辺の実装はいろいろパターンがあってどう実装してもいいけど、
世界で一番美しく書けたと思う。いやまじで。
関係ないけどどうも世の中のJason Gregory以外のスキニングの説明とコードが気に入らなくてなんだかなあと思う。
Jason Gregoryの本を読めば一発でわかる事をなぜあんなに分かりにくく書くのか・・・
ネーミングは多少気に入らない。TransformFeedbackBufferはいくら何でも長すぎる!
TransformVertexBuffer(←変形前)も微妙におかしい。この辺の名前は改善の余地がある。
928:DDD ◆qSKP3eYtY6
12/11/02 11:08:11.55 nbtbyhZ7
次は遅延レンダリング。fp32のオフラインレンダリングはできるようになったのであと少し。
できればHDRの後処理も入れたいので(その方が綺麗だ!)歩みは遅いけどがんばろう。
ガンダムオンラインのCβやってる場合じゃない罠
面白かったからいいけど。
929:名前は開発中のものです。
12/11/02 12:42:47.20 nIzM7h3m
相変わらずすげー。
ところでイチャモンつけるようで申し訳ないんだけど
それシリアライズを考慮してるの?
アピアランスでラムダ使ってるからそのへん難しいのでは。
930:名前は開発中のものです。
12/11/21 22:06:37.59 iMuxzy4b
DirectX上でWindows風GUIのエンジンって需要あるかな?
931:名前は開発中のものです。
12/11/21 22:21:14.32 4ruuHy6d
需要は作るもんだよ
932:名前は開発中のものです。
12/11/21 23:31:48.97 iMuxzy4b
とりあえずこんな感じなんだが
URLリンク(www.dotup.org)
933:名前は開発中のものです。
12/11/21 23:51:47.19 iMuxzy4b
間違えた・・・こっちだった
URLリンク(www.dotup.org)
934:名前は開発中のものです。
12/12/08 13:48:53.85 jgPnjvbb
URLリンク(green.ribbon.to)
935:名前は開発中のものです。
13/07/10 11:13:52.54 5ntm98R0
ノベル・ADV系エンジンだったら今なら何を勉強するのがお勧めですか?
携帯型アプリ対応見込んだ方が将来的にはいいと思います?
936:名前は開発中のものです。
13/07/10 18:26:28.01 hXavos25
目的によるとしか。
単にノベルゲームが作りたいなら何でも良いから使ってみればいいし、
自分で同等のエンジンを作りたいならオープンソースの奴のソースを見ればいい。
必要なのはテキストパーサーとサウンド&画像の表示と
シーン全体のセーブ/ロードができればなおいい(これは難しい)。
あとアニメーションの仕組みはエンジンによってピンキリ
937:名前は開発中のものです。
13/07/12 00:43:58.57 rEbmw96f
質問です
シーン(レベル)の切り替えで永続したいデータ(自キャラとか)はどうやって記述するのがいいでしょうか
シーンがノードのツリーで表されているとしてその一部のノードを次のシーンに持ち越したい
ゲームを作っていると必ずある処理だと思うのですが、これといった定番の方法が思いつきません
938:名前は開発中のものです。
13/07/12 00:45:15.00 rEbmw96f
あげときます
939:名前は開発中のものです。
13/07/15 00:36:32.21 PRrwRVkL
シーンの外に持つに決まってんじゃねーか。
940:937
13/07/15 01:08:01.92 Nmr8nTDx
でもレベル実行中はシーングラフの中にいた方がいいですよね
そうするとシーン遷移の時に切り離して付け直すのは記述が難しいから止めるとして、
ノードをキー、バリュー方式でストックしておく永続データ置き場みたいなものを作るべきでしょうか。
UnityはDontDestroyフラグだった記憶がありますが、それはUnity社が馬鹿だからそういう実装になっているのでしょうか。
941:名前は開発中のものです。
13/07/15 03:27:44.53 IbujTVuD
UnityはGUIで画面にものを置いていく関係でそうなってるのかな?