2013年9月30日月曜日

Unity : Shuriken : エフェクト調査2

さて、Shurikenです
あるぇ、と言った状態です。

スミマセン使いこなせてる訳ではございません。

以下のエフェクトを考えます。

水面に着弾したエフェクトで水柱をあげるです

要素
・水柱
・衝撃波
・水しぶき

最低でもこの三つです
衝撃波は二つ欲しいですね。

水しぶきですから、水面下に隠れるものは必要ありません。
ビルボードは、センターが真ん中限定ですので、
オリジナルのメッシュにしてみます。

>Texture Seat Animationが効かなくなります orz

さて、要素が複数ありますので、
主となるパーティクルを一つ追加し、
SubEffectで、上記の3つを追加して行こうかと思います。
発生時はほぼ同時ですので、誕生時で良いでしょう

>2つまでです orz

という事は

main 水柱
2nd 水しぶき
3rd 衝撃波
3rd 衝撃波

ですか!?
 入れ子いやん orz

わりと厳しいですね〜


やはり、スクリプト等で拡張するしかないようです
お手軽じゃないぜ  > Unity



探したしたサイト

Unityでゲーム作るよ 5
うにばな
[Unity]テクスチャのUV移動について
テクスチャの擬似スクロールと小技


お手軽ツール
Playmaker


参考サイト


とあるプログラマの備忘録
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第三回「銃弾が撃てるスクリプトが書きたい」
FPS 弾丸発射、着弾時にエフェクト


Unity : Toon Shader : Sugiyama Toon Shader

Unityを調べる毎日です :p

Shader調べていたらToonShaderがひっかかった

Sugiyama Toon Shader なんてあるみたい
40ドルなり


ビックリするほどではないですが、中身が見えたら4000円は安い?
というか、コードみえるじゃろか :p


自主学習の場合

自分で作るとして、Softimageでお勉強するとしたら、ここからかな?

Softimage UsersNotes
この辺りの記事かな

記事


法線反転 + ポストプロセス

さらに高度になると、ポストプロセスとハイブリッドになりますが。
SEGA の ラブ & ベリー があった覚えが

CEDECにPDFが > PDF
コレはラブ&ベリーの次みたいですね。法線反転は使ってないみたい。ポスプロのみか〜。

SCEJ「みんなのスッキリ」、セガ「リルぷりっ ゆびぷるひめチェン!」 プロデューサーと現場開発者の視点から語られる、新タイトルでのチャレンジ

同じくSEGAさんですが、ミクの技術部の方にも似たような話題があったかと思います

公式

「pjd技術部」タグ誕生! :第一回「アンチエイリアシング」
pjd技術部:第二回「カメラモーションブラー」
pjd技術部:第三回「初音ミク Project DIVA Arcadeとミクの日感謝祭とVirtua Fighter 5」
pjd技術部:第四回「ノンフォトリアリスティックレンダリング」

すみません、SEGAマニアなんでw

まあ、やりたい事は目白押しなのです orz


なんか、ラインをパターンマッチで出す方法もどこかで見た気がするけど、
思い出せません orz

これもSEGAだったと思うんだが・・・
リアルタイムじゃなかった、ヘキサゴンの高解像かの話かな?

まあ、そんな感じで記憶の掘り返し :p

ティータイムがなくなっちゃったからねー。


NormalMapを使って、ToonShadingって、
色の変わるエッジの精度が上がると思うんだけど、
テクスチャ2回も参照するから重い?


でも、Unity、モデリングから組み込みまで早いから、燃えるな :p 動かないけど。


追記
shaderXなるものが 1-2まで無料らしい・・・ > リンク

2013年9月27日金曜日

Unity : Effect : 調査01

Unitでエフェクトを始めるにあたって調査中

外部ツール

BISHAMON
インディーズ向けに安価ではあるが、
パフォーマンスも最適化難しいため断念。


Shuriken (標準)

標準のツールであるShurikenを利用して制作を行う。

実際は標準を標準で使うと、かなり制約が厳しく感じた。
オリジナルポリゴンで、マテリアルを付けると、
透明度等の移行が出来ない わりと致命的? orz
(parthicle shader)なら行けるらしい。調べる


拡張として、スクリプトで制御する必要があるらしい。
まあ、これも標準の内かな?
Shurikenでエフェクト色々(サンプル・素材あり)

エフェクト素材を1枚にまとめて使う方法 パフォーマンス向上
【Unity Tips】エフェクトのドローコール考察的な何か。
【Unity Tips】続!エフェクトのドローコール考察的な何か

・UVスクロール(未検証)
うーん、コレが無いと、わりと基本的な事も出来ないなぁ orz

まあ、日本のゲムがエフェクト盛りだくさんなせいもあるんだよねw

以前も紹介したけど
Unite Japan 2013 エフェクト編 その1

