トップページgamedev
992コメント339KB

ゲームエンジン総合スレ★2

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名前は開発中のものです。2011/02/01(火) 16:58:30ID:Fc0ojZal
このスレはゲームエンジンの製作・雑談・情報交換を行う為のスレです。

ゲームエンジンに関係ない話は該当スレか雑談スレでどうぞ。

総合発表&雑談スレッド その3
http://hibari.2ch.net/test/read.cgi/gamedev/1216633635/

※前スレ
http://hibari.2ch.net/test/read.cgi/gamedev/1293381827/
0815名前は開発中のものです。2011/12/27(火) 23:46:55.10ID:Dx89yn0s
>>814
フォーラムでは2Dスプライトを簡単に扱いたいみたいな話があちこちであがってるので、ほぼまともにGL触ったことないと思われる人ま選ばれてると思う。だから審査は厳しくないはず。気長に待てばよろし。

無理矢理このスレに絡めると、2Dゲームエンジンは需要あり
0816名前は開発中のものです。2011/12/27(火) 23:47:51.31ID:Dx89yn0s
訂正
>人ま
人まで
0817名前は開発中のものです。2011/12/28(水) 01:04:02.80ID:xDqb+NSK
OpenGLを素で扱うということは、ゲームエンジンよりもライブラリに近い感じなのかな。
Unityが使えるという噂もあったけど、そんなこともなかったようだ。
0818名前は開発中のものです。2011/12/28(水) 01:59:06.00ID:XyaxT+Qm
OpenGLを素で使うといことは三角形や線を塗りつぶして行く感覚だよ。
0819名前は開発中のものです。2011/12/28(水) 09:41:02.21ID:Lmdfg00J
>>817
ちょこっとだけラップされてる。
既存コードから流用しにくくなった気もするが、新規コードを起こす分には平気。外部の既存エンジンに頼るつもりの人は南無。

あとプログラマブルシェーダが使えるには使えるんだが、そっちかよ!って突っ込むと思う。
0820名前は開発中のものです。2012/02/28(火) 21:15:40.02ID:0+YFP2RK
俺達でUnityを丸パクリしたゲームエンジンをC#で作らないか!!
PSS用にどうよ?
0821名前は開発中のものです。2012/02/28(火) 21:27:33.60ID:0+YFP2RK
>>817
Wikipediaに書いてあったが何とかライセンスを結ぶとUnity for VITAが使えるらしいぞ。スクエニが使っているらしい
でもそれはPSSとは何の関係もない話。あくまでUnityのVita用バイナリ
PSSで使おうと思ったら全部C#で書かれたフリーのゲームエンジンが必要
.Net/XNA/WindowsようはいくつかあるけどPSSで動くように移植するのは手間か?
どうせなら俺達で1から作らないか! Unityみたいなの!!

0822名前は開発中のものです。2012/03/02(金) 08:19:42.66ID:cyOaKk/w
>>820
sdk内に3D物理関係の機能が無い。
こんなんマネージコードで実装して実用レベルになるんだろうか。
0823名前は開発中のものです。2012/03/02(金) 08:53:54.73ID:CmQt3f/n
ならないんじゃね、と思うがよくわからん
NVIDIAも絡んでるみたいだし、そのうちPhysiXが使えるようになると期待
PSSがこの先生きのこるには
0824名前は開発中のものです。2012/03/02(金) 11:44:15.63ID:YYwIDnHv
至れり尽くせりにするとアマチュアとの差がなくなるからパフォーマンスが出ないように
0825名前は開発中のものです。2012/03/03(土) 11:22:52.95ID:OcHynySh
クタたんちーーーっす
まともなシステムを提供できないハード屋の言い訳だったよな結局
0826名前は開発中のものです。2012/04/24(火) 12:23:16.39ID:CGjbqOQ2
シェーダーで使うパラメーターって
直接Uniform変数としてセットするか
一回シーングラフの要素にしてからUniform変数にセットするのか
どちらでしょうか。具体的には
(1)SetUniform("DiffuseColor", 0xff7c7c7c)みたいな形か
Materil.DiffuseColorみたいなクラスをシーングラフに作って
(2)BindUniform(Material, "DiffuseColor");
みたいな形でしょうか
0827名前は開発中のものです。2012/04/26(木) 23:26:21.89ID:A2k6P93r
>>826
何の話か全くわからん。
08288262012/04/27(金) 02:00:43.59ID:s88IsWZj
わかりにくくてすみません
ある描画ライブラリの仕様が(1)のSetUniform()形式です
シーングラフのオブジェクトのパラメーターを自分でGet()してSet()してね毎ターン、
というスタンスなのですが、どうもこれが気に入らない。
エンジンの人間ではなくゲーム本体を作っている人間が
毎フレームシェーダーに送る定数をGet()してSet()しなければならないのがまずおかしい。
シーンの描画は最終的には
Graphics3D.Render (scene);
のように1行で描画できるべきで、シーンの構築が不完全と言わざるを得ない。

