Yearly Archives: 2010

2010-03-26

浮動小数点数0との乗算の最適化

つい 0*n が 0 に最適化されそうな気がしてしまうけど、されるわけは無いよね。0*NaNはNaN何だし。な、NaNだってー!

うーん、仕方ないなぁ、(C ? C*n : 0)とかなら大丈夫かなぁ。いや、おとなしく個別の関数を用意すべきか……。

結局以下のようなクラステンプレートを作って回避した。

template<int C> struct OptimizedFloatMul { static float mul(float n) { return n * C;}};
template<> struct OptimizedFloatMul<1> { static float mul(float n) { return n;}};
template<> struct OptimizedFloatMul<0> { static float mul(float n) { return 0;}};
template<> struct OptimizedFloatMul<-1> { static float mul(float n) { return -n;}};


template<int PLANE_X, int PLANE_Y, int PLANE_Z, int PLANE_W>
struct HomogeneousClipFuncs
{
    static ElementType dotByPlane(const VectorType &p)
    {
    return OptimizedFloatMul<PLANE_X>::mul(p.x)
        + OptimizedFloatMul<PLANE_Y>::mul(p.y)
        + OptimizedFloatMul<PLANE_Z>::mul(p.z)
        + OptimizedFloatMul<PLANE_W>::mul(p.w);
    }

    struct IsInside
    {
    bool operator()(const PointType &p) const{
        return dotByPlane(VectorType(p)) >= ElementType(0);
    }
    };
...
2010-03-22

調査・実験

Direct3D9。1フレームの間に(BeginScene~EndSceneの間に)、一つの(動的)テクスチャに対してCPUから書き換えては描画を何度も繰り返しても大丈夫なものなの? 一応手元のマシンではちゃんと動くみたいだけど。それにしてもDirect3D9はビデオカード/ドライバによって差がありすぎ。こんな大量のCAPSチェックしきれないよ。ユーザーだって自分のハードが何に対応しているかなんて把握していないだろうに。それは結局サポートのコスト増につながるわけで……。せめてDirect3D10が使えればなぁ。XPなんて今すぐ消えて無くなればいいのに。

視錐台クリッピング(Frustum Clipping)。結局ソフトウェアでラスタライズする方も強化せざるを得ないわけで。近平面クリッピングが無いと床や天井みたいなものに使いづらくて困ってたんだよね。基本的にはSutherland-Hodgman clipping algorithmを3Dへ拡張する感じ。つまり、境界面の外側にある辺は削除。境界面をまたぐ辺は外側の頂点を境界面との交点で置き換え。内側の辺はそのまま。後はそれを境界面の数だけ繰り返すだけ。

2010-03-21

新しいディスプレイを注文

と、言うわけで、Amazonで注文。5万円以下で適当に選んだ。今週中に届くかな。

実は19インチ以上のディスプレイを個人で買うのって初めてなんだよね。セカンドディスプレイとの兼ね合いで、配置に困らなければ良いんだけど。本当はセカンドディスプレイ(主に録画機用。現在は15インチ)を大型ワイドにしたいところなんだけどなぁ。