2013年1月24日木曜日

[Unity]モバイル向けのShaderのメモ


Shaderの勉強のためのメモ
モバイル向けに使用できるものを中心にメモしていく。
まずは基本から。

◆バーテックスシェーダー
頂点データを使用して算術的に3D空間のデータに特殊効果を与えるグラフィックス機能。
Cg、GLSL、HLSLなどで扱える。

◆フラグメントシェーダー
ピクセルシェーダーとも呼ばれる。
ピクセル操作に特化したシェーダー。
基本的に頂点シェーダの情報を元にピクセルを操作するので、バーテックスシェーダーと同時に使用することが多い。
Cg、GLSL、HLSLなどで扱える。

◆ジオメトリシェーダー
プリミティブシェーダーとも呼ばれる。
プリミティブを作成できる。
バーテックスシェーダーの実行後にジオメトリシェーダーが実行される。
アセンブリ言語、Cg、GLSL、HLSLで扱える。

◆Unity内のシェーダー言語
Cg/HLSLを合わせて拡張したようなもの。
なので、基本的にはCg/HLSLが扱えれば問題ない。
Shader言語は初なのでまずは基本的なところから学習。
データ型
float - 32bit浮動小数点型
half - 16bit浮動小数点型
int - 32bit整数型
fixed - 12bit固定小数点型
bool - 論理型
sampler - テクスチャーオブジェクト型

その他にfloat3、float4x4などがあり、
ベクトルや行列を扱う型も存在する。

◆参照


◆実行順
Vertex Shader
Fragment Shader

の順番で実行される。

下位のシェーダーはモバイルでは使用できない
というかDirectX11向けに改良された点が多いので、モバイルは制限が多く感じられるのかもしれない。
 - geometory
 - hull
 - domain

◆セマンティクス
Shader言語で関数を記述する際に使用することがよくある。
関数宣言の構文についてと合わせて参照するとよい。
関数の戻り値に対しても、引数の型に対しても、使用目的の識別子として扱われる。
↓関数宣言の構文について

↓セマンティクスについて

よく使われるセマンティクス
シェーダー毎に挙動が異なることが多いので、使用する際にシェーダーとセマンティクスがどういう挙動になるか確認をした方が良い。

POSITION - オブジェクトの頂点位置を読み取る
SV_POSITION - オブジェクトの頂点位置の読み込みと書き込みが可能(DirectX10以降)

2013年1月23日水曜日

[Unity]Shaderのメモ-①-

UnityでShaderをいじるのでメモ。
分からないキーワードが続々出てきたので、とりあえずコードに記載されているものの説明から始めようと思う。
説明はコード上に記載。
※説明内容はprogramを知らない人が何となく理解できるような言葉で敢えての説明文、というか自分が理解するためのとっかかりとしてメモしたものなので分かりづらかったらドキュメントを見た方がいい。

// Shaderのネームスペース
Shader "Custom/Basic" {
 // Unity用に最適化したシェーダーの実行命令形態
 SubShader {
  // 複数のシェーダーをまとめて扱うためのおまじない。
  // パイプラインをまとめる(Pass)
  Pass {
  // Cgプログラムでシェーダーを使いますよっていうおまじない
  CGPROGRAM
  
  // "#pragma"はスニペット
  // "#pragma vertex"でバーテックスシェーダーを使用する旨を伝える、引数はファンクションネーム
  // "#pragma fragment"でフラグメントシェーダーを使用する旨を伝える、引数はファンクションネーム
  #pragma vertex vert_function
  #pragma fragment frag_function
  
  // 型 関数名(引数型 引数名) : 適応範囲
  float4 vert_function(float4 vertexPos : POSITION) : SV_POSITION {
   // mulは乗算、UNITY_MATRIX_MVPは演算適応範囲でMVPだとModel*View*Projection(射影行列)、で残りの引数が実効値
   return mul(UNITY_MATRIX_MVP, float4(1.0,0.1,1.0,1.0) * vertexPos);
  }
  
  // 型 関数名(引数型) : 適応範囲(フラグメントの色)
  float4 frag_function(void) : COLOR {
   return float4(1.0, 0.6, 0.0, 1.0);
   // (red, blue, green, alpha)
  }
  // Cgプログラムのシェーダーはここで終了ですよっていうおまじない
  ENDCG
  }
 }
}

詳細を知りたい場合はドキュメントを参照
日本語版もある。
「docs」の後に「-jp」を付ければ日本語版に早変わり♪

2013年1月17日木曜日

[Unity]Androidへのパブリッシュ時のテクスチャーについて


Android用(2.2)にパブリッシュした時にテクスチャーが自動で変換されたので何事かと思ったのでメモ。
どうやら仕様のようだ。

以下、Unityの公式サイトからの抜粋。