08298262012/04/27(金) 02:07:30.65ID:s88IsWZj
具体的には、
1) シーンのノードは自由に継承してユーザー独自のノードを作れる
2) そのパラメーターの名前は自由に決められる
3) そのパラメーターをシェーダーに送るように設定できる(bind)
4) それらのパラメーターをシーン全体で一発更新できる(refresh)
という仕様に変更しようと思うのですが、元の仕様とは大分変えないと実装できなくて
世の中の人間はもしかして元の仕様のほうがいいのか、私の考えが間違えているのかとか
いろいろ悩んでます。
やっぱりシーンの構築が終わったらRender(scene)一発で描画できたほうがいいですよね?
0830名前は開発中のものです。2012/05/08(火) 16:37:47.58ID:ZnS759Md
過疎スレですが質問させて下さい
シャドーマップを作る時のZレンダリングのパスでは
設定されているシェーダーではなく共通のシャドーマップ生成シェーダーを使うと思うのですが、
これは例えばMeshオブジェクトには複数のシェーダーをセットしてパスによって切り替えるのでしょうか
それとも設定されたシェーダーは無視して強制的にこのシェーダーを使って描画しろみたいな仕組みがあるのでしょうか





0831名前は開発中のものです。2012/05/08(火) 16:47:49.27ID:t0hk3c7e
SDL1.3っていつ出す予定なんだろ
0832名前は開発中のものです。2012/05/11(金) 23:39:09.14ID:suo5RzJ8
SFMLに移った方が良いかもね
0833名前は開発中のものです。2012/05/12(土) 06:04:11.95ID:j7glUpjZ
SDL1.3からライセンス変わるのか
0834名前は開発中のものです。2012/05/12(土) 11:15:18.30ID:dh+2Cdpr
>>832でSFMLってのを初めて知った。
0835名前は開発中のものです。2012/05/12(土) 15:46:01.79ID:t1/k5I6d
そんな事より>>830を誰か頼む
一応今の予定では強制シェーダー描画モードを搭載する予定だ
0836名前は開発中のものです。2012/05/27(日) 18:59:39.99ID:Y4NWpX9P
関連スレのタスクシステム総合スレが死んだな...
http://logsoku.com/thread/toro.2ch.net/gamedev/1285930493/
0837名前は開発中のものです。2012/05/28(月) 00:56:51.34ID:u1bjFmUz
ここも過疎スレ
誰かゲームエンジン作れよう
0838名前は開発中のものです。2012/05/31(木) 16:06:02.52ID:pvRLoXCp
タスクシステムが逝ったか・・・。
まあ、ゲーム製作スレ四天王の中でも最弱な面汚しだからな!
0839名前は開発中のものです。2012/05/31(木) 16:17:08.24ID:qv7/wZ3v
残ってる四天王教えてくれ
0840名前は開発中のものです。2012/05/31(木) 22:53:49.74ID:acleENic
最強

   __(^^) <ペイピッポォ
  /__ \ 
  | |   |  |
  (_) (__)
0841名前は開発中のものです。2012/06/01(金) 09:40:35.93ID:HPWeBJvF
エターナル4天王

・ゲームエンジン総合
・タスクシステム総合
・Unity総合
・ゲーム制作メンバー募集
0842名前は開発中のものです。2012/06/08(金) 18:09:45.18ID:BfK68cYV
>>837
エンジンなら腐るほどあるだろうに
UnityみたいなエンジンならUnityで十分