はてさて、Unityの無償版で出来る事なのだろうか(汗
機能比較

関連サイト


エフェクトの他、いろいろの情報がありまする
Unityのエフェクトサンプル

炎のチュートリアル。ログインが必要?
UNITY COOKIE

Unityで作ったサンプル動画。コレリアルタイムで作ったんだぜ、すげーだろっていうプロモ
Unity – The Butterfly Effect feature
爆発とか再現出来るんか?


Asset Editor


高機能なEditor
Xffect Editor Pro

コレもわりと良い Editorかも
FX Maker

Editor買ってたら 安くないぞ  > Unity

Asset

60個のエフェクト集 基本はあるようだけどオブジェクトが透明になるエフェクトは無い?
Shuriken Magic

数は少ない、プロシージャル系のエフェクトをどう再現してるのかが気になる。
FT Magic Effects Volume 02

標準の拡張?
CARTOON EX Easy Editorを


チュートリアル

2013年9月26日木曜日

Tutorial : Softimage : RIG

有償チュートリアルですが、コレは欲しい。

購入リスト入りですよ :p
ttp://cmivfx.com/store/567-Softimage+Python+Rigging+Warmup

2013年9月21日土曜日

memo : FlowMap などなど

良く聞くようになったVectorMap

・NormalMap
・Vector Displacement Map
・Flow Map

ベクトルのデータを、画像RGBデータとして
保持するのがVectorMapなんでしょうか?

ちょっと理解が怪しいのです;;;


Normal Map

法線のXYZの情報をRGBとして置き換えます。

ローカル,グローバルがあり、注意が必要です。

リアルタイムでよく使われるのですが、
ローカルのノーマルマップの
Yの方向はポリゴンの法線から導きだせますので
R,B,のみを使う事があります。
余ったGのチャンネルには好きな情報を入れます

多くがマテリアルのマスク情報ではないでしょうか?

また、UV情報と連携しますので、UVが必要となります


Vector Displacement Map

3Dの形状をテクスチャとして格納し、
それを3Dデータとして復元するものです

グレースケール画像を利用する、Displacementは
高さしか格納出来なかったのですが
3D化する事で、切り立った崖の
オーバーバンクを再現する事も出来ます。



モデルに適用、レンダリング時に適用と、
様々な用法は可能ですが

・テクスチャの解像度が伸びてしまう
・形状が把握しにくい

との問題がありますので、
ある程度はモデリング、スカルプトとして活用した方が
理にかなっていると思います。


Flow Map

Flow Mapこれはテクスチャに流れの情報を加えるものです。
NormalMapと同じような作りですが、
法線情報は必要ないため、rgを使います。

こういった表現が可能になります


元サイト
一番表現として大きいのが流れの制御ですね。
いままでは、UVスクロールとして扱っていたのですが、
それで、出来なかった表現が可能になります。
扱いもテクスチャ一枚で良いので簡単です

またコレを、組み合わせて利用した事例としてPortal2があります。
コレの記事がGDC2011でありました
GDC2011
ちと難しい orz


FlowMapを作れるソフト

さて、このFlowMap、どうやって描くんだよ?

とアーティストは悩めるんですが。
もちろん、根性で手でかいてもかまいません。

が、めんどくさいのでツールを利用しましょう

Flowmap Generator
3D人さんで紹介されてました
値段が安いですね :p

スタンドアロン25ドル
Unity 40ドル


Flow Map Painter
現在フリーなのかな?
エカキヤさんのHPでいろいろ使っておられます > リンク
エフェクトの制御に使えるみたい


Mari
かなり高価になりますが、Mariで直接ペイント可能です

What's new in MARI 1.6 from The Foundry on Vimeo.


Mariのチュートリアル


が、利用には、大きくShaderが絡んでくる
可能性があります。

Shaderもツールとして用意してくれれば良いのですががが
なかなか難しいかも orz

2013年9月20日金曜日

Memo : Softimage 日々の作業 :p

Softimage で作業をしててメモ


Softimage Plugin

 Normal Align 0.5
 を入れて使ってみる。UndoするとNullが残る。
 コマンドで、やってる系みたい。


Softimaeg <>3D - Coat

 先方データーのハイモデルをリトポ作業中。
 映像用なので重い重い。
AppLinks
 を取り入れてみた。 なんぞこりゃ。こんなに便利だったんか orz
 UVも3DCoatの方がリアルタイムで更新してくれるので、コッチで良いかも。


Softimage "N"キー とスナップ

 Nキーで新しいポリゴンを作成するとき、
 スナップをさせたとしても、
 3点目でプレーンが決定されるのは仕様?
 リトポの時、スナップでモデリングしたいのだけど、
 4点目でずれる。ガッデム :p
 こういった微妙な仕様わかんないんだよね。

 UKOKUさんに、"平面性の保持のオプションが入ってる"からじゃね?
 との返答。

 スナップのオプションばかり見てました orz
 確かにプリファレンスの ポリゴン の所にオプションがありました

 ありがとうございます


Softimage >Mari


 MariはUVのオーバーラップを認めてない。
 重ねているオブジェクトはペイント出来ないのだ。
 コレで困るのが、左右対称のキャラクター等
 とはいえ半分でペイントするにも忍びない。

 というわけで、
 ポリゴンをミラー複製のスクリプトに、ちょっと追加した。
 やってる事は
・ポリゴンの-Xを削除
・ポリゴンのローカルシンメトリー
・-X座標のポリゴンUVのUを +1

 これで、Mariでは違うパッチとして読み込まれる。

 作業中パッチのコピーで、シンメトリーは出来るし、
 最終の書き出しに不必要なテクスチャを捨てれば良い。


Substance Designer : C++ : Swizzle演算子

SubstanceのパラメータにSwizzle Float なんてデータがある。
Swizzleって、何よ?って思ってたので調査。

どうやら、ベクトルのxyzwの
計算式を扱いやすくするものみたい。
CGとかで見た事がある。

コレをC++での実装を試みたサイトを発見。

swizzle 対応ベクトル演算クラスについて

結局Substanceを使いこなすには数学の知識も必要ってことですね orz
しかしSubstance パラメーターにキーを打てれば、
アニメーションも可能だよな。

単体で出来るんだろうか :p

2013年9月17日火曜日

Memo : C++ : ゲーム開発者のための C++11/C++14



メモー

MEMO : IES,ImageMagick,衛星画像

とりあえずメモ

IES

CGcompo IES

照明データとTools


ImageMagick

ImageMagick
日本語の説明ページ

コマンドラインでの画像コンバーター、サイズの変更などが出来る
MAYAのimconvertがコレにあたるらしい

よく、Blogなどで画像処理をするのがこの手のソフトらしい。
なるほどね、

最近扱う画像、データが膨大になって、
自動処理を行わないと間に合わず、
さらに、それを整理するべく
データーベース等活用しないとマズイ気がしてきた

というか、DTPで活用してないのが不思議だな > オレ orz


ランドサット衛星画像

ランドサット衛星画像を使う
ちょっと画像の調べ物をしてて、思い出したのでメモ
衛星画像は異なる波長を複数とらえるので、RGBよりも数が多い
・・・地形制作の人は知っていてもそんは無いかも


驚くべき計画都市、モヘンジョ・ダロ

こんな記載が

可視域の
バンド3 (630~690ナノメートル)、
バンド2 (520~600ナノメートル)、
バンド1 (450~520ナノメートル)
に赤、緑、青色を割り当ててカ ラー合成したので、
肉眼で見たのと同じ色合いとなります。

だそうです。かっこいいぜ人工衛星 :p

ちなみに標高はどうやって測るんだろうね?
もう一機の人工衛星と3点測定?

EF-12 : [TGSにあなたのキャラ/ステージを一緒に出そう!]コンテスト 結果発表!

背景部門で、2位でした ドンドン

EF-12 TGSコンテスト

キャラクター部門の一位は
3D人の中の人 ymt3Dさん
安定のクオリティです

背景部門の一位は Alidadeさん、
溶岩ステージですね〜。

どうやって作ったんだろ〜

自分の場合、モデリングは極力シンプルに(手を抜いて
テクスチャで使って勝負(dDo任せ orz
との目標でしたが、画角、サイズ等の調査ミスで、

すり鉢上の内部はほとんど表示されないという
なんとも残念な状態になってしまいました。 orz

コレに懲りず、
いろいろやってみたいと思います。


2013年9月13日金曜日

SubstanceDesigner : 導入その一

あいかわらずチラシのウラです

どんなツール?
プロシージャルテクスチャツール
・ノードベース
・3Dでの使用も可能?
・ペイントツールがついてた(bitmap)
・Photoshopと連携
・.sbsファイルを作成し、それを各アプリで読み込める。(それ自体がテクスチャ)
・.sbsにはあとで、変更可能なパラメータを埋め込める。
・MAYA,3dsMax,Unity,UnRealが対応
・テクスチャのデータサイズが縮小する

おとつい購入した3.6が3.7になった :p
ダイアログからアップデートをチェックDL > インストールで3.7

インストール

という訳で導入
インストール等は他のサイトを参考に。
特に問題になるような事は無かった


Sample : 保留


起動時にサンプルを選択すると、フォルダ選択ダイアログが現れる
インストールフォルダに該当するSampleフォルダがあり、
指定してみたが上手く行かず
HELPも新しくフォルダを作るとか書いてあってチンプンかんぷん
画像リンクも外れてる :p


2D Paint

普通に導入されてました。知らなかった。



かなり高機能ですしかし以下の操作がありません。
・Undo(バグ?)
・レイヤー機能


3dsMAX : 部分保留

3dsMax2014では標準でサポートしているので、特に問題無し

Plugin 2012verはあるのに 2014?とかは?
2012のPluginを2014に入れられるか謎

データをどこに置くかが問題
テクスチャ画像と同じように考えていいのかしら


Unity : テスト

マニュアルの該当ページ
・sbs (未コンパイル)は使えない
・sbsar (コンパイル済み)が利用できる(プリセットには入っている)
※要確認 sbsarの作り方
 ・publish select element(s) で行けた。 保存、Player、パブリッシュの所にある。(2015 09 20追記)
・適用は問題なし
・terrainでは利用できなかった。プロシージャルテクスチャに対応してない?
 せっかく3Dの要素があるのだから対応して欲しいものだ。
・ダブルクリックでSubstanceDesignerが立ち上がる。便利
が、立ち上がってくるのは .sbsarなので編集の余地無し・・・おおう orz


適用の仕方


・Assetsに追加(.sbsar)
・一度小さい三角をクリック、開いてから、中のテクスチャをD&D
(わからずに困ってた)

雑感
プリセットだと簡単すぎる。
同じような画面のゲムがあふれるだろうな~ orz
あと、プレビューまでが非常に簡単なので、
一覧表を作るのには向いているかも


250のプリセットの把握 : 未

出来る訳が無い。なんらかのツールが必要だ orz
プリセット、3.6 -> 3.7 で変換が必要になる


随時更新が必要かもな〜

2013年9月10日火曜日

memo : こだわり物理エンジン

こだわり物理エンジン



MITライセンスで自由に使えるんだって :p
UnityとC#のコードらしい・・・。

C#かーーー。 < 良くわかってない。


近況
キャラのモデリングをしたり、
エフェクト調べたり。


あとAllegorithmicがセール(2013 09 15まで)をしてたのでセット購入
・Substance Designer
・BitMap2Material
・250のセットなど
690ドルなり


EF-12の作業をやってみて、
マルチテクスチャのめんどくささを知った。
正直なところ、手がかかる。
これは、制作コストが上がるはずだ


背景となると、制作リソースは限られるので、
なるべく早期に完成へ近づけ、
あとはブラッシュアップに回したい。
テクスチャも下地だけでも自動化したい所。


Substance Designerについては
以前から情報を追っており、
一月ほど前、Steamで非商用版を買っていた。

BitMap2Materialsも欲しかったので、
コレを機に買ってしまった
(無駄になったけど)

MAYA,MAX,Unityが対応(SIが無いが)
というのも大きい

dDoはあれど、あれは速度が遅く、
サイズの大きな建物は苦手で、
車以下のサイズが望ましいように思える

(基本がPhotoshopのフィルタなどで、小さい影響範囲とか難しい

フィルタ系を調整すれば良いのだが、
今度は速度がネックで
時間がかかってそれどころではなかったり

時間があるときにプリセットを作っておくと便利

あと、リピートが考慮されないため
大規模なタイルパターンには向いてなかった orz


AutoDeskの保守費が消えたという
言い訳を述べてみた

2013年9月6日金曜日

GameEngine : neoaxis

NeoAxisという、ゲムエンジンがあるようです。
とはいっても自分が気にしたのは
Align ツールの機能の一部。
スクリーンショットがあったので
ツール制作に流用出来ないかチェックします


・ランダム


・垂直方向へのそろえ


・StepMove(そろえもあり)



垂直方向にそろえるとか便利ですね〜
いつも手作業でやってますが、
こういった繰り返しの多いツールが
作業効率を上げるんですな。


GameEngineは進化が早く、
大規模背景等、作業量も多いので
こういった最適化は必須意ですね。

DCCツールもなるべく効率化出来るよう、
改造したいですね。:p

2013年9月2日月曜日

Photoshop Script : EF-12 DDS書き出しツール

最近のシェーダーは複数のテクスチャを利用し、
表現力をあげるのですが、
EF-12も例外ではありません

EF-12 スタンダーとマテリアルの設定
リンク先にあるように非常にたくさんの設定があります。

が、以下の作業がとても面倒でした。

異なるテクスチャ素材から、目的のフォーマットのDDSを制作する

スーパー超絶面倒。
なのでPhotoshopのスクリプトで自動化します

目的

Photoshopで異なる複数のテクスチャから、
目的のDDSを書き出す



EF-12より、この辺りの作業です


ツール

・Windows (Nvidiaのツールが動くのがWIndowsなので)
・Photoshop CS5(スクリプトが使えれば多分OK)
・Photoshop Plugin Nvidia DDS

PluginであるNvidiaのDDSツールもスクリプトから制御出来ました。
超便利。コレだけでも調査したかいがあった〜


素材


以下のテクスチャ素材

そのままDDSに書き出す素材
・_d デカール
・_n ノーマル

Dentに合成するテクスチャ
・_h 高さ
・_ao 遮蔽

Glossに合成するテクスチャ
・_s 輝度
・_pow 硬度

です。ちょっとここらアタリ、調査不足でしたので命名規則は適当です orz


流れ


画面の開発環境はCS6です、実行はCS5でした :p


Photoshopで以上の6種類のテクスチャを開きます。

で、こういった順で処理をします。

_dnttテクスチャの作成
_h > dnt の Rチャンネルに
_ao > dnt のBチャンネルに
_dnt > DDS(DTX5_NM形式) で保存

_glossテクスチャの作成
_s >glossのRチャンネルに
_pow > glossのBチャンネルに
_gloss > DDS(DTX5_NM形式) で保存

_d > DDS(可変あり) で保存
_n > DDS(DTX5_NM形式) で保存


です。計6種類のテクスチャを
4種のDDSテクスチャにまとめ書き出しました


Photoshop Script


そのコードです
1日で作った付け焼き刃ですので、
エラー処理など、効率化などはしておりません

サンプルとして見てください
//mergeTex
//20120831 savedds
//EF12用にカスタム

debug = true


// 初期設定===========================================================
ex1 = ["dnt","h","ao","",""]
ex2 = ["gloss","s","pow","",""]
strDeffuse = "d"
strNormal = "n"

DXT1_RGB        = 0;
DXT1_RGBA_1Bit  = 1;
DXT5_RGBA       = 3;
DXT5_NM         = 24;

closeNewDoc = true;

function log(in_data){
    if (debug ) alert(in_data)
    }


//SAVEDDS =======================================================
function saveDDS(in_path,in_ddsType){
 var idsave = charIDToTypeID( "save" );
  var desc14 = new ActionDescriptor();
  var idAs = charIDToTypeID( "As  " );
   var desc15 = new ActionDescriptor();
   var idbarF = charIDToTypeID( "barF" );
   desc15.putBoolean( idbarF, true );
   var idfdev = charIDToTypeID( "fdev" );
   desc15.putDouble( idfdev, 3.000000 );
   var idfbia = charIDToTypeID( "fbia" );
   desc15.putDouble( idfbia, 0.000000 );
   var idurad = charIDToTypeID( "urad" );
   desc15.putDouble( idurad, 5.000000 );
   var iduamo = charIDToTypeID( "uamo" );
   desc15.putDouble( iduamo, 0.500000 );
   var iduthr = charIDToTypeID( "uthr" );
   desc15.putDouble( iduthr, 0.000000 );
   var idxstf = charIDToTypeID( "xstf" );
   desc15.putDouble( idxstf, 1.000000 );
   var idxthf = charIDToTypeID( "xthf" );
   desc15.putDouble( idxthf, 1.000000 );
   var idqual = charIDToTypeID( "qual" );
   desc15.putInteger( idqual, 71 );
   var iderdi = charIDToTypeID( "erdi" );
   desc15.putBoolean( iderdi, false );
   var iderdw = charIDToTypeID( "erdw" );
   desc15.putInteger( iderdw, 1 );
   var idusfa = charIDToTypeID( "usfa" );
   desc15.putBoolean( idusfa, false );
   var idtxfm = charIDToTypeID( "txfm" );
   desc15.putInteger( idtxfm, in_ddsType );//ddsType
   var idweig = charIDToTypeID( "weig" );
   desc15.putInteger( idweig, 0 );
   var idtmty = charIDToTypeID( "tmty" );
   desc15.putInteger( idtmty, 0 );
   var idmmty = charIDToTypeID( "mmty" );
   desc15.putInteger( idmmty, 32 );
   var idsmip = charIDToTypeID( "smip" );
   desc15.putInteger( idsmip, 0 );
   var idbina = charIDToTypeID( "bina" );
   desc15.putBoolean( idbina, false );
   var idprem = charIDToTypeID( "prem" );
   desc15.putBoolean( idprem, false );
   var idfilm = charIDToTypeID( "film" );
   desc15.putBoolean( idfilm, false );
   var idalpb = charIDToTypeID( "alpb" );
   desc15.putBoolean( idalpb, false );
   var idbord = charIDToTypeID( "bord" );
   desc15.putBoolean( idbord, false );
   var idbrdr = charIDToTypeID( "brdr" );
   desc15.putDouble( idbrdr, 0.000000 );
   var idbrdg = charIDToTypeID( "brdg" );
   desc15.putDouble( idbrdg, 0.000000 );
   var idbrdb = charIDToTypeID( "brdb" );
   desc15.putDouble( idbrdb, 0.000000 );
   var idmmft = charIDToTypeID( "mmft" );
   desc15.putInteger( idmmft, 2 );
   var idfdcl = charIDToTypeID( "fdcl" );
   desc15.putBoolean( idfdcl, false );
   var idfdaf = charIDToTypeID( "fdaf" );
   desc15.putBoolean( idfdaf, false );
   var idftworl = charIDToTypeID( "f2rl" );
   desc15.putDouble( idftworl, 0.500000 );
   var idftwogl = charIDToTypeID( "f2gl" );
   desc15.putDouble( idftwogl, 0.500000 );
   var idftwobl = charIDToTypeID( "f2bl" );
   desc15.putDouble( idftwobl, 0.500000 );
   var idftwoal = charIDToTypeID( "f2al" );
   desc15.putDouble( idftwoal, 0.500000 );
   var idfddl = charIDToTypeID( "fddl" );
   desc15.putInteger( idfddl, 0 );
   var idfafm = charIDToTypeID( "fafm" );
   desc15.putDouble( idfafm, 0.150000 );
   var idbafh = charIDToTypeID( "bafh" );
   desc15.putDouble( idbafh, 0.500000 );
   var iddthc = charIDToTypeID( "dthc" );
   desc15.putBoolean( iddthc, false );
   var iddthzero = charIDToTypeID( "dth0" );
   desc15.putBoolean( iddthzero, false );
   var idsmth = charIDToTypeID( "smth" );
   desc15.putInteger( idsmth, 0 );
   var idfilg = charIDToTypeID( "filg" );
   desc15.putDouble( idfilg, 2.200000 );
   var idfieg = charIDToTypeID( "fieg" );
   desc15.putBoolean( idfieg, false );
   var idfilw = charIDToTypeID( "filw" );
   desc15.putDouble( idfilw, 10.000000 );
   var idover = charIDToTypeID( "over" );
   desc15.putBoolean( idover, false );
   var idfblr = charIDToTypeID( "fblr" );
   desc15.putDouble( idfblr, 1.000000 );
   var idnmcv = charIDToTypeID( "nmcv" );
   desc15.putBoolean( idnmcv, false );
   var idncnv = charIDToTypeID( "ncnv" );
   desc15.putInteger( idncnv, 1009 );
   var idnflt = charIDToTypeID( "nflt" );
   desc15.putInteger( idnflt, 1040 );
   var idnmal = charIDToTypeID( "nmal" );
   desc15.putInteger( idnmal, 1033 );
   var idnmbr = charIDToTypeID( "nmbr" );
   desc15.putBoolean( idnmbr, false );
   var idnmix = charIDToTypeID( "nmix" );
   desc15.putBoolean( idnmix, false );
   var idnmiy = charIDToTypeID( "nmiy" );
   desc15.putBoolean( idnmiy, false );
   var idnmiz = charIDToTypeID( "nmiz" );
   desc15.putBoolean( idnmiz, false );
   var idnmah = charIDToTypeID( "nmah" );
   desc15.putBoolean( idnmah, true );
   var idnswp = charIDToTypeID( "nswp" );
   desc15.putBoolean( idnswp, false );
   var idnmsc = charIDToTypeID( "nmsc" );
   desc15.putDouble( idnmsc, 4.000000 );
   var idnmnz = charIDToTypeID( "nmnz" );
   desc15.putInteger( idnmnz, 0 );
   var idusbi = charIDToTypeID( "usbi" );
   desc15.putBoolean( idusbi, false );
   var idlien = charIDToTypeID( "lien" );
   desc15.putBoolean( idlien, false );
   var idshdi = charIDToTypeID( "shdi" );
   desc15.putBoolean( idshdi, false );
   var idshfi = charIDToTypeID( "shfi" );
   desc15.putBoolean( idshfi, false );
   var idshmm = charIDToTypeID( "shmm" );
   desc15.putBoolean( idshmm, true );
   var idshan = charIDToTypeID( "shan" );
   desc15.putBoolean( idshan, true );
   var idclrc = charIDToTypeID( "clrc" );
   desc15.putInteger( idclrc, 0 );
   var idvdxone = charIDToTypeID( "vdx1" );
   desc15.putBoolean( idvdxone, true );
   var idvdxtwo = charIDToTypeID( "vdx2" );
   desc15.putBoolean( idvdxtwo, true );
   var idvdxthree = charIDToTypeID( "vdx3" );
   desc15.putBoolean( idvdxthree, true );
   var idvdxfive = charIDToTypeID( "vdx5" );
   desc15.putBoolean( idvdxfive, true );
   var idvfourfourfour = charIDToTypeID( "v444" );
   desc15.putBoolean( idvfourfourfour, true );
   var idvfivefivefive = charIDToTypeID( "v555" );
   desc15.putBoolean( idvfivefivefive, true );
   var idvfivesixfive = charIDToTypeID( "v565" );
   desc15.putBoolean( idvfivesixfive, true );
   var idveighteighteight = charIDToTypeID( "v888" );
   desc15.putBoolean( idveighteighteight, true );
   var idalph = charIDToTypeID( "alph" );
   desc15.putBoolean( idalph, false );
   var idusra = charIDToTypeID( "usra" );
   desc15.putBoolean( idusra, false );
   var idusfs = charIDToTypeID( "usfs" );
   desc15.putInteger( idusfs, 0 );
   var idprev = charIDToTypeID( "prev" );
   desc15.putBoolean( idprev, false );
   var idrdep = charIDToTypeID( "rdep" );
   desc15.putInteger( idrdep, 3000 );
   var idlomm = charIDToTypeID( "lomm" );
   desc15.putBoolean( idlomm, false );
   var idsflp = charIDToTypeID( "sflp" );
   desc15.putBoolean( idsflp, false );
   var idlflp = charIDToTypeID( "lflp" );
   desc15.putBoolean( idlflp, false );
   var idscar = charIDToTypeID( "scar" );
   desc15.putDouble( idscar, 1.000000 );
   var idscag = charIDToTypeID( "scag" );
   desc15.putDouble( idscag, 1.000000 );
   var idscab = charIDToTypeID( "scab" );
   desc15.putDouble( idscab, 1.000000 );
   var idscaa = charIDToTypeID( "scaa" );
   desc15.putDouble( idscaa, 1.000000 );
   var idbiar = charIDToTypeID( "biar" );
   desc15.putDouble( idbiar, 0.000000 );
   var idbiag = charIDToTypeID( "biag" );
   desc15.putDouble( idbiag, 0.000000 );
   var idbiab = charIDToTypeID( "biab" );
   desc15.putDouble( idbiab, 0.000000 );
   var idbiaa = charIDToTypeID( "biaa" );
   desc15.putDouble( idbiaa, 0.000000 );
   var idsiar = charIDToTypeID( "siar" );
   desc15.putDouble( idsiar, 1.000000 );
   var idsiag = charIDToTypeID( "siag" );
   desc15.putDouble( idsiag, 1.000000 );
   var idsiab = charIDToTypeID( "siab" );
   desc15.putDouble( idsiab, 1.000000 );
   var idsiaa = charIDToTypeID( "siaa" );
   desc15.putDouble( idsiaa, 1.000000 );
   var idbiir = charIDToTypeID( "biir" );
   desc15.putDouble( idbiir, 0.000000 );
   var idbiig = charIDToTypeID( "biig" );
   desc15.putDouble( idbiig, 0.000000 );
   var idbiib = charIDToTypeID( "biib" );
   desc15.putDouble( idbiib, 0.000000 );
   var idbiia = charIDToTypeID( "biia" );
   desc15.putDouble( idbiia, 0.000000 );
   var idoutw = charIDToTypeID( "outw" );
   desc15.putBoolean( idoutw, false );
   var idclcL = charIDToTypeID( "clcL" );
   desc15.putBoolean( idclcL, true );
  var idNVIDIADthreeD_DDS = stringIDToTypeID( "NVIDIA D3D/DDS" );
  desc14.putObject( idAs, idNVIDIADthreeD_DDS, desc15 );
  var idIn = charIDToTypeID( "In  " );
  desc14.putPath( idIn, new File( in_path ) );
 executeAction( idsave, desc14, DialogModes.NO );
}


// メモ===========================================================
function folderserch(in_folderPath,aTex,bTex){
    }

function OpneFile(){
filename = "Macintosh HD:ps_text:headline.txt";
fileObj = new File(filename);
flag = fileObj.open("r");
if (flag == true)
{
alert("ファイルを開きました");
fileObj.close();
}else{
alert("ファイルが開けませんでした");
}
}

// チャンネルの移動===========================================================
function moveChannel(sDoc, tDoc, tChan)
    {
        app.activeDocument = sDoc
        //ソースのドキュメントの複製
        dupDoc = activeDocument.duplicate();
        //log(dupDoc.name)
        //統合
        dupDoc.flatten();
        //グレースケール
        dupDoc.changeMode(ChangeMode.GRAYSCALE);

        //コピー
        dupDoc.selection.selectAll();
        dupDoc.activeLayer.copy();
        
        //閉じる
        dupDoc.close(SaveOptions.DONOTSAVECHANGES);
        
        //移動
        //ターゲットをアクティブドキュメントに
        app.activeDocument = tDoc
        
        //チャンネルを指定
        if(tChan == "r") app.activeDocument.activeChannels = [app.activeDocument.channels.getByName( localize('$$$/ColorModes/RGB/ChannelName/Red=Red'))]
        else if(tChan == "g") app.activeDocument.activeChannels = [app.activeDocument.channels.getByName( localize('$$$/ColorModes/RGB/ChannelName/Green=Green'))]
        else if(tChan == "b") app.activeDocument.activeChannels = [app.activeDocument.channels.getByName( localize('$$$/ColorModes/RGB/ChannelName/Blue=Blue'))]
        else if(tChan == "a") { activeDocument.channels.add() }
        //app.activeDocument.activeChannels = activeDocument.channels.length - 1
            
        
        //ペースト
        activeDocument.paste()
        
        return true
        }


// ターゲドキュメント作成===========================================================
function createTragetDoc(in_name)
{
    preferences.rulerUnits = Units.PIXELS;
    w = activeDocument.width.value;
    h = activeDocument.height.value;
    tagetDoc = documents.add(w,h,72,in_name);
    return tagetDoc;
    }
 
 
// ソースファイルの取得===========================================================
function getSorceDoc(in_name){
    docs = documents;
    for ( var i = 0; i < docs.length; i++){
        var dName = docs[i].name
        dName = dName.substring( 0, dName.lastIndexOf(".") );
        if( dName == in_name){
            return docs[i]
            }
        }
    
    return false
    }

// マージのメイン関数===========================================================
function merge(base,r,g,b,a,outname,fPath){
    //最初にドキュメントを作成する
    var newDocName = base + "_" + outname
    var targetDoc = createTragetDoc(newDocName)
    var sorceDoc = false
    
    //r を移動
    if ( r != ""){
        sorceName = base + "_" + r;
        sorceDoc = getSorceDoc(sorceName);
        if ( sorceDoc ){
            moveChannel(sorceDoc,targetDoc,"r")
            }
     }
 
    //g を移動
    if ( g != ""){
        sorceName = base + "_" + g;
        sorceDoc = getSorceDoc(sorceName);
        if ( sorceDoc ){
            moveChannel(sorceDoc,targetDoc,"g")
            }
     }
    
    //b を移動
    if ( b != ""){
        sorceName = base + "_" + b;
        sorceDoc = getSorceDoc(sorceName);
        if ( sorceDoc ){
            moveChannel(sorceDoc,targetDoc,"b")
            }
     }
    
    //a を移動
    if ( a != ""){
        sorceName = base + "_" + a;
        sorceDoc = getSorceDoc(sorceName);
        if ( sorceDoc ){
            moveChannel(sorceDoc,targetDoc,"a")
            }
     }
 
    //savedds
    savePath = fPath + "\\" + base + "_" + outname + ".dds";
    //log(savePath)
    if ( a == "" && b == ""){
        saveDDS(savePath,DXT5_NM);
        }
    else if (a == "") {
        saveDDS(savePath,DXT1_RGB);
        }
    else {
        svaDDS(savePath,DXT5_RGBA);
        }
    
    //ddsを閉じる
    if(closeNewDoc) activeDocument.close();
    
    return true
    }

// sorce2ddsSave dds保存===========================================================
function sorce2ddsSave(baseName, dds,in_prefix, fPath){
    targetName = baseName + "_" + in_prefix;
    sorceDoc = getSorceDoc(targetName);
    if(sorceDoc == false) return;
    
    //アクティブドキュメントの変更(おまじない)
    app.activeDocument = sorceDoc;
    
    //ddsのチェック
    ddsType = 3
    if(String(dds) == "DXT1_RGB") ddsType = DXT1_RGB;
    if(String(dds) == "DXT1_RGBA_1Bit") ddsType = DXT1_RGBA_1Bit;
    if(String(dds) == "DXT5_RGBA") ddsType = DXT5_RGBA;
    if(String(dds) == "DXT5_NM") ddsType = DXT5_NM;
        
    //log(ddsType)
    
    //複製
    dupDoc = activeDocument.duplicate()
    
    //保存
    savePath = fPath + "\\" + targetName + ".dds";
    saveDDS(savePath,ddsType)

    //ddsを閉じる
    if(closeNewDoc) activeDocument.close();
    
    return true
    }


// メイン===========================================================
function main(){
    
    if (app.documents.length ==0){
        alert("Cancel No Docment")
        return;
        //ドキュメントが開かれていない場合処理なし
        }
    try { fPath = activeDocument.path }
    catch ( e ) { alert("pleas saveDocments"); return }
        
    dName = activeDocument.name
    dName = dName.substring( 0, dName.lastIndexOf(".") );
    dName = dName.substring( 0, dName.lastIndexOf("_") );
    
    uDlg = new Window('dialog','サンプル',[200,100,580,380]);
    
    uDlg.sText = uDlg.add("statictext",[10,10,275,10+45], "BaseName");  uDlg.eText = uDlg.add("edittext",[100,10,275,10+20], dName);
    
    uDlg.cBox1 = uDlg.add("checkbox",[10,50,275,50+25], "Merge 1");
    uDlg.r1  = uDlg.add("edittext",[020,80,020+30,080+20], ex1[1]);
    uDlg.g1  = uDlg.add("edittext",[070,80,070+30,080+20], ex1[2]);
    uDlg.b1  = uDlg.add("edittext",[120,80,120+30,080+20], ex1[3]);
    uDlg.a1  = uDlg.add("edittext",[170,80,170+30,080+20], ex1[4]);
    uDlg.out1 = uDlg.add("edittext",[220,80,220+60,080+20], ex1[0]);
    
    uDlg.cBox2 = uDlg.add("checkbox",[10,120,275,120+25], "Merge 2");
    uDlg.r2  = uDlg.add("edittext",[020,150,020+30,150+20], ex2[1]);
    uDlg.g2  = uDlg.add("edittext",[070,150,070+30,150+20], ex2[2]);
    uDlg.b2  = uDlg.add("edittext",[120,150,120+30,150+20], ex2[3]);
    uDlg.a2  = uDlg.add("edittext",[170,150,170+30,150+20], ex2[4]);
    uDlg.out2 = uDlg.add("edittext",[220,150,220+60,150+20],ex2[0]);
    
    uDlg.cBox3 = uDlg.add("checkbox",[10,180,100,180+25], "ddsSave");
    uDlg.deffuse  = uDlg.add("edittext",[80,180,80+30,180+20], strDeffuse);
    uDlg.dList3 = uDlg.add("dropdownlist",[130,180,130+200,180+25],["DXT1_RGB","DXT1_RGBA_1Bit","DXT5_RGBA","DXT5_NM"]);
    uDlg.dList3.selection = 0;
    
    uDlg.cBox4 = uDlg.add("checkbox",[10,210,100,210+25], "ddsSave");
    uDlg.normal  = uDlg.add("edittext",[80,210,80+30,210+20], strNormal); 
    uDlg.dList4 = uDlg.add("dropdownlist",[130,210,130+200,210+25],["DXT1_RGB","DXT1_RGBA_1Bit","DXT5_RGBA","DXT5_NM"]);
    uDlg.dList4.selection = 3  
    
    
    uDlg.okBtn = uDlg.add("button",[220,240,320,240+25], "Create", { name:"ok"});
    

    //ボタンを押されたときの設定
    
    //view_1
    uDlg.okBtn.onClick = function (){
        if(uDlg.cBox1.value) merge(uDlg.eText.text,uDlg.r1.text, uDlg.g1.text, uDlg.b1.text, uDlg.a1.text, uDlg.out1.text,fPath);
        if(uDlg.cBox2.value) merge(uDlg.eText.text,uDlg.r2.text, uDlg.g2.text, uDlg.b2.text, uDlg.a2.text, uDlg.out2.text,fPath);
        if(uDlg.cBox3.value) sorce2ddsSave(uDlg.eText.text, uDlg.dList3.selection, uDlg.deffuse.text, fPath);
        if(uDlg.cBox4.value) sorce2ddsSave(uDlg.eText.text, uDlg.dList4.selection, uDlg.normal.text,  fPath);
        refresh();
        uDlg.close()
        alert("Finish")
    }

    uDlg.show();
    }

main()


これで、テクスチャの作業に集中出来ます。
といっても、PSD1枚からの必要テクスチャの書き出しが必要かもしれませんが(w


まとめ

で、完成したのが9/1でコンテスト提出日の早朝でした :p
アフォすぎる w

まあ、とりあえずコンテストに応募しました :p
背景ですので、競合は少ないと思いますがw

一番開発に必要なのは
スケジューリングでしたとさw


追記

3D人さんから教わったんだけど。
こんな便利なツールが・・・。

QSM
Quick Save Maps v0.6.4 日本語版 - 勝手に制作!Photoshopにて複数テクスチャを手軽に書き出せる拡張ツール

もうコレで良いよね orz


情報を制したものが強い :p ってことでした。 コード参考にしよう orz