2014年01月26日

SurfacePro2

たまたま店頭で触った Surface 2 が予想以上にサクサク動いたので衝動買いしようかと思ったのですが、一応、メモリバカ食いと噂の Google Chrome の動作具合を見るために、その場でダウンロードしてインストールしてみました。
ところがインストーラを起動すると「この環境ではインストールできません」と…。
「この環境では」というのが気になってよくよく見てみたら、Surface 2 に入っているのは Windows8 RT だったんですね。
全然知りませんでした。

というわけで、ノーマル Windows8 が入っているという Surface Pro 2 を注文して既に2週間。
いまだ入荷せずの状態が続いています。品薄だとは聞いていたけど、ここまでだったとは…。
こういうのってキャンセルしたとたんに「入荷しました!」となるのは目に見えているので、気長に待ってみることにします。
posted by JUNOSOFT at 16:05| Comment(0) | 雑談

2014年01月25日

乗算済みアルファ

レンダーターゲットにアルファ付き画像を描画し、それをテクスチャとして別の画面に張り付けると、アルファ合成が二回行われるために透明度が下がってしまう…という問題があります。
これはそういうものだと思って諦め、やらないようにしていたのですが、単に乗算済みアルファ合成を使えばよかったんですね…。

言われてみれば確かにその通りで、簡単に解決する問題でした orz
posted by JUNOSOFT at 11:54| Comment(0) | プログラミング

2014年01月09日

ツリー構造をもったキャラクター

ツリー構造を持ったキャラクターがあるとき、普通に考えると

struct CHARA {
CHARA *ArrayOfChild;
};

のように、親が子を管理することになるのですが、場合によっては子が親を参照していたほうが楽になる場合があります。

struct CHARA {
CHARA *Parent;
};

というのは、親から子をたどっていくと、複数の子を持っている場合はそこで分岐が発生するのですが、子から親を辿って行くのなら分岐は発生しないからです。
キャラクターAがキャラクターBの子孫かどうかを調べるのは大変ですが(世代が離れるほど子孫が増えるので)、逆にキャラクターBがキャラクターAの先祖かどうかを調べるのは、非常に簡単だということです。
さらに、キャラクターごとに子キャラクターの配列を持たせる、なんて必要もなくなり、ただひとつ、親キャラクターへの参照を持つだけで済みます。
当然双方向ではなく子から親への片方向ツリー構造になるため、親から子になにかを伝搬させることは非常に無駄の多い処理になりますが…

例えばキャラクターAの子要素としてキャラクターB,C があり、さらにBの子要素としてDがあり、子要素の座標が親からの相対位置で定義されるような場合、トップダウン方式だとキャラクターAの座標を決め、再起処理などでB,C,Dの位置を決めていくことになります。しかし、もしキャラクター B, C, D が、たまにしか必要のない要素だとしたら?
毎回これらツリーのすべての要素の座標を求めるのは無駄です。そういうときはむしろボトムアップで座標を決めて行きます。Bの座標が必要になったら、その親であるAの座標を見る。まだ決定されていなかったら、そこでAの座標を決定する。Aの座標が決定したらBの座標も決まる。この時点でAとBの座標が分かります。つぎにCの座標が必要になったなら、その親であるAの座標を問い合わせます。Aの座標は既に求まっているので、計算せずにただAの座標を返すだけでOKです。結果的に、その時必要なオブジェクトの座標だけが計算され、その時使われなかったオブジェクトの座標は計算されないままになります。

posted by JUNOSOFT at 13:12| Comment(0) | プログラミング

2014年01月07日

お手軽輪郭線

2Dにしろ3Dにしろ、輪郭線を描画したい!! という需要がまれによくあるんですが、そういう時によく使っている方法です。
やり方は超簡単で、例えば1ピクセル幅の黒い輪郭線を書きたいのなら

位置を(-1, -1)だけずらし、黒で塗りつぶされた物体を描画
位置を(+1, -1)だけずらし、黒で塗りつぶされた物体を描画
位置を(-1, +1)だけずらし、黒で塗りつぶされた物体を描画
位置を(+1, +1)だけずらし、黒で塗りつぶされた物体を描画
本来の位置に、本来の色を使って普通に物体を描画

これだけです。これはポリゴンモデルの輪郭線にも、ドット絵の輪郭線にも使えます。
(ただし、1ピクセル幅の尖った部分を持つ画像などは、その先端部分の輪郭がうまく描画されません。完璧にキレイに描きたい場合は、上記に加えて(-1,0) (+1,0) (0,-1) (0,+1)だけずらした描画が必要になります)

Ace of Wands では、会話用の袋文字を表示するのにこの方法を使いました。

ちなみにこの方法だと、ほとんど重ねた状態で画像を5回描画するため、
物体が半透明だったり、輪郭線だけを半透明にしたい などの場合には対処できません。

まあ、本来ならピクセルシェーダーを活用するべきなのでしょうが、すごくお手軽かつキレイにできるので重宝しています
posted by JUNOSOFT at 12:02| Comment(0) | プログラミング