既成概念を超えるアイデアがない限り無駄
0843名前は開発中のものです。2012/06/08(金) 19:28:08.54ID:IjypruKw
夢がないね
0844名前は開発中のものです。2012/06/08(金) 19:44:30.73ID:Sx3NhmAP
先の無い夢に人生を賭ける馬鹿は死ぬ
0845名前は開発中のものです。2012/06/08(金) 22:12:20.58ID:FXgS0hSf
いろいろググって廃れたフォーラム覗いたときに
トピックの返信が一桁、二桁だらけなのを見ると悲しくなるな
やっぱりある程度のユーザー数がないとモチベが切れちゃうんだろうね
0846名前は開発中のものです。2012/06/11(月) 10:17:08.48ID:mg7RVjtw
エンジンよりフレームワーク書いたほうがいい
実装は既存のエンジンで
0847名前は開発中のものです。2012/06/11(月) 16:41:14.83ID:QQ2wAZcB
グダグダ言うよりまず物を作れとあれほど言ってるのに・・・
0848名前は開発中のものです。2012/06/14(木) 15:09:50.58ID:P1eAlaUs
Ogre3DとIrrlichtとOpenScenGraphを調べたんだけど、どれも酷いね
有名なライブラリだから期待してたんだけど使い物にならない
Ogre3Dはシェーダー周りが独特で見るも無残なできだし、
Irrlichtはまだましだが目が潰れるぐらい汚らしい
この2つは論外。OpenSceneGraphはかろうじて合格
それでも固定シェーダー時代の名残なのかシェーダー時代のエンジンとしては使えないだろう

結論は俺が作ったほうがまし
0849名前は開発中のものです。2012/06/14(木) 16:03:23.05ID:rpEq0sqK
早く作ってオープンソースで公開してね^^
0850 ◆qSKP3eYtY6 2012/06/26(火) 21:59:31.92ID:mR6HJejQ
よーし、パパゲームエンジン作っちゃうぞー

C#, .Net, OpenGL環境(だけどPSMとかに移植可)
シーングラフ、アニメーション、シェーダー、スケレタルアニメーション、コリジョン検出など
今日からここが俺の日記帳だ!
0851名前は開発中のものです。2012/06/27(水) 09:58:10.93ID:U29IMiHf
やったー!
0852 ◆qSKP3eYtY6 2012/06/28(木) 16:15:23.72ID:WtTC5o4X
シーングラフは「ノード ー コンポーネント」モデルとする
造語だけどUnityみたいな形といえばわかりやすい
3D空間上の1点が1ノードで、そこに色々な機能を持ったコンポーネントをアタッチして使うのが基本

Predicateで指定した条件が一致するノードを探すFind, FindAllと
指定のコンポーネント型を探すFind<TComp>, FindAll<TComp>がある
子ノードをたどってActionを実行するTakeもある
あとはSendMessage()で関数名(string)を指定してコンポーネントの関数を呼び出せる

ざっくりとガワだけ書くとこんな感じ
http://dl.dropbox.com/u/32901747/DDD/DDD-20120628.chm
(セキュリティ警告を外さないと見られないかも)


0853 ◆qSKP3eYtY6 2012/06/29(金) 15:09:28.16ID: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>>だが特に気にする必要はない

0854 ◆qSKP3eYtY6 2012/07/01(日) 20:59:13.49ID:KktJ7lkD
アニメーションは「値型でSetter/Getterを持ったプロパティ」なら何でもセットできるようにする
この辺はC#の機能をフルに使っている
クラス的にはKeyframeSequence<T>とAnimationTrackが存在し、
複数のAnimationTrackをAnimationClipが管理する(再生速度などはこのクラス)
歩くとか走るはこのClipが相当する
Clipを差し替える時は特に仕組みを用意してないが(全てのTrackを手動で切り離すことになる)
この辺は考慮中。あるいは
node.AddAnimationTrack()ではなくnode.AddAnimationClip()でクリップ単位でアニメーションをセットしたほうがいいのかもしれない。



0855 ◆qSKP3eYtY6 2012/07/02(月) 17:22:25.28ID:PZRbc+vH
MathパッケージにはVector2,3,4, Matrix3x3, 4x4, Quaternionが含まれる
すべてC#の構造体を使って実装される
これらの構造体はプロパティとしてアニメーションを付加されたりUniform変数としてシェーダーにエクスポートされる
特徴は次の2つ
(1) 構造体は不変量とする
 どうしようかずいぶん迷ったがこれらの構造体は不変量、つまりnewした後は一切変更できない事にした。
 不便そうだが直感に反してそうでもない。いちいち計算のたびに新しい構造体を作るがコストは安い。
(2) 必ずプロパティ(ComponentCount)と添え字演算子([])を実装する。これはエクスポートする時に必要となる

Vector2,3,4は1つにまとめてもいいが、今回はタイプセーフを優先して別クラス
座標系はOpenGLと同じ右手系でV=MVの形.

 

0856 ◆qSKP3eYtY6 2012/07/03(火) 19:49:13.53ID:WXHikQCo
>>853
node.AddAniamationTrack()ではなくnode.AddAnimationClip()に変更
クリップ単位でセットすることにした。理由はその方が簡単
開発マシンをSSDにしてたら一日消えたんだぜ。まじ呪うMicrosoft
0857 ◆qSKP3eYtY6 2012/07/04(水) 10:25:33.70ID:ZninQWD9
Uniform変数の実装について。
今現在よくある実装はSahderProgramやVertexBufferみたいなクラスに
いきなり値をSetUniform("Alpha", 1.0f)みたいに突っ込むがこれは良くない習慣だと思っている
(1) この関数を呼んだ時に値がセットされるので毎フレームOnDraw()の中で呼ぶ必要がある
(2) 毎回呼ぶので依存関係がわかりにくい。

DDDでは「データ構造と操作の分離」を基本思想としているので、以下のように実装しようと思う
ShaderArrayクラス。使用するUniform変数の情報を保存するコンテナクラス
AddUniform(name, object, property)でどのオブジェクトのどのプロパティをどの変数でエクスポートするかセットする
この段階ではまだ値はセットされず、後のRender()関数内部でこの情報に従って値がセットされる(データ構造と操作の分離)

※ 型とサイズ(vec2,3,4)はシェーダーをコンパイルした時に判定するのでここでは必要ない
※ Uniform変数の配列は当面なし。どう実装すべきか良いアイディアがない





0858 ◆qSKP3eYtY6 2012/07/04(水) 14:35:40.37ID:ZninQWD9
ShaderProgramについて
シェーダーはShaderProgram1つで全て賄う(FragShader, VertShaderはなし)
クラス名を可能な限り少なくするのがDDDの思想
DDDはHWに依存しないのでコンパイルとリンクはRender()まで行われない(というかできない)
定義されたAttribute変数とUniform変数を列挙する列挙しがある。型はIEnumerable<ShaderVariable>.
ShaderVariableは>>857>>858の両方で使用する
これもやはり「クラス数を可能な限り少なくする」ため

シェーダーで定義された変数名と型を調べてそれが>>857でセットした一覧にあればそのオブジェクトとプロパティから値を拾ってきてエクスポートする事になる




0859名前は開発中のものです。2012/07/04(水) 14:40:27.10ID:ZninQWD9
シェーダーにエクスポート出来る変数はIExportableインターフェースとして明確化した
ComponentCountとValueTypeを返す添字演算子を持つ
よく考えるとIExportableはIAnimatableでもあるわけだが・・・
0860 ◆qSKP3eYtY6 2012/07/04(水) 16:27:05.51ID: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クラスを使用する。




0861 ◆qSKP3eYtY6 2012/07/05(木) 14:00:11.24ID:flNlSeDp
VertexBufferとIndexBuffer
バーテックス・バッファーはAttribute変数として送られる頂点ごとのデータのバッファー(x,y,z, 法線, テクスチャー座標など)
インデックス・バッファーはglDrawElement()で使うインデックス。
この辺のデータ構造はライブラリによって異なるが、どの方式が有利とかは多分無い
DDDではMeshの下にVertexBufferx1とIndexBufferxnを持つ
生の頂点データはVertexArray<T>クラスが保存する
これはそのままglBufferData()でGPUに送り込める形そのもの
操作は非ジェネリックな同名のVertexArrayを通して行う
IndexBufferは本当にintの配列をどかんと持っているだけ
やはりそのままglBufferData()でGPUに転送する


0862名前は開発中のものです。2012/07/05(木) 14:05:32.16ID:flNlSeDp
描画できるプリミティブについて

トライアングル、ライン、ポイントスプライトの「リスト」形式のみ「ストリップ」には対応しない
これは現在のGPUではリスト形式を使ったほうが高速で、あえてストリップ形式を使う理由がないため
シンプルである事を価値とするので複数の手段は提供したくない
インデックスを指定する時にリスト形式だと冗長なのでストリップ形式でも指定できるようにしようかとも考えたが
上記の理由でバッサリ削除
この辺は異論も出そうだが実際に作っている人の裁量の範囲ないということで
0863名前は開発中のものです。2012/07/05(木) 14:08:25.82ID:cRpEW0yx
あれ
インデックスは32bit限定?
ushort版はなし??
0864名前は開発中のものです。2012/07/05(木) 16:20:07.98ID:2Z2qwIZw
これってこの部分を実装しましたという報告なのか、これからやりますなのか
0865 ◆qSKP3eYtY6 2012/07/05(木) 16:37:17.91ID:flNlSeDp
>>862
intあればいいと思ったけど対称性悪いからIndexBuffer<T>にしといた
今の所ジェネリックなのはVertexArray<T>とIndexBuffer<T>とKeyframeSequence<T>
全部同名の非ジェネリック版ばあって操作はそちらから行う


0866 ◆qSKP3eYtY6 2012/07/05(木) 16:40:06.48ID:flNlSeDp
>>864
今の所ガワ(API)だけ実装してある。中身はすっからかん
必要なフィールドとかは置いてあるので実装はそんなに苦労しないはず
それでも月単位で必要だけど

0867 ◆qSKP3eYtY6 2012/07/05(木) 16:49:34.85ID: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)を置く

0868 ◆qSKP3eYtY6 2012/07/05(木) 17:22:59.32ID:flNlSeDp
テクスチャーについて1つ注意点がある
通常CPU側にはTexture2Dクラスがあって、シェーダー側からアクセスする時は「テクスチャーユニット番号」を使用する
何番のユニットにロードされたかはTexuture2Dクラスの知る所ではなく、そのプロパティとしてテクスチャー番号を取得できない
(1つのTexuture2Dが別のユニットにセットされる事はあり得る)
従ってこれはAppearanceクラスの仕事(プロパティ)になる。
が、これは明らかにおかしくて本来はTexuture2Dクラスをシェーダー側のテクスチャー変数何とかにバインドするのが自然である
(ただしそれは上記の理由により不可能)

ではどうするか?
Texture2Dは同じ番号のユニットにロードされなければならないという制限を科す。
この制限のもとでTexture2D.TexturUnitでユニット番号が取れるようにすれば、
シェーダー側にユニット番号を自然な形でエクスポートする事ができる


0869名前は開発中のものです。2012/07/05(木) 19:13:16.47ID:gC4tIXCC
svnかgitを使って公開して欲しいなぁ
0870 ◆qSKP3eYtY6 2012/07/06(金) 14:05:57.42ID:FBQYllXg
>>869
してる。けどまだ見る価値はない
0871名前は開発中のものです。2012/07/06(金) 14:11:27.57ID:FBQYllXg
BoundingVolume(BV)

BVは球かボックスで、カリング、ピッキング、LODで使われる。
コリジョン検出は別の専用のCollisionVolumeを用意する
たぶん珍しい形だと思うけどBVは独立したクラスにせずNodeの単なるパラメーターとする
BVはユーザー定義のBVと、シーンをフリーズ(後述)した際に自動で作られるBV階層のBVに分かれる




0872 ◆qSKP3eYtY6 2012/07/06(金) 14:17:53.88ID: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構文はデータベースをモデルにしているので全件検索になってしまう
0873 ◆qSKP3eYtY6 2012/07/06(金) 14:28:22.79ID: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階層を利用するのでシーンをフリーズしないと使えないけど速い
0874名前は開発中のものです。2012/07/06(金) 14:40:43.77ID:FBQYllXg
シーンをトラバースしてある処理行うメソッドはいくつか用意する予定(詳細は決めてない)

IEnumerable<Node> Search (Predicate<Node> func)
 => 指定の述語(Predicate)に一致するノードを列挙する

void Take (Action<Node> func)
 => 全ノードに対してActionを実行する

void Take (Func<Node, bool> func)
 => 全ノードに対してtrueを返す限りFuncを実行する

これらのジェネリックデリゲートを使った構文はシーンのトラバース以外にも使用する予定
処理結果を受け取りたいはクロージャーが使える(ラムダ式からラムダ式を呼び出す関数のローカル変数にアクセスできる)ので
ほとんど全ての処理が記述できる

0875 ◆qSKP3eYtY6 2012/07/09(月) 10:44:15.40ID:HsBojE2t
シーンのフリーズとOnUpdate()

昨日までうっかり勘違いしていたがシーンのノードのOnUpdate()の呼び出しは
シーンを上からトラバースするのではなくPriorityの順。
従ってOnUpdate()は再帰関数ではなく単発の普通の関数
コンポーネントの呼び出しは入れた順

順不同で呼び出されるのでモデルtoワールド行列とかキャッシュするためにもシーンのフリーズが必要
どのみちコリジョン(k-DOP)のワールド座標でパラメーターのキャッシュにも必要
フリーズしたら変更を伴う操作は一切受け付けなくなる

0876 ◆qSKP3eYtY6 2012/07/09(月) 13:29:08.22ID:HsBojE2t
ライト

固定時代のライトは独立したノードだったが、シェーダー時代ではライトは単なるUniform変数の1つに過ぎない
さらにDeffered Shadingにおいてはライトはメッシュと同様にGPUに頂点データを送って
(計算済みのBGufferからパラメーターを拾ってきて)レンダリングするだけの存在である
従ってDDDにおいてLightは本当に単なるMeshの別名である
using Light = Mesh;
マテリアルは専用のLightMaterialが用意されていてシェーダーにエクスポートするColorやAttenuationはここで定義されている。



0877 ◆qSKP3eYtY6 2012/07/10(火) 10:10:18.98ID: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で前フレームから現在のフレームまでに起こるイベントを発火させる


0878 ◆qSKP3eYtY6 2012/07/10(火) 11:12:38.45ID:0DNkleuf
SkinnedMeshの実装

スケレタルアニメーション用にボーンを仕込んだメッシュの実装
このクラスのやるべき事は実は多くない。ボーン行列の計算とGPUへの転送だけである
ボーンはただのNodeで表し特別なクラスは作らない。
SetBones(Node[])したタイミングでボーン行列(=バインドポーズの逆行列)を計算し
プロパティIEnumerable<Matrix4x4> BoneMatricesで取得する
ボーンインデックスはこのNode[]のインデックスそのもの。
このプロパティは配列型で定義されたUniform変数に送られる
インデックスとウェイトはAttribute変数として頂点単位で送られる

ボーンの変形は「トランスフォームステージ」でユーザーがシェーダーの中で行い結果は一回書き戻す予定
OpenGLのTransofrm Feedback Buffer機能を使う予定だが、まだ詳細を詰め切れていない
0879名前は開発中のものです。2012/07/10(火) 11:23:23.33ID:0DNkleuf
配列型のプロパティ

BoneMatricesプロパティは意外とこれが熟考が必要で、

(1) 配列型
 IEnumerable<T>のプロパティを配列型とみなす
(2) アニメーション可能
 アニメーショントラックは同名のトラックをクリップにAddTracks()で一括登録する
 アニメーション対象がIEnumerable<T>を実装したプロパティの場合は同名のトラックが連続して存在するものと期待して長さ分適応する
(2) GPUにエクスポート可能
 シェーダーが配列型のUniform変数を要求している時はそのまま列挙してセットすればOK。

でいけるはず。基本的には配列型のプロパティは例外。
多分ここにしか出てこないはず・・・

0880 ◆qSKP3eYtY6 2012/07/10(火) 14:29:56.51ID:0DNkleuf
1つ迷っているのがトランスフォームシェーダーをどうやって供給すればいいかという事
今考えているのはレンダリング時に強制的にシェーダーを切り替えて実行する案
トランスフォームシェーダーは全メッシュで共通なのでこれで十分だと思われる
シルエットで描画したいとか一時的にシェーダー(というかアピアランス)を切り替えて描画するのは理にかなっていると思う
この辺実はあまり調査して無くて他のゲームエンジンがどうやってるのかよく知らね
0881 ◆qSKP3eYtY6 2012/07/10(火) 15:34:37.39ID:0DNkleuf
MorphMesh
モーフィングは特に難しい処理はない。ベースのVertexBufferと同じ型のVertexBuuferをウェイトをかけて足すだけ
すべてCPU処理。ApplyMorphing()でベースのVertexBufferは上書きされるがデータ自体は置いておく必要がある(nullでは駄目)


0882 ◆qSKP3eYtY6 2012/07/11(水) 10:01:05.26ID: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).



0883 ◆qSKP3eYtY6 2012/07/11(水) 10:07:51.04ID:75j/QepR
Physics3D
2つある(.Net環境で定義されていない)プラットフォーム依存クラスの1つ。もう1つはGraphics3D
コリジョンの判定はPhysics3D.Collide(world)で行う。
これがWolrd.Collide()でないのは「シーンはポータブル」という思想を反映している
シーンにプラットフォーム依存の関数が入り込んではいけない
一応Physics3Dは物理エンジンを使用する為の接続口として考えているが、
この辺はまったく調べてないので実はわからん。
当面コリジョン衝突の判定だけ



0884 ◆qSKP3eYtY6 2012/07/11(水) 10:13:48.96ID:75j/QepR
BoundingVolume
あとバウンディンブボリューム(BV)も同様にして実装される
やはりコンポーネントの一種。BoxとSphere(and/or)が設定できる
BVはカリング、交差判定(ピッキング)、LODで使用される
コリジョンボリューム(CV)とは何の関係もない

このあたりのボリュームは可視化できるようにして欲しいなあ
という要望は当然あると思うが現状で特に考えてない。




0885 ◆qSKP3eYtY6 2012/07/11(水) 12:59:47.92ID: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つの子ノードを合成すべきかとも考えたが、
使わないだろうと判断して見送った。いきなり切り替わる
0886 ◆qSKP3eYtY6 2012/07/12(木) 11:26:44.66ID:4kdlcnsW
ノードの継承をObject3D - Attachable - Nodeに再編成
今ひとつゴチャゴチャしていたので3階層に再編成した。

[1] Object3D
 空間上の1点をあらわし座標変換を担当する抽象クラス。TRSMを保存
 
[2] Attachable
 1.にコンポーネントをアタッチできるようにした物。ノード単体処理もここ

[3] Node
 2.に親子階層をつけシーングラフを構成できるようにしたもの。再帰的な処理はここ

これですっきり。



0887 ◆qSKP3eYtY6 2012/07/13(金) 13:21:25.35ID:XkwS8Q4i
Graphics3D

デバイスクラス。.Net環境の外の部分
Targetプロパティ:xN RenderToTextureのターゲット最大4枚
〜Enabledプロパティ:機能の有効無効の制御
Selectionプロパティ:delegateでWorldからノードを取り出すLINQ構文の受け取りを想定
RenderPassイベント:delegateでレンダリングパスを記述する
Render()関数:RenderPassで指定したパスを実行する

最大の特徴は「不透明物体のみ取り出してzでソートしてカメラに近い方から描画」という処理を
後でエンジンの外からラムダ式を使って記述し(Selectionプロパティ)、RenderPassイベントに追加して
Render()関数でまとめて実行する事
従来型の記述よりだいぶすっきりと書けてると思う(たぶん)


0888名前は開発中のものです。2012/07/13(金) 13:35:11.81ID:XkwS8Q4i
Mesh再考
どう考えてもこのままだとSkinnedMeshが実装できそうにないので再考した

(1) Mesh :静的メッシュ
(2) TransformMesh :TransformFeedbackシェーダーを含むメッシュ
(3) SkinnedMesh :その中でもボーンによる変形を行うトランスフォームメッシュ
(4) MorphMesh :CPUで変形するモーフ

スキンの変形にTranformFeedback(TFB)が必要で
将来的にSoftBodyとかパーティクルも実装可能な汎用クラスを考えてTranformMeshクラスを分離独立


0889名前は開発中のものです。2012/07/13(金) 19:34:55.20ID: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リソースを開放すれば完璧


0890名前は開発中のものです。2012/07/17(火) 13:21:14.74ID:ZJ+ZLX+A
ひと通りAPIは決めたので月末までお休み
Doxygenでコメント埋めて抜けてるAPIを精査する
別段面白い作業ではないので一人でひっそりと。
0891 ◆qSKP3eYtY6 2012/07/31(火) 14:17:03.52ID:eTCwGkpq
簡単に埋めてみた
http://dl.dropbox.com/u/32901747/DDD/DokiDokiDynamo-2012731.chm

APIだけ見てもわけわからんと思うが・・・チュートリアルが必要だがそのうち何とかしよう。
一応ページ差し込みができるのは確認した(けどXMLで書かないといけないから書きにくい)
しかし時間かかるねえ・・・
エラー条件等も含めてがっつり書いておきたかったんだけどなかなかどうして進まない

0892 ◆qSKP3eYtY6 2012/08/02(木) 10:02:54.60ID:u7Ky33VI
実装するべ。コードより先にドキュメントを完成させておきたかったけど
これ以上細部を詰める必要はほとんどない(今の仕様でまず問題ないと考えている)
全部実装するのは年内一杯ぐらいかかると思うけど
とりあえず今月はシーングラフ周りから。というわけでまた月末までお休み