テクスチャーの圧縮について
ビルド設定には Texture Compression/テクスチャーの圧縮 という項目があります。
Unity の初期設定では、特に指定が無い場合ETC1/RGBA16 というテクスチャーフォーマットが使用されます。
テクスチャーフォーマットのオーバーライドについてはテクスチャー 2D / プラットフォームごとのオーバーライドを参照してください。
特定のハードウェアアーキテクチャを対象とするアプリケーションアーカイブ ( .apk ファイル) をビルドする場合、テクスチャーの圧縮オプションを使ってデフォルト設定をオーバーライドすることができます。
圧縮しないよう指定したテクスチャーはどれもそのままで、圧縮フォーマットを使用しているテクスチャーだけが、オプション内で指定されたフォーマットで圧縮されます。
そのテクスチャー圧縮をサポートしているデバイスのみにデプロイが限定されるよう、Unity が所定フォーマットのタグを含めるようにAndroidManifest を編集します。
こうすることで Android Market のフィルターメカニズムが、適切なグラフィックハードウェアを持つデバイスだけにアプリケーションを提供できるようになります。

Androidの共通フォーマットがETC1というもので、アルファチャネルがサポートされていない。
Android version 2.2 (Froyo)からサポートしている。
この辺はwikiを見ればわかるが、問題発生。
汎用向けにパブリッシュすると画像が綺麗じゃない。
そこでツールを探してみた。
有用と思われるものを2つ見つけたのでリンクを貼っておく。

OPTPiX imesta 7 for Mobile & Social

6ヶ月のレンタル方式で29,800円なり。
値段だけで判断すると一つのツールとしてはやや高めな気もするが、
画像のデータサイズを圧縮する機能は当然として、Photoshopとの連携機能やJavaScriptフィルタの機能、マクロ機能、マルチイメージ生成機能など
特筆すべきものがたくさんあった。
導入事例を見ても、大手起業さんの名が連なっているので信用もある。

Caesium

無料の画像圧縮ツール。
比較的最近できたツールで、特殊なアルゴリズムで元の画像品質を維持しつつデータサイズを削減することに重きを置いているようなので、
PCやiOS向けに作成した画像をそのまま使用した時に便利だと思ったので挙げた。
LifeHackerさんでも紹介されていた。
難点を挙げるとすれば、現状だとWindows版しかないので、LinuxユーザやMacユーザは使用できないこと(Linuxは対応するかもしれないが、Macは対応するつもりはないと公式で発表している)

◆参照

[CodeRunner]C言語のコンパイルエラーの対処の仕方


CodeRunnerでC言語のコードを実行するとエラーが発生する。
以下のようなエラーが出てしまった。

/Users/idac/Library/Application Support/CodeRunner/Languages/2/compile.sh: line 37: clang: command not found
To run code in this language, you need to have compilers installed. These are bundled with Xcode which can be downloaded through the Mac App Store or Apple's developer site.
If you are using Xcode 4.3 or later, you need to open Xcode preferences, select the Downloads pane, and choose to install 'Command Line Tools'. This may require an Apple developer account, which is free.

原因はClangコマンドが無いこと。
Xcodeのコマンドラインツールをインストールすれば解決できた。




2013年1月2日水曜日

[Excel]OpenOfficeとMSExcelの日付の設定

とあるデータをMicro soft ExcelからOpenOffice Calcに移行した時に、24時間を超えたかどうかの判別を行っている箇所があったのだが、計算が合わなかった。
調査したところ、アプリケーション毎にシリアル値の設定方法が異なっているようだ。


◆対処方法

A1のセルに比較したい値の数値(日付)があり、その値を特定の時間帯と比較して判別したかった。

計算式は以下:

=IF(TEXT(A1,"m/d hh:mm")>="1/1 00:00","24時間を超える","24時間を超えていない"))

この状態だとMicro soft ExcelとOpenOffice Calcでは計算が異なってしまう。
なぜなら、それぞれのアプリケーションでシリアル値の計算方法が異なるため、
TEXT関数での出力結果に違いが生じてしまうからだ。
具体的に述べると、Micro soft Excelだと、シリアル値"0"を設定した時に"1/0 00:00"という扱いがなされ、OpenOffice Calcだと、"12/30 00:00"という扱いがなされてしまっていた。
そこでMicro soft ExcelでもOpenOfficeでも動作するよう修正してみた。

修正版:
B1:=TEXT(1,"m/d hh/mm")

=IF(TEXT(A1,"m/d hh:mm")>=B1,"24時間を超える","24時間を超えていない"))

修正版では特定の時間帯の計算をシリアル値で行い、その値を元に比較対象の時間と比較を行っている。
これでMicro soft ExcelでもOpenOffice Calcでもうまく動作した。


※ちなみに関数の引数の区切り方は、Micro soft Excelだと「,」、OpenOffice Calcだと「;」です


結局の話、直打ちで計算するなよ……ということ。