ここ最近は特に忙しかったわけでもないのに何にもしてませんでした。
2012年は最低月に一枚は絵を描こうと決めていたので
久しぶりのお絵かき更新です。でもエロエロじゃないです。
2012/02/03(金) 01:10:23 |
絵 picture
| トラックバック:0
| コメント:2
年末年始は PixelBender3D の代わりになるものを探してました。
条件として
・高級言語
・すぐに結果が確認できること
高級言語から直接 AGAL 吐けるツールは残念ながら見当たりませんでした。
なので HLSL や GLSL 周りを調べてみると
・FX Composer
・Render Monkey
の 2 つがすぐに候補として出てきたので、
このうち FX Composer 2.5 を使って HLSL のアセンブラコードの AGAL 変換を試してました。
お正月に HLSL のリファレンスとにらめっこして
ようやくサンプルのフォンシェーディングと、ベルベットを
FX Composer の出力したアセンブラに手を入れずそのまま変換できるようになりました。
まだこの 2 つしか試してないんで Version 0.3 ぐらいです。
・Sample の HLSL アセンブラ選択
・"Convert" で AGAL に変換
・"Compile" で AGAL を Bytecode に変換。同時にコメントのレジスタ情報パース
HLSL 貼らずにそのまま AGAL のコーディングも一応できます。
画像クリックでテスト FLASH
実行には FlashPlayer11 以上が必要です )
adobe から FlashPlayer ダウンロード まだ問題山積みですが、少し UI いじったら FX Composer についても合わせて別記事書きたいです。
2012/01/07(土) 13:47:33 |
ActionScript
| トラックバック:0
| コメント:0
ちょっと油断していたらあっという間に 7 日になってました。恐ろしい。
去年の反省をしつつ、今年の目標を。
-------------------------------------------------------------------------
・絵
去年の目標だった同人再開は駄目でした。今年こそ。
-------------------------------------------------------------------------
・ POP-CAKE! プラグイン
久しぶりのプログラムが楽しかったです。
ただ途中からプラグインを作ること自体が目的になっちゃって、
自分でも使いそうに無いもの作ってたのはあまり良く無かったです。
もし今年新バージョンが出たらまた触ってみたいです。
// 公式サイトを見たらインポート・エクスポートプラグインが出来てるらしいです。
-------------------------------------------------------------------------
・ ActionScript
去年終盤のメイン更新ネタでした。 ActionScript 楽しいです。
今年は Away3D メインで、 Proscenium がバージョンアップしたら平行して触っていく感じにしたいです。
Unity は始める前に試用期限来ちゃいそう。
-------------------------------------------------------------------------
・3D
Blender をいいかげん倒さなければ・・・
////////////////////////////////////////////////////////////////////////
なにはともあれ今年もよろしくお願いします。
2012/01/07(土) 13:39:59 |
日記 diary
| トラックバック:0
| コメント:0
vertexBuffer.uploadFromVector()
より
vertexBuffer.uploadFromByteArray()
の方が速いそうです。
自分は uploadFromByteArray() の存在自体知りませんでした・・・やだ、恥ずかしい。
////////////////////////////////////////////////////////////////////////
知ったのはこちら、
JacksonDunstanさん Stage3D Upload Speed Tester http://jacksondunstan.com/articles/1617 Texture, VertexBuffer3D, IndexBuffer3D それぞれについて各種パターンでアップロード速度の比較を行っています。
"Try out the test" クリックでテストが出来ます。(ソースコードもあります)
上記サイトコメント欄で色々な方の結果が見れます
そして自分もテスト。 環境は CPU Intel Core2Duo 2.33 GPU ATI Radeon HD 2600 PRO です。
ドライバ テスト種類 掛かった時間 1 秒辺りのバイト数 DirectX9 (Direct blitting) Texture from BitmapData w/o alpha 10 1677721.60 DirectX9 (Direct blitting) Texture from BitmapData w/ alpha 13 1290555.08 DirectX9 (Direct blitting) Texture from ByteArray 12 1398101.33 DirectX9 (Direct blitting) VertexBuffer from Vector 15 1118464.00 DirectX9 (Direct blitting) VertexBuffer from ByteArray 11 1525178.18 DirectX9 (Direct blitting) IndexBuffer from Vector 1 2097148.00 DirectX9 (Direct blitting) IndexBuffer from ByteArray 1 2097148.00 Software (Direct blitting) Texture from BitmapData w/o alpha 16 1048576.00 Software (Direct blitting) Texture from BitmapData w/ alpha 11 1525201.45 Software (Direct blitting) Texture from ByteArray 16 1048576.00 Software (Direct blitting) VertexBuffer from Vector 28 599177.14 Software (Direct blitting) VertexBuffer from ByteArray 10 1677696.00 Software (Direct blitting) IndexBuffer from Vector 3 699049.33 Software (Direct blitting) IndexBuffer from ByteArray 1 2097148.00
特に VertexBuffer について知りたいので更に何度かテストして平均取ってみました。
(結構ブレ幅あります。特に Software )
結果は
DirectX9 ByteArrayの方が 約 26% 速い
Software ByteArrayの方が 約 45% 速い
となりました。
他の方の結果に比べたらちょっと地味ですが、それでもかなり速度差があります。
// Mac + OPENGL の速度差が凄い・・・
なので、頻繁に頂点バッファアップロードするなら ByteArray がいいようです。
// そこから更に頂点バッファをダブルバッファリングしてみたいです。
-----------------------------------------------------------------------------
追記:2011/12/28
記事前半部分について
頂点バッファを毎フレーム更新するとなると
結局 byte.writeFloat() の書込みコストがあるので
更新するのに uploadFromByteArray() を使うのは頂点数が増えるほど不利になりました。
// guest さんコメントありがとうございます。
テストするまでも無さそうですが一応簡単なコードで確認しておきました。
10000 頂点データの入ってる Vector.
と ByteArray を用意 ・Vector 全データ書き換えて uploadFromVector() 、これを n ループした経過時間 ・ByteArray 全データ書き換えて( .writeFloat() )uploadFromByteArray()、これを n ループした経過時間 大体二倍の差になりました。 ついでに記事後半部分と合わせたまとめを最後に追記しておきました。 ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////// vertexBuffer.uploadFromByteArray() 知らなかったことで 改めてリファレンス見直してたら他にも知らないことがありました。Context3D setVertexBufferAt http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display3D/Context3D.html#setVertexBufferAt%28%29 setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void 第三引数の format引用: position: x float32 y float32 z float32 color: r unsigned byte g unsigned byte b unsigned byte a unsigned byte color は rgba(32bit) で投げていいんですね。 というよりも何も考えずずっと Vector. の FLOAT_3 でやってました。 //////////////////////////////////////////////////////////////////////// ということで、vertexBuffer.uploadFromByteArray() と BYTES_4 試してみました。 シンプルに頂点情報は座標とカラーのみ 三角形が大きくひとつ描画されるだけで色は暗め。 // vertex // v0 頂点座標 // v1 頂点カラー // vc0 ローカル座標系からスクリーン座標系への変換行列 m44 op, va0, vc0 mov v0, va1 // fragment mov oc v0 --------------------------------------------------------- TypeA 今までのパターンです。 座標も色も同じバッファで全情報 float // vBuf_A[ v0[ float x, float y, float z] , v1[ float r, float g, float b] ][ ... // 1 頂点辺り 32 * 6 = 192 bit // 頂点バッファ生成 vBuf_A = context3D.createVertexBuffer( 3, 6 ); vBuf_A.uploadFromVector( Vector.([ -1.0, -1.0, 0.0, 0.5, 0.0, 0.0 // x, y, z, r, g, b , 0.0, 1.0, 0.0, 0.0, 0.5, 0.0 , 1.0, -1.0, 0.0, 0.0, 0.0, 0.5 ]) , 0 , 3 ); // set v0, v1 context3D.setVertexBufferAt( 0, vBuf_A, 0, Context3DVertexBufferFormat.FLOAT_3 ); context3D.setVertexBufferAt( 1, vBuf_A, 3, Context3DVertexBufferFormat.FLOAT_3 ); 普通です。 --------------------------------------------------------- TypeB 次に、BYTE_4 型使ってみます まずは楽なのでバッファを座標と色で分けたパターン // vBuf_B_pos[ v0[ float x, float y, float z] ][ ... // vBuf_B_col[ v1[ uByte r, uByte g, uByte b, uByte a ] ][ ... // 1 頂点辺り 32 * 3 + 8 * 4 = 128 bit // 頂点バッファ(座標情報)生成 vBuf_B_pos = context3D.createVertexBuffer( 3, 3 ); vBuf_B_pos.uploadFromVector( Vector.([ -1.0, -1.0, 0.0 // x, y, z , 0.0, 1.0, 0.0 , 1.0, -1.0, 0.0 ]) , 0 , 3 ); // 頂点バッファ(色情報)生成 vBuf_B_col = context3D.createVertexBuffer( 3, 1 ); bytes = new ByteArray(); bytes.endian = Endian.LITTLE_ENDIAN; bytes.length = 4 * 3; // r,g,b,a * 3vertex bytes[ 0 ] = 128; bytes[ 1 ] = 0; bytes[ 2 ] = 0; bytes[ 3 ] = 255; bytes[ 4 ] = 0; bytes[ 5 ] = 128; bytes[ 6 ] = 0; bytes[ 7 ] = 255; bytes[ 8 ] = 0; bytes[ 9 ] = 0; bytes[ 10 ] = 128; bytes[ 11 ] = 255; bytes.position = 0; vBuf_B_col.uploadFromByteArray( bytes, 0, 0, 3 ); // set v0, v1 context3D.setVertexBufferAt( 0, vBuf_B_pos, 0, Context3DVertexBufferFormat.FLOAT_3 ); context3D.setVertexBufferAt( 1, vBuf_B_col, 0, Context3DVertexBufferFormat.BYTES_4 ); 表示結果は TypeA と同じでした。(変わったら困るんですが) Context3DVertexBufferFormat.BYTES_4 はシェーダ内で取得される時 0 -> 255 が 0.0 -> 1.0 にちゃんとマッピングされてますね。 ただ、頂点バッファを属性ごとに分けることによって GPU 上で読み取り先が分散されてパフォーマンスが落ちる気がします。 // ByteArray の話とは関係ないんですが // 例えば、動作を CPU で計算するパーティクルや物理演算の時とかに // 頂点バッファを更新する部分(例えば座標)と更新されない部分に分けて // 更新部だけアップロードする方が有利とか無いでしょうか。 // つまり、アップロード時に減るコストと読み取り先分散で増えるコストの比較。 --------------------------------------------------------- TypeC 座標も色も同じバッファ、RGB は unsigned byte // vBuf_C[ v0[ float x, float y, float z] , v1[ uByte r, uByte g, uByte b, uByte a ] ][ ... // 1 頂点辺り 32 * 3 + 8 * 4 = 128 bit // 頂点バッファ生成 vBuf_C = context3D.createVertexBuffer( 3, 4 ); bytes = new ByteArray(); bytes.endian = Endian.LITTLE_ENDIAN; bytes.writeFloat( -1.0 ); bytes.writeFloat( -1.0 ); bytes.writeFloat( 1.0 ); bytes.writeByte( 128 ); bytes.writeByte( 0 ); bytes.writeByte( 0 ); bytes.writeByte( 255 ); bytes.writeFloat( 0.0 ); bytes.writeFloat( 1.0 ); bytes.writeFloat( 0.0 ); bytes.writeByte( 0 ); bytes.writeByte( 128 ); bytes.writeByte( 0 ); bytes.writeByte( 255 ); bytes.writeFloat( 1.0 ); bytes.writeFloat( -1.0 ); bytes.writeFloat( 0.0 ); bytes.writeByte( 0 ); bytes.writeByte( 0 ); bytes.writeByte( 128 ); bytes.writeByte( 255 ); bytes.position = 0; vBuf_C.uploadFromByteArray( bytes, 0, 0, 3 ); // set v0, v1 context3D.setVertexBufferAt( 0, vBuf_C, 0, Context3DVertexBufferFormat.FLOAT_3 ); context3D.setVertexBufferAt( 1, vBuf_C, 3, Context3DVertexBufferFormat.BYTES_4 ); これも表示結果は TypeA と同じでした。大丈夫そうです。 //////////////////////////////////////////////////////////////////////// TypeA/B/C でのパフォーマンステスト パフォーマンス差は頂点シェーダーでの ・1 頂点辺りのデータサイズ ・読み取り先バッファの数 ・0-255 -> 0.0-1.0 なので フラグメントシェーダーには全く仕事させないように描画サイズは極小さく。 // 見えないですが scale( 0.001 ) 倍に縮小してあります Z バッファの負荷も無くすため。false, ALWAYS 1 BUFFER に 10000 三角ポリゴン入れときます。 これを描画時に n 回 drawTriangles() して 10000 * n 三角ポリゴン分の仕事をバーテックスシェーダーにしてもらいます。 ----------------------------------------------------------------------------- テストフラッシュ(Wonderful)http://wonderfl.net/c/1XOr ・ラジオボタンで Type 切替 ・スライダーで描画する三角ポリゴン数増減 適当にスライダーをいじって頂点シェーダーの負荷上げてください。 FPS が 60 をある程度下回ったら、Type を変更して差を確認してください。 ----------------------------------------------------------------------------- 自分の結果はドライバーが DirectX で、 C > A > B でした。 C と A の違いは 1 頂点辺りのデータサイズで、当然小さい C の方が速いですね。 データサイズの小さい B が A に負けてるので、読取先バッファ数が多い事の方が不利のようです。 ただ、やはりフラグメントシェーダーの負荷に比べて頂点シェーダーの負荷は恐ろしく低いです。 少し三角形を大きくするだけでも A/B/C の違いは誤差にしかなりませんでした。 (どれもほぼ同じ FPS になります) なので、 BYTE_4 使うメリットはパフォーマンス的にはあまり無く、 バッファサイズ使用量を少し抑えられる程度という気がします。 ----------------------------------------------------------------------------- 追記:2011/12/28 まとめ BYTE_4 も uploadFromByteArray() はあまり使い道が無さそうです。 頻繁にアップロードしない(初期化時の一度程度とか)バッファで BYTE_4 混在でデータサイズを小さくした方が 頂点シェーダーのパフォーマンスは上がりますが、非現実的な頂点数で差が確認できる程度です。 // フラグメントシェーダーのテクスチャでも小さくする方がずっと効果が高いです。 やるとしたら最後の最後ぐらいでしょうか。(最後でもやらないかな・・・) -----------------------------------------------------------------------------
2011/12/28(水) 03:37:03 |
ActionScript
| トラックバック:0
| コメント:4
Unity 3.5 の Flash 出力関係見てました。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SWF 出力時に使われるツールやライブラリはデフォルトインストールで
C:\Program Files\Unity\Editor\Data\PlaybackEngines\flashsupport\ に入ってます。
中の構成は、
-------------------------------------------------------------------- /BuildTools /AS3API /UnityEngine 大量の .as // UnityEngine パッケージのソースコード // UnityPlayerNative.swc に入ってます。 /UnityEngineInternal TypeInferenceRules.as // UnityEngineInternal パッケージのソースコード // UnityPlayerNative.swc に入ってます。 UnityEngineClassIndex.as // UnityEngineClassIndex クラスのソースコード // UnityPlayerNative.swc に入ってます。 /cil2as cil2as.exe ICSharpCode.Decompiler.dll ICSharpCode.NRefactory.dll Mono.Cecil.dll Mono.Cecil.Mdb.dll /flex // Flex 4.5.1.21328 のフォルダ /UserBuild_AS3 UnityApp.as // ユーザが作ったプロジェクトデータを保持するクラス // プロジェクトデータとはシリアライズされたコンテンツデータ index.html // Flash 再生用 html のテンプレート swfobject.js // Flash 再生用 js UnityShared.swc // Flash 出力時に一緒に出力される。 // 生成された .swf を自分で .as で読み込むときに使用。 // ( ただ、他のクラスも全部入ってる UnityPlayerNative.swc があるので使わないかも) SwfPostProcessor.exe /Managed UnityEngine.dll /Resources unity default resources // デフォルトのリソース // シェーダーコード( ちょっと変わった AGAL )といくらかのバイナリデータUnityPlayerNative.swc // Unity の ActionScript 向けライブラリ // UnityShared.swc のクラス以外も全部含んでいます。 // 一部のソースコードは \BuildTools\AS3API\ の中で見れます。 -------------------------------------------------------------------- このうち実際の作業で関係あるのは UnityPlayerNative.swc で、
後は UnityEngine パッケージのソースを見ることがあるかもしれないぐらいです。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
フォーラムから
UnityShared.swc; Communicating between Unity Flash Content and AS3. http://forum.unity3d.com/threads/116650-UnityShared.swc-Communicating-between-Unity-Flash-Content-and-AS3. AS3Communication_unity_project.zip
AS3Communication_as3_src.zip
Unity のデータと ActionScript のソースです。
このサンプルには
・ActionScript で Unity の出力した .swf を読み込む。
・ローディング画面
・ActionScript と Unity 間のメッセージの投げ方
が書いてあります。
実行してボタンを押すとデバッグウィンドウにメッセージが出ます。
メッセージのやり取りは AKABANE さんのサイトでも書かれています。
AKABANEさん Unity と Flashの連携 http://akabana.info/2011/12/24/unity-flash-messaging/ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
最近全然コード載せてないので、AIR じゃない通常の ActionScript での読込コードを。
とは言え、上のサンプルからローディング画面周りやメッセージのやりとり省いて
ほぼ .swf 読込だけに絞ってあるソースです。
---------------------------------------------------------------------------------
プロジェクト設定
Unity の出力した .swf と UnityPlayerNative.swc コピー
UnityPlayerNative.swc 右クリックで "ライブラリに追加"
--------------------------------------------------------------------------------- package { import Boo.Lang.Builtins; import com.unity.IUnityContentHost; import com.unity.UnityContentLoader; import com.unity.UnityLoaderParams; import flash.display.DisplayObject; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.ProgressEvent; [SWF(width='720', height='400', backgroundColor='#FFFFFF', frameRate='60')] public class Main extends Sprite implements IUnityContentHost { // Unity content private const UNITYAPP_SWF:String = "test000.swf"; private var unityContentLoader:UnityContentLoader; //////////////////////////////////////////////////////////////// // constructor public function Main():void { if (stage) init(); else addEventListener( Event.ADDED_TO_STAGE, init ); } //////////////////////////////////////////////////////////////// // init private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; /////////////////////////////////////////////////////////////// // load unity content var params:UnityLoaderParams = new UnityLoaderParams( false, stage.stageWidth, stage.stageHeight, false ); unityContentLoader = new UnityContentLoader( UNITYAPP_SWF, this, params, false ); unityContentLoader.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, onUnityContentLoaderProgress ); unityContentLoader.contentLoaderInfo.addEventListener( Event.COMPLETE, onUnityContentLoaderComplete ); unityContentLoader.loadUnity(); } //////////////////////////////////////////////////////////////// // Loading UnityContent private function onUnityContentLoaderProgress( event:ProgressEvent ):void { // create original progress bar var p:Number = event.bytesLoaded / event.bytesTotal; trace( p * 100 ); } //////////////////////////////////////////////////////////////// // Load complete UnityContent private function onUnityContentLoaderComplete(event:Event):void { addChild( unityContentLoader ); unityContentLoader.unityContent.setContentHost( this ); } //////////////////////////////////////////////////////////////// // init Unity start. public function unityInitStart () : void { // This is called when the content is loaded and the initialization of the unity engine is started. // Unity 初期化始まり } //////////////////////////////////////////////////////////////// // init Unity complete. public function unityInitComplete () : void { // This is called when the unity engine is done initializing and the first level is loaded. // Unity 初期化終わり } } } --------------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
その他メモ
---------------------------------------------------------------------------------
ActionScript 側で何の仕事するべきなのかがまだ分かりません。
ゲームオブジェクトの制御は Unity で組んどけば済むことですし。
Unity で出来なくて ActionScript で出来ることを勉強しなきゃです。
---------------------------------------------------------------------------------
Unity が使ってる Stage3D を取得して何かしてみたかったんですが。
unityContentLoader.unityContent の持ってる stage3D は private でした。
どこか他からでもいいので欲しいです。
---------------------------------------------------------------------------------
出力される .swf のサイズが結構大きかったので、箱とカメラ、ライトだけのシーンでテスト。
やっぱり 15 MBぐらいになっちゃいました。
しょうがないかなと思ってたんですが、
上のほうで書いたサンプルの .swf は 2.5 MB 程でした。
// 再掲
//
UnityShared.swc; Communicating between Unity Flash Content and AS3. //
http://forum.unity3d.com/threads/116650-UnityShared.swc-Communicating-between-Unity-Flash-Content-and-AS3. // AS3Communication_unity_project.zip
// AS3Communication_as3_src.zip
15 MB もあると FC2 や、借りてるサクラのスペースだと作ったサンプルとかが上げられないので
何か設定あるのか調べないと。
---------------------------------------------------------------------------------
.swf 読み込みじゃなくて、Unity の作った .as から自分でコンパイル出来るかなと思って試してみました。
// ただ、これが出来てもメリットはほぼ無いです。ほとんどのクラスは UnityPlayerNative.swc の中なのでデバッガも使えません。
// そして結果を先に書きますと出来ませんでした。
Unity のフォルダから
UnityPlayerNative.swc
UnityApp.as
ビルドして出来るフォルダ Temp から
ConvertedDotNetCodeClassIndex.as
ProjectSerializedFileContainer.as
( 小さいプロジェクトで global. は無し )
FlashDevelop でコンパイル
(ドキュメントクラスは UnityApp.as )
無事にビルドは通りましたが、起動すると Unity のロゴの後は真っ黒
コンソールにはコンテンツがロードされて無いっぽいエラーが。
UnityApp からデータをデシリアライズする方法や
UnityContentInternal.setStage3DSize() の実行時エラーが
直せなかったのであきらめました。
素直に UnityContentLoader で .swf ロードします。
---------------------------------------------------------------------------------
Temp フォルダの消えるタイミングは Unity 終了時
---------------------------------------------------------------------------------
自分で作ったプロジェクトは
C:\Documents and Settings\USER_NAME\My Documents\PROJECT_NAME
---------------------------------------------------------------------------------
SwfPostProcessor.exe をとりあえずコマンドラインから叩いて Usage だけ見ておきます。
Usage : -upp [inputfile] -o [outputfile] -c[zlib/lzma/none]
---------------------------------------------------------------------------------
cil2as.exe も
System.ArgumentException: Usage:
cil2as [assemblies]
[--libid:LibId] [--types:type1,type2] [--with-class-index] [--filter-by-attribute:AttributeTypeName] [- -auto] [--blacklist:/path/to/blacklist] [--cpp-output-dir:/path/where/to/generate/cpp/files] [--disable-transforms:, ] [--cherry-pick:Foo.Bar(System.Int32) --cherry-pick:Foo.Bar(Baz) at cil2as.ConversionOptions.Parse(String[] args) at cil2as.Program.Main(String[] args) --------------------------------------------------------------------------------- Unity やるなら、プログラムよりリソース作りの速度が大事かなと思うので 正月休みは Blender2.6 を勉強したいです。 (またしても Blender やるやる詐欺) --------------------------------------------------------------------------------- Unity はフォーラムが凄い活発 Unity Community http://forum.unity3d.com/index.php ---------------------------------------------------------------------------------
2011/12/26(月) 01:52:30 |
ActionScript
| トラックバック:0
| コメント:0
今日はクリスマスイブ。お休みです。
ぷちぷちとネットで Flash の情報見ていると、
素晴らしいクリスマスプレゼントがありました。
Unity 3.5 Public Beta で Flash 書き出しが出来るとのこと。
丁度 Proscenium から Away3D に移ろうと思ってて
かつ、Away3D のバージョンアップが近いんで
それまでの間 Unity を少し勉強しておくことに。
//
Back from Max: Away3D platform roadmap //
http://away3d.com/comments/back_from_max_away3d_platform_roadmap // Away3D のログがクリスマスバージョンになってますね
この記事は実際に作業しながら並行してメモしてるためまとまりに欠けてます。
////////////////////////////////////////////////////////////////////////
// 情報集め
グラフィカルなゲーム開発環境ということしか知らないので情報集めから。
公式サイト http://unity3d.com/ 日本語サイト ( 現在はまだ 3.5 については更新されてないようです。)
http://unity3d.com/japan/unity3 どんなゲームが作れるか
公式サイト Gallery http://unity3d.com/gallery/ 2 分ほどの動画で様々なタイプのゲームの画面が確認できます。
GAME Watchさん ミドルウェア戦国時代! 「Unity」は新興ゲーム業界を制すか? GDC2010出展の各種ミドルウェア企業を幅広くレポート http://game.watch.impress.co.jp/docs/news/20100315_354923.html 物理エンジンはPhysX
10 万ドルの収入は無いので Free 版で。
引用: より本格的な開発に使える有料版の「Unity Pro」は11万円。こちらは各種特殊エフェクトの実装や、C++によるプラグイン作成、ローレベルAPIの直接制御といったタイトル・バイ・タイトルの自前最適化が可能になっているほか、バージョンコントロール機能を内蔵するなど大規模開発に必要なソリューションが追加されている。それでも個人レベルで買える金額なのが驚きである。 Pro でも 11 万円というのは破格ですね。
「C++によるプラグイン作成、ローレベルAPIの直接制御」にちょっと心惹かれます。
バージョンによるライセンスと機能の差をもうちょっと確認
強火で進めさん [Unity][Unity3d]ライセンスごとの機能の違い http://d.hatena.ne.jp/nakamura001/20110710/1310292561 公式サイト License Comparisons http://unity3d.com/unity/licenses 結構 Free 版と Pro で違いがあります。
後でもっと確認
AKABANAさん Unity 3.5 Developer Preview http://akabana.info/2011/12/24/unity-3-5-developer-preview/ 早速 Flash deployment を試してらっしゃいます。Unity 全然分からないので有難いです。
////////////////////////////////////////////////////////////////////////
// Unity 3.5 Public Beta インストール
3.5 Developer Preview http://unity3d.com/unity/preview/download 右の "Download Unity 3.5" をクリックして好きなところに保存
約 500 MB
実行
Next >
I Agree
全部選択状態のまま
Next >
デフォルトのパスのまま
Install
自動で .NET Framework 周りのインストールも行われ無事完了
Finish
特に書くこと無かったですね。
////////////////////////////////////////////////////////////////////////
// 初回起動
メッセージが出ます
This version of Unity requires authorization for to use it.
Please press the "Register" button to begin the authorization process.
A one time 30-day free trial is available for everyone.
自動翻訳
ユニティのこのバージョンは認可を必要とします、のために、それを使用するために
認可プロセスを始めるために「レジスター」ボタンを押してください。
1回の30日間の無料試用は皆に利用可能です。
どの道押さないと進めないので "Register" 押下
アクティベーション方法の選択です。
楽であろう "Internet activation" を選んで "Next"
ブラウザで Unity のサイトが開きます。
メールアドレスと会社名入力
ライセンスは "Free" 押下
起動していた Unity の方に制御が戻ります。
Regist OK のようです。
"Finish" 押下
Welcom のダイアログとともに起動しました。
真ん中の画面にはなにやら最初から凝ったものが見えます。
////////////////////////////////////////////////////////////////////////
// 触ってみる
Welcome To Unity ダイアログは閉じます。
でも後で見るかもしれないので念のため右下の "Show at Startup" はそのままに(弱気)
なにもいじらず、先ほどのサイトを参考に早速 Flash deployment を試してみます。
// 再掲
//
AKABANAさん Unity 3.5 Developer Preview //
http://akabana.info/2011/12/24/unity-3-5-developer-preview/ ほぼAKABANAさんのサイトそのままです。
1.[File] [Build Settings...] 選択
2.
なにやら変換が始まります
3.無事終わったのでワクワクしながら "Build" 押下
保存ダイアログが出てきましたので適当な名前を付けます "Test20111224_00.swf"
ビルド待ち
エラーの場合はどこにメッセージが出るのか分からないのでドキドキです。
不安もよそに、無事ビルドされて先ほどの保存したフォルダが開きました。
// 良く見ると \All Users フォルダに作られるんですね。
出来た "Test20111224_00.html" をブラウザで実行
Unity のロード画面の後ゲーム起動
無事動きました。わーい
凄いなー
この後、出来た .swf と .swc を使って AIR で実行する方法も AKABANA さんのサイトに書いてあります。
自分何にもしてないですね。
////////////////////////////////////////////////////////////////////////
// フォルダ漁り
先ほどのフォルダをプチプチと漁ってみます。
.as がありました。
\Temp\StagingArea\Data\src\ProjectSerializedFileContainer.as
Unity のデータをシリアライズするためのクラスのようです。
\Temp\StagingArea\Data\ConvertedDotNetCode\ConvertedDotNetCodeClassIndex.as
.NET のコードを .as のクラスにマッピングしているようです。
\Temp\StagingArea\Data\ConvertedDotNetCode\global
大量の .as が入ってました。
これは何でしょう、Unity のオブジェクトの .as 版でしょうか。
\Temp\StagingArea\Data\Resources\unity default resources
先頭にちょっとバイナリがあって、後はシェーダーの定義ファイルのようです。
多少レジスタ名が違いますが AGAL のようです。( Unity 版の AGAL? )
////////////////////////////////////////////////////////////////////////
どうも先に Unity の勉強が必要っぽいです。(当たり前)
2011/12/24(土) 19:00:28 |
ActionScript
| トラックバック:0
| コメント:0
Windows 環境限定になりますが
AGAL のデバッグ方法として PIX for Windows 試してみます。
(実際は HLSL アセンブラでのデバッグになります)
////////////////////////////////////////////////////////////////////////
// PIX for Windows
DirectXSDK に付いてくるツールです。
こちらのサイトで使い方を確認
スクリーンショットが豊富で凄い分かりやすかったです。
ひにけにXNAさん PIXを活用する その1 http://blogs.msdn.com/b/ito/archive/2008/10/29/pix-01.aspx t-potさん PIX http://www.t-pot.com/program/131_PIX/index.html なお、DirectXSDK とビデオカードのドライバは最新版にしておくのが無難で、古いとデバッガがうまく動かない場合があるそうです。
////////////////////////////////////////////////////////////////////////
// テスト SWF
シンプルなコードで試してみます。
ソースコード
TestSWF.as ------------------------------------------------------
ソースから抜粋
メッシュ情報
// 頂点座標と頂点カラー
-1, -1, 0, 1, 0, 0 // x, y, z, r, g, b
, 0, 1, 0, 0, 1, 0
, 1, -1, 0, 0, 0, 1
// インデックス
0, 1, 2
// 変換行列(ローカル座標系からスクリーン座標系に)
単位行列入れてあります。
無くてもいいんですが AGAL があまりに寂しかったので。
------------------------------------------------------
シェーダー
// 頂点シェーダー
// va0 頂点座標
// va1 頂点カラー
// vc0 変換行列(ローカル座標系からスクリーン座標系に)
m44 op, va0, vc0
mov v0, va1
// フラグメントシェーダー
// v0 頂点カラー
mov oc v0
------------------------------------------------------
////////////////////////////////////////////////////////////////////////
// PIX
------------------------------------------------------
PIX 起動
ウィンドウに flashplayer_11_sa_debug_32bit.exe をドラッグアンドドロップ
どんな情報が欲しいか聞かれますので
"
A single-frame capture of Direct3D whenever F12 pressed "
を選択
右の Enable draw timing は何するのか分からないので未チェックのままで。
右下の "
Start Experiment " で EXE 実行
------------------------------------------------------
開いた FlashPlayer に .swf をドラッグアンドドロップ
デバッグしたいシーンになったら
F12 押下で情報取得開始
ここで一度アプリの実行が止まり、PIX の情報取得が終わったら再び動き出します。
// このテスト SWF だと止まってるのか動いてるのか分からないです。
// FPS 表示等しておくのが良いと思います。
これで FlashPlayer は終了します。
------------------------------------------------------
PIX に 4 つのウィンドウが表示されます。
TimeLine 実行してた時間と、キャプチャしてた場所の表示でしょうか。
Objects バッファやシェーダーの情報
Events アプリケーションで発生したイベントです。
Details 詳細情報
このうち主に使うのは
最初に Events をちょっと使って
後はほぼ Details だけになります。
------------------------------------------------------
Events の太字になっているところが先ほどキャプチャしたフレームです。
+ をクリックして開きます。
呼び出された DirectX の API がずらーっと出てきます。
この中から
DrawIndexedPrimitive を探して選択します。
Details ウィンドウのタブを Render にするとその時のバッファの状態が表示されます。
------------------------------------------------------
シェーダー見てみます。
Details ウィンドウの Mesh タブに切り替えます。
下の部分の
"PreVS" がシェーダー通過前の頂点情報
"PostVS" がシェーダー通過後の頂点情報です。
ただ AGAL だと PreVS は確認できません。
------------------------------------------------------
PostVS 見てみます
三頂点の変換後の値が確認できます。
ここでもし期待通りの数値になっていなければ頂点シェーダーに問題があることになります。
// 実はこのキャプチャの数字も期待通りになってないです。(そんなつもりはなかったんですが)
// X 座標が 0.001 、Y 座標が 0.002 ずれてます。
// これは後述する FlashPlayer の仕様じゃないかと思います。
------------------------------------------------------
各頂点の数字をクリックするとシェーダーコードが見れます。
この時ダイアログで、シェーダーデバッガーを有効にしていいか聞かれたら Yes 押下。
なお、この設定は PC 全体の設定なので後で元に戻すには
DirectX コントロールパネル( dxcpl.exe )の "Enable Shader Debugging" を外します。
------------------------------------------------------
話を PIX に戻します。
頂点シェーダーのコードと下のほうにはレジスタの中身が表示されます。
// レジスタはそのステップまでで使われたレジスタが表示されていきます。
簡単にコード見てみます
------------------------------------------------- vs_2_x // シェーダーのバージョン AGAL は 2_0 じゃなくて 2_x なんですね。 ------------------------------------------------- dcl_texcoord v0 // 頂点座標 dcl_texcoord1 v1 // 頂点カラー HLSL では座標なら dcl_position を指定するのですが ActionScript で設定した頂点バッファは属性に関わらず dcl_texcoord になるんでしょうか。 // このため先ほどの PreVS ( シェーダー通過前の頂点情報 )が表示されないようです。 ------------------------------------------------- m4x4 r12, v0, c0 mov oT0, v1 mad oPos, r12.w, c132, r12 HLSL のアセンブラです。 これに対応する AGAL コードをもう一度貼っておきます m44 op, va0, vc0 mov v0, va1 レジスタ名は違いますが 1, 2 行目はほぼ同じです。特に問題ないです。 そして 3 行目 簡単に終わるはずだったのに予想外のコードが・・・ これは // c132 ( -0.001, 0.002, 0.000, 0.000 ) oPos = r12.w * c132 + r12 // 出力座標 = 変換済頂点.w * c132 + 変換済頂点 // 変換済頂点.w はこの場合 1.0 となってます。 頂点座標をスクリーン出力する際にほんのちょっとずらしてるようです。 本当は ( -1.000 -1.000 0.000 1.000 ) になるのが ( -1.001 -0.998 0.000 1.000 ) に調整されてます。 Events ウィンドウで確認すると IDirect3DDevice9::SetVertexShaderConstantF(132, 0x0012EF8C, 1) 当たり前ですが確かに設定されてる定数のようです。( 128 以上の定数レジスタは FlashPlayer の予約領域なんでしょうか) 恐らく FlashPlayer の都合だと思うので このコードが追加されててもデバッグ作業では気にしないことにしました。 // とは言え技術的には興味がありますので、この処理の理由をご存知の方居らっしゃいましたら教えてください。 // または自分が全然違うことを言ってる可能性もありますので、その辺りの突っ込みでも歓迎です。 ------------------------------------------------------ デバッグ自体は簡単です。 上の各ボタンがそれぞれ、 Go F5 // 実行 Restart Ctrl + Shift + F5 // もう一度最初から Step F10 // 1 ステップ実行 Back Shift + F10 // 1 ステップ戻る Run To Cursol // カーソル行まで実行 画面下部にその時点でのレジスタの中身が表示されます。 ------------------------------------------------------
次にフラグメントシェーダのデバッグ方法です。
Details ウィンドウのタブを Render に切り替えます。
デバッグしたいピクセルの上で右クリックして "Debug This Pixel..." を選びます。
------------------------------------------------------
そのピクセルの変化が一覧表示されます。
Initial framebuffer value // 処理が始まった時点でのフレームバッファー上の色。1 フレーム前の色です clear() // clear されてます DrawIndexedPrimitive() // ピクセルシェーダーが実行された結果です Final framebuffer value // 最終的なフレームバッファー上の色です "
Debug Pixel( xxx, yyy ) " をクリックします。
// "Debug Vertex #" を選べばここから頂点シェーダーのデバッガーにも飛べます。
------------------------------------------------------
ピクセルシェーダーのデバッグができます。
操作は頂点シェーダーと同じです。
------------------------------------------------------
HLSL なので多少コードが違いますがおおむねいけるんじゃないかと思ってます。
参考用に
HLSL vs_2_x 命令一覧 http://msdn.microsoft.com/ja-jp/library/bb172937%28v=vs.85%29.aspx HLSL vs_2_x レジスタ一覧 http://msdn.microsoft.com/ja-jp/library/bb172962%28v=vs.85%29.aspx HLSL ps_2_x 命令一覧 http://msdn.microsoft.com/ja-jp/library/bb219853%28v=vs.85%29.aspx HLSL ps_2_x レジスタ一覧 http://msdn.microsoft.com/ja-jp/library/bb172919%28v=vs.85%29.aspx 後は実際の作業で使ってみて問題点等あったらまた記事書いてみます。
2011/12/24(土) 12:45:58 |
ActionScript
| トラックバック:0
| コメント:0
本業が飲食関係なので忘年会新年会シーズンはずっとドタバタしてます。
忙しのは有難いことです。
とはいえ、サイトの更新間隔が空いちゃいそうなので雑記やら。
////////////////////////////////////////////////////////////////////////
// 同人
毎年同人再開しようと思いながら何年も経過してます。2012 年こそ。
////////////////////////////////////////////////////////////////////////
// ActionScript
やってみたい事や読んでみたいソースがどんどん積みゲー状態になってます。
どこかで時間作って気合で消化しなきゃ。
ActionScript で最近見たサイトのリンクとか。
主題は特に無いです。
////////////////////////////////////////////////////////////////////////
Proscenium の物理エンジン Pellet の記事です。
note.x さん Stage3D Physics library “Pellet” http://blog.r3c7.net/?p=647 様々なデモがあります。
引用:
機能・パフォーマンス的に AwayPhysics に及ばない 今からでも Away3D に乗り換えたくなりました。
引用:
今のところ btPoint2PointConstraint、btHingeConstraint といった、複数の剛体を繋いで複雑な物理モデルを構成するためのクラスの大部分が移植されてないようなので、連動して btRaycastVehicle、btKinematicCharacterController という有用なアクションインターフェースが使えない。この辺でもAwayPhysicsに大きく差をつけられてる感じ。 Constraint 周りが動かない!
クラスがあるのだけは調べてあったので確認
// Constraint var p2p:btTypedConstraint = new btTypedConstraint( btTypedConstraint.POINT2POINT_CONSTRAINT_TYPE , obj1.physicsObject as btRigidBody , obj2.physicsObject as btRigidBody ); _pellet._dynamicsWorld.addConstraint( p2p ); ホントに動かない・・・orz
エラーは出ませんが、特に何も変わりませんでした。
中身は未実装のようです。悲しい。
////////////////////////////////////////////////////////////////////////
Simo Santavirta さん Introducing open source evoSpicyParticleEngine http://www.simppa.fi/blog/introducing-open-source-evospicyparticleengine/ オープンソースのパーティクルシステム
1 パーティクル 1 三角ポリなのでいっぱい出せます。
デモがかっこいいです。特に自分が気になったのはこのデモ
http://www.simppa.fi/experimental/as3/2011/molehillparticle/foursparklers/ 独自 Z バッファなのかな。
機会があったらソース詳しく見てみたいです。
////////////////////////////////////////////////////////////////////////
evoSpicyParticleEngine のコメント欄で
「三角ポリだと多くのパーティクルは出せるが、無駄な透明部分が多いから遅くなるんじゃないかな」
とのコメントとともに紹介されていたサイト
Humus さん New particle trimming tool http://www.humus.name/index.php?page=Comments&ID=266 トリミングして無駄な alpha kil を行わないほうがパフォーマンスが上がるということでしょうか。
// もちろん頂点数は増えるので生成可能なパーティクル数は減ります。
// evoSpicyParticleEngine のクラス名眺めたら
// "AlphaKill" や "NoAlphaKill" とあるのでシステムに組込済みかもしれません。
AGAL でパフォーマンスがどのぐらい違うか、
自分で星型テクスチャのパーティクルでも作って確認テストしてみたいです。
こんな記事書いてる間にコーディングしろって話なんですが。
////////////////////////////////////////////////////////////////////////
全然関係ないですが上の kil で思い出しました。
PixelBender3D で kil 行いたい場合は
discard; // AGAL kil ただ、テスト中の隠し命令とのこと。
試してみたところ一応動きました。
////////////////////////////////////////////////////////////////////////
Alejandro Santander さん lidev! AGALtheMEaN v0.4 http://www.lidev.com.ar/agalthemean-v0-4/ リアルタイムで AGAL コーディング
面白そうなので GitHub からソースダウンロードして、
足りないクラスも片っ端からかき集めてコンパイルまでは通したんですが動かせませんでした。
(真っ白なまま何も出ず)
悔しいので時間見つけて動かしたいです。
////////////////////////////////////////////////////////////////////////
Alchemy
前から気になってたのでサンプルだけ試してみました。
途中で吐かれる .as の大きさに衝撃。
ポインタとかどうするのかなと思ったらこちらのサイトにそのものズバリでとても詳しい解説が。
てっく煮ブログさん Alchemy でポインタを扱う http://d.hatena.ne.jp/nitoyon/20090114/alchemy_pointer Alchemy の速度について
yukobaのブログさん Flashで数値計算を高速化する方法 http://d.hatena.ne.jp/yukoba/20090131/p1 次期コンパイラ Falcon が来年リリースされれば最適化での速度は直 AS でも良くなりそうなので
//
2012 (2013?) 年 Flash 予報 - 言語編 //
http://cuaoar.jp/2011/10/2012-2013-flash--.html Alchemy は高速化とかではなく、純粋に外部資産を利用するための物と覚えておけばいいんでしょうか。
OpenCV の as 版とか欲しいです。( 2.0 は厳しくても 1.x なら・・・難しいかな)
////////////////////////////////////////////////////////////////////////
Alchemy の生成した .as の __asm 調べててこちらのサイトに。
ActionScript Compiler の定数畳み込みについて
サンプルコード、バイトコードが載ってます
「(最適化が全く考えられていない)最悪のコンパイル結果」だそうです。
Alchemy, ActionScript and the ASC http://blog.joa-ebert.com/2008/12/01/alchemy-actionscript-asc/ 2008 年の記事なんですが、現バージョンのコンパイラでもやっぱり駄目なのかな。
ただこれも Falcon がリリースされれば解決しそうです。
////////////////////////////////////////////////////////////////////////
Jackson Dunstan さん JacksonDunstan.com http://jacksondunstan.com/ ActionScript の様々なパフォーマンスのチェック。
ソースや図も多く、コメント欄も活発でした。
勉強させていただきました。
////////////////////////////////////////////////////////////////////////
NVIDIA のシェーダー作成のガイド。日本語です。
AGAL には関係ない部分も多いですが、ボトルネックの調べ方や色々 Tips が。
NVIDIA GPU Programming Guide http://developer.nvidia.com/nvidia-gpu-programming-guide の中の
PDF
GPU Programming Guide Version 2.2.0 (GeForce 7 and earlier GPUs) in Japanese http://developer.download.nvidia.com/GPU_Programming_Guide/GPU_Programming_Guide_Japanese.pdf ////////////////////////////////////////////////////////////////////////
モデルデータの LOD に
ポリゴンリダクションのアルゴリズム調べていてこちらの論文に付きました。
PDF
多重解像度メッシュの生成・編集処理技術 http://www.riken.go.jp/lab-www/V-CAD/kokai/No200202.pdf 分かりませんでした。
色々と自分の基礎力が足りません。
////////////////////////////////////////////////////////////////////////
年内に後一回ぐらいサイト更新して 2011 年の反省とか反省をまとめたいです。
2011/12/19(月) 21:49:01 |
ActionScript
| トラックバック:0
| コメント:0
-------------------------------------------------------
追記
このサンプルデモは、記事一番下の点光源の問題に対策してない方の swf をアップしてました。
キャプチャ画像は対策に y 座標ちょっぴりずらしてあるのに。
なので、ライト種類を点光源( point )にして原点に持ってくると Stage3D の描画の更新が止まります。
(FlashPlayer が落ちたりするわけではないです)
上げなおすのもなんなのでこのままで。
そして、他のパターンでもこの例外は発生するみたいなので
別の対策方法を記事の一番下の方に追記しておきました。
-------------------------------------------------------
Proscenium のライトです。
問題がいくつかありましたので覚書しておきます。( 2011/12/05 Version Preview1 時点 )
////////////////////////////////////////////////////////////////////////
ライトの種類は、
平行光源
点光源
スポットライト
が使えます。
面光源はありません。
影も使えます。
////////////////////////////////////////////////////////////////////////
1 個約 2000 ポリの球体を 8 個
真ん中の変な物体はセルフシャドウ確認用です。約 1000 ポリ
左上の画像はシャドウマップです。ライト視点からの Z バッファ。
// 縞模様なのは 0.0 - 1.0 を書き込む際、精度を保持するのに RGB 24 bit を使ってるため。
カーソルキー UP DOWN でライト上下移動
カーソルキー RIGHT で 光源タイプ切替
SAPCE で ON/OFF です
画像クリックでテスト FLASH
実行には FlashPlayer11 以上が必要です )
adobe から FlashPlayer ダウンロード ソース
SampleLight.as ////////////////////////////////////////////////////////////////////////
どの種類のライトでもおおむね処理の流れは同じです。
ShadowMap 関係のパラメータは他にもあるんですがちょっと長くなりそうなので、後日詳しく書いてみたいです。
------------------------------------------------------------------------
基本的な初期設定
init() { . . . ///////////////////////////////////////////////////// // init Light // SceneLight static // 全ライトに適用される SceneLight クラスの static メンバを設定しておきます // デフォルト値で使う場合は設定の必要は無いです SceneLight.shadowMapVertexOffsetFactor = 5; // シャドウマップ生成時のモデルサイズ調整 // 後日詳しく書きます SceneLight.shadowMapSamplingDistantLights = RenderSettings.SHADOW_MAP_SAMPLING_3x3; // シャドウマップからのサンプリングサイズ SceneLight.shadowMapSamplingPointLights = RenderSettings.SHADOW_MAP_SAMPLING_3x3; // シャドウマップからのサンプリングサイズ SceneLight.shadowMapSamplingSpotLights = RenderSettings.SHADOW_MAP_SAMPLING_3x3; // シャドウマップからのサンプリングサイズ // Create light // ライト生成 light = new SceneLight( SceneLight.KIND_SPOT, "light" ); // 光源のタイプと名前 light.color.set( 1.0, 1.0, 1.0 ); // 色 light.intensity = 1.0; // 強さ( 負の値にすると色を吸収する暗黒光に) light.shadowMapEnabled = true; // シャドウマップの有効・無効 light.setShadowMapSize( 1024, 1024 ); // シャドウマップのサイズ MAX 2048*2048 light.innerConeAngle = 20; // SPOT ライト時のみの設定 明るい内側の円の角度 light.outerConeAngle = 120; // SPOT ライト時のみの設定 暗めの外側の円の角度 light.position = new Vector3D( 0, 100, 0 ); // 位置設定 light.lookat( light.position, new Vector3D( 0, 0, 0.01 ), Vector3D.Y_AXIS ); // 原点に向ける。( Z=0.01 なのは後述) scene.addChild( light ); // Scene に追加------------------------------------------------------------------------
影を落としたいオブジェクトをライトに登録
Add caster objects to light.
light.addToShadowMap( sceneNode1, sceneNode2, sceneNode3, ... );
影を落とすオブジェクトをキャスター、影を受けるオブジェクトをレシーバと呼びます。
Proscenium ではレシーバの設定がちょっと見当たりません、デフォルトでは全オブジェクトが影を受けます。
キャスターもレシーバですのでセルフシャドウが落ちます。
// 非レシーバの設定が出来無いとちょっと困ることがあります。
// キャラの上に付いて回る体力バーやエフェクトにも影が落ちることに。
一時的に影を落としたくない場合は
mesh.
neverCastShadow = true;
これはキャスターの登録から外れるわけではなく、登録されたまま計算だけされてない状態です。
// むしろキャスターから外す方法が light を作り直す以外分かりません。
// 外せないと、例えば敵の飛行機を撃ち落として消滅させる場合等に困りそうです。
------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
ここからは覚書
------------------------------------------------------------------------
ライトの ON/OFF
light.hidden = true; // OFF
light.hidden = false; // ON
のはずですが、現状( 2011/12/05 Version Preview1 )このプロパティでは ON/OFF できません。
かつ、タイミングによってはコンソールに Warninng が出ます。
warning: bad line 5: add ft7.x, ft7.x, ft7.w
warning: bad line 7: add ft7.x, ft7.x, ft7.w
warning: bad line 9: add ft7.x, ft7.x, ft7.w
warning: bad line 16: add ft7.y, ft7.y, ft7.w
warning: bad line 21: add ft7.y, ft7.y, ft7.w
warning: bad line 27: add ft7.y, ft7.y, ft7.w
warning: bad line 32: add ft7.y, ft7.y, ft7.w
warning: bad line 38: add ft7.y, ft7.y, ft7.w
warning: bad line 43: add ft7.y, ft7.y, ft7.w
warning: bad line 49: add ft7.y, ft7.y, ft7.w
warning: bad line 54: add ft7.y, ft7.y, ft7.w
バージョンアップでの修正待ちになります。
一時しのぎの方法として
// OFF
scene.removeChild( lights[ 0 ] ); または lights[ 0 ].removeFromScene();
// ON
scene.addChild( lights[ 0 ] );
// 余談なんですが OFF のどちらを使っても light.parent の値は保持されたままになってます
// (仕様ではないと思います)
// 初期化時同様 null にしておいて頂ければ、ライト自身で自分の ON/OFF 状態を知ることが出来るんですが。
------------------------------------------------------------------------
ライトの種類を途中で変更
light.kind = SceneLight.KIND_...;
ただし影を使用しているライトは途中で変更できませんでした。
UseShadowMapLight can not change kind.
オブジェクトのシェーダーが切り替わらずエラー
[Fault] exception, 情報=Error: Error #3606: サンプラー 0 の形式がテクスチャの形式と一致しません。
何か変更する方法がありましたら教えてください。
無難なのは同じ位置に同じ設定で使いたい種類のライトを作っておいて
それぞれの ON/OFF 切り替えることでしょうか。
シャドウマップのメモリがもったいない感じですが。
------------------------------------------------------------------------
初期化時にライト座標が Y 軸上にあり lookat で Y 軸回転を使ってるので
座標か注視点をほんのちょっとずらして座標軸と重ならないようにしてます。
ライト座標見て回転軸を変えるのが正しいかもしれません。(面倒だったので)
light.position = new Vector3D( 0, 200,
0.01 ); // 位置設定
or
light.lookat( light.position, new Vector3D( 0, 0,
0.01 ), Vector3D.Y_AXIS ); // 向き設定
------------------------------------------------------------------------
点光源のシャドウマップサイズ
上のサンプルを見て分かるとおり、点光源のシャドウマップは投影キューブマッピングになってます。
(回転してますがただの 1 枚テクスチャです)
6 面分を 1 枚に書いているため他の光源と比べて影の解像度が低くなります。
なので、点光源で影の解像度を維持したい場合はシャドウマップを大きめに取る必要があります。
// 上のサンプルではあえて全タイプで 1024 * 1024 にしてあります。
ただ元々 6 面分なので他の光源よりかなり高コストです。
// このコストはおおむね VertexShader です。
かつシャドウマップのサイズを上げると更にコストがかさみます。
------------------------------------------------------------------------
点光源のシャドウマップには結構致命的なバグが残ってます。
( 2011/12/05 version Preview1 )
ある特定の平面上にライトが配置されると、六面シャドウマップの投影計算の時に実行時エラーが発生します。
[Fault] exception, 情報=RangeError: Error #1125: インデックス -1 は 6 の範囲外です。
RangeError: Error #1125: インデックス -1 は 6 の範囲外です。
at com.adobe.scenegraph::SceneLight/computeShadowCamera()[D:\Depots\Proscenium\branches\rel\code\Proscenium\src\com\adobe\scenegraph\SceneLight.as:476]
at com.adobe.scenegraph::SceneGraph/setupLights()[D:\Depots\Proscenium\branches\rel\code\Proscenium\src\com\adobe\scenegraph\SceneGraph.as:227]
at com.adobe.scenegraph::SceneGraph/prepareSceneDrawing()[D:\Depots\Proscenium\branches\rel\code\Proscenium\src\com\adobe\scenegraph\SceneGraph.as:200]
at com.adobe.scenegraph::Instance3D/render()[D:\Depots\Proscenium\branches\rel\code\Proscenium\src\com\adobe\scenegraph\Instance3D.as:290]
at com.adobe.scenegraph::BasicScene/enterFrameEventHandler()[D:\Depots\Proscenium\branches\rel\code\Proscenium\src\com\adobe\scenegraph\BasicScene.as:273]
at SampleLight/enterFrameEventHandler()[C:\work\project\flash\TestProscenium\src\SampleLight.as:232]
発生条件は言葉では説明しづらいので図で。
簡易にするため 二次元にしてあります。
図が分かりづらいですが、
ライトの座標から投影面に垂直に下ろした平面がキャスターの接平面と一致する時に発生します。
6 面全投影面で起こるかは確認してません。
・対策
------------------------------------------------------------
追記
上に書いてある発生条件以外でも起きたりしましたので他にも条件があるようです。
そのうち修正されるはずなので調べるのはやめて、最初の記事よりマシな暫定対策書いておきます。
override protected function enterFrameEventHandler( event:Event ):void { callPresentOnRender = false; try { super.enterFrameEventHandler( event ); }catch ( e:Error ) { trace( e.message ); // 座標をちょっぴりずらす _activeLight.position = _activeLight.position.add( new Vector3D( 0.01, 0.01, 0.01 ) ); // 再計算 super.enterFrameEventHandler( event ); // 実際は新しい座標でもアウトになる可能性が存在するので // exception が出なくなるまでループさせるべき。 // でも怖いんで一回だけにしてます・・・ } . . .------------------------------------------------------------
条件付ですが一時的に対策を。 接平面から 0.01 でもずれていれば OK ですので、ライトの座標がその平面上にならないようにします。 上のサンプルでは、light.y の初期値に 0.01 加えておいて移動量を 1.0 にしてあります。 (球体の直径は 20 なので、アウトになる平面は y = 0 or 20 だけのため) ただこれは条件として、 全オブジェクトの接平面が整数上にあるのが自分で分かっているためできることです。 例えば、モデリングしたオブジェクト等ではその保障が大変面倒です。 ライトやオブジェクトが自由に動く状況での対策は現状手間が掛かります // 各オブジェクトのバウンディングボックスがこのエラーになる接平面そのものなので // 平面の方程式にライト座標代入して 0 なら +0.01 するとか。 // でもその新たな座標が別のオブジェクトに対して安全とは限らないので // グルグル回して全オブジェクトに対して安全が確認されるまで(ry // あまり現実的じゃない・・・ ------------------------------------------------------------
バージョンアップで根本的な部分が直るまでは点光源の影は使わないのが一番無難かも。
------------------------------------------------------------------------
Proscenium は正式バージョンになる日が来るのか、PixelBender3D の例があるので不安です。
せめて Pellet 部分だけでも完成して欲しいんですが。
そろそろ他のフレームワークもチラチラ見ておいたほうがいいかも。
2011/12/06(火) 03:06:50 |
ActionScript
| トラックバック:0
| コメント:0
シェーダーでマテリアル作りを始めたいんですが、その前に AGAL 用のプリプロセッサー作ってました。
まだ version 0.5 ぐらいです。
画像クリックでテスト FLASH
実行には FlashPlayer11 以上が必要です )
adobe から FlashPlayer ダウンロード ソース
AGALPreprocessor.as AGALPreprocessorMacro.as AGALPreprocessorUtil.as Main.as // static メンバの初期化で private class を使う方法が分からなくてソースを分割することになっちゃいました。
// やり方が分からなかったらそのうちパッケージ化します・・・
クラスの使い方
------------------------------------------------------ var agalSource:String = "........"; // AGAL Source try{ agalSource = AGALPreprocessor.preproces( agalSource ); } catch( e:Error ) { trace( e.message ); } ------------------------------------------------------ サポートしてる命令は
//
/* */
#define // C 風のマクロ関数は使えません。can not use C like macro function.
#ifdef
#ifndef
#endif
です。
////////////////////////////////////////////////////////////////////////
// #define での注意点
define の値に他の define 名が含まれてても置換しません。
循環する場合にどう出力するのが正しいか決められませんでした。
// C99 とかの資料探せば C プリプロセッサの仕様が定義されてたはず・・・
なので、単純に出現順が早い define から優先して置換されます
example
------------------------------------------------------ #define uv.u va1.x #define uv.v va1.y #define uv va1 mov vt0.x, uv.u これは期待通りになります mov vt0.x, va1.x // OK! ------------------------------------------------------#define uv va1 #define uv.u va1.x #define uv.v va1.y mov vt0.x, uv.u これは期待通りになりません mov vt0.x, va1.u // BAD! ------------------------------------------------------ C 風のマクロ関数は書けません。
なので # での引数の文字列置換も出来ません。
////////////////////////////////////////////////////////////////////////
// シェーダーの動的組み合わせ
シェーダの組み合わせ数爆発対策がプリプロセッサを作りたい理由のメインです。
最初は Proscenium 用に動的にシェーダー合成するクラス作ろうと思ってたんですが、
Proscenium を使い続けるか分からないので、どうせなら他でも使いまわせる仕組みが欲しく、
それならプリプロセッサがあれば、ある程度はどうにかなりそうな気がして。
こういう感じの処理がしたいです。
------------------------------------------------------ var agal:String = " . . . #ifdef LIGHT1_USE light1 agal code #endif . . . #ifdef FOG_USE fog agal code #endif . . . "; ------------------------------------------------------agal = ( isLight1 ? "#define LIGHT1_USE" : "" ) + ( isFog ? "#define FOG_USE" : "" ) + agal; agal = AGALPreprocessor.preproces( agal ); agalMiniAssembler.assemble( Context3DProgramType.VERTEX, agal ); ------------------------------------------------------ まだ肝心のシェーダーを書いてないので
早く実践投入して出てきてないバグを潰したいです。
////////////////////////////////////////////////////////////////////////
// #macro
#macro から #endmacro のデータを引数で置換します。
引数以外は #define での置換はされません。
他よりもテストが甘いので一番バグが残っていそうな命令です。
example.
------------------------------------------------------ // a = b + c + d #macro myFunc dst, src1, src2, src3 add dst, src1, src2 add dst, src3 #endmacro myFunc vt0, va1, vc1, vc2 実行すると add vt0, va1, vc1 add vt0, vc2 ------------------------------------------------------ 頻繁に使いそうなマクロは、定義なしでも使えるように組込関数として入れてあります。
//
以前の記事 のものを入れてあります。
テンポラリーレジスタを使うタイプは、その時使っていいものをユーザが指定します。
組込マクロのデモと使い方
画像クリックでテスト FLASH
実行には FlashPlayer11 以上が必要です )
adobe から FlashPlayer ダウンロード
2011/12/03(土) 08:10:48 |
ActionScript
| トラックバック:0
| コメント:0
次のページ