0893名前は開発中のものです。2012/08/08(水) 14:58:01.15ID: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キャッシュ用として使用、フルカラーは圧縮率を犠牲にすれば展開はもっと速くなる
・格ゲーでよくあるタイムストップ演出のためシーンマネージャ毎にタイムストップ可能にし違和感のないストップ解除も可能にした
・某エンジンで実装されてるエフェクトをパクる許可をもらったので盛り込んだ(推測で真似して実装しようとして挫折、数学苦手だ)
細々とした改造は他にも色々あるけど忘れた
0894名前は開発中のものです。2012/08/08(水) 23:35:12.35ID:TqStE+nz
がんばれー
0895名前は開発中のものです。2012/08/09(木) 02:01:20.69ID:TEaUWCM1
http://www.twin-tail.jp/
↑どこ行ったん?
0896名前は開発中のものです。2012/08/09(木) 04:38:13.54ID:3/Xihug4
>>893
お疲れ様です
気長にまったり頑張ってください
0897名前は開発中のものです。2012/08/09(木) 09:50:32.27ID:6TOyobo6
>>895
あ、そこ世話になったのに消えちゃったのか。
0898名前は開発中のものです。2012/08/27(月) 16:10:01.26ID:NCPCFhPq
◆qSKP3eYtY6のひとブログやってる?
ブログ色々めぐってたら偶然それっぽいの見つけた。tu*daさん?
0899名前は開発中のものです。2012/08/29(水) 17:17:49.00ID:81OpSOeF
ログ読んでたらなぜか既にDDD6のひとの名前がでてるw
それに叩かれてるけどログにある神奈川工科大のひとって
Unity for MMDのひとじゃないだろうか。
単なる名無しさんよりは名前出してる人のほうが成果だすのかも。
でも名無しでも>>893さんみたいに頑張ってるひといるし僕もがんばってみよ。
0900 ◆qSKP3eYtY6 2012/08/31(金) 23:09:21.37ID:xFJnGOSk
今実装してるけど進まんねー
まあのんびりいこう
来月には三角形ぐらい出したい

0901名前は開発中のものです。2012/09/01(土) 10:16:37.76ID:xmU3R1N+
>>900
つくってるのは趣味?
Unity使わないの?
0902名前は開発中のものです。2012/09/13(木) 00:56:24.58ID:sGA/0Nry
米GarageGamesがゲームエンジン「Torque 3D」をオープンソースに
http://sourceforge.jp/magazine/12/09/11/2039230
http://www.garagegames.com/
0903名前は開発中のものです。2012/09/13(木) 08:30:02.26ID:58G1gAN7
ほーMITライセンスなんだ
思い切ったね
0904名前は開発中のものです。2012/09/13(木) 11:57:11.78ID:LHU8GMTz
Torqueは結構迷走してるけど、会社自体は大丈夫なのかな。
でもMITライセンスは大歓迎だ。
0905名前は開発中のものです。2012/09/13(木) 12:00:35.58ID:oVqq+2hk
とーきゅーって読むのかな
0906名前は開発中のものです。2012/09/13(木) 12:15:21.64ID:seBnVBvk
トルク
0907名前は開発中のものです。2012/09/13(木) 14:51:06.70ID:ckaemq4+
もう開発しないよ宣言な可能性
0908名前は開発中のものです。2012/09/13(木) 15:53:04.73ID:seBnVBvk
>>907
そうだよ?
「UnityとかUDKとかVisionとかNeoAxisとか出てPCでもスマホでも新規客取れない状況だわ。
ならもういっそTorque使ってゲームを作った方が会社としてマシだわ。
これまで支えて来てくれた既存ユーザーと業界のために現行版のソースとバイナリはそのまま公開するわ」
っていう趣旨
0909DDD ◆qSKP3eYtY6 2012/09/28(金) 14:39:56.27ID:Ao+KlUIY
骨組み部分は動くようになったぞ

コア部分(Unityで言えばGUIでポコポコ作る部分)
http://codepad.org/n2bhJENS

スクリプト部分(Unityで言えばユーザー定義のBehaviorスクリプト)
http://codepad.org/FJbjRKs1

動いているところ
http://v.youku.com/v_show/id_XNDU1Mjc1MTE2.html


ここまではこれ以上ないぐらいシンプルに実装できていると思う
来月はアニメーションとスキニング
0910名前は開発中のものです。2012/09/28(金) 14:43:11.02ID:/GjltfpL
>>909
すげぇ
OpenGL3以降ベースのゲームエンジンって少ないから頑張って欲しい
0911名前は開発中のものです。2012/09/28(金) 14:53:23.12ID:acwnFDZO
中華か…
0912名前は開発中のものです。2012/09/28(金) 17:24:24.69ID:PqQHbJ7G
がんばってくれ。
いいものであるなら金払ってもいいから。
0913名前は開発中のものです。2012/10/03(水) 13:54:44.18ID:41pE2PfQ
〜無双、なんて(ry
0914名前は開発中のものです。2012/10/07(日) 03:33:29.31ID:waNmdRMa
一人称カメラの動きを細かく設定できるエンジンって何があるか知らない?
レス数が900を超えています。1000を超えると表示できなくなるよ。