• Direct3D 11のZFUNC設定

    2011年07月15日 00時02分
    前回の続き。

    さらに表示を直して行きます。

    現在はニーソが破れたような感じになっています。
    また、よく見ると上着も穴が空いています。


    理由がよく解らないので、原因を切り分けようと服と体を別々に表示してみました。

    服のみを表示
    服のみ

    体のみを表示
    体のみ


    どちらも正常に表示されています。
    ということは、Z値が正常でないため、前後関係がおかしくなっていると予想されます。

    他の部分についてはZ値が正常に働いているように見えるので
    ほんのわずかな誤差のせいではないでしょうか。

    というわけで、試しにZバッファの精度を落としてみました。

    現在は32bitにしているところを
    1textureDesc.Format = DXGI_FORMAT.DXGI_FORMAT_D32_FLOAT;


    16bitにしてみます。
    1textureDesc.Format = DXGI_FORMAT.DXGI_FORMAT_D16_UNORM;


    微妙に破れた範囲が広がりました。


    あと思いつくのはZFUNCでしょうか。
    ちょっと比較式を変更してみましょう。

    Direct3D 11のZFUNCの設定ですが、例によってSetRenderStateを呼び出してはいオッケーでは無くなっています。
    次の手順が必要です。
    1. D3D11_DEPTH_STENCIL_DESCに深度ステンシルの設定を入れる
    2. D3D11_DEPTH_STENCIL_DESCをID3D11Device.CreateDepthStencilStateに渡してID3D11DepthStencilStateを生成
    3. ID3D11DeviceContext.OMSetDepthStencilStateにID3D11DepthStencilStateをセット
    4. ID3D11DepthStencilStateは終了時にReleaseを忘れずに

    また面倒ですが、このパターンにも慣れてきました。


    これで比較式を変更出来るので、色々な設定で試してみましたが全く改善されません。
    どうもZバッファの問題ではなさそうです。
  • Direct3D 11のカリング設定

    2011年07月13日 22時55分
    前回の続き。

    影が真っ黒になる問題がありましたが、結局原因は解らず諦めました。
    Specularの計算中powを使うのですが、これの結果がやたらとマイナスの値になるため、
    最終的に合算した色が真っ黒になるようです。

    ただ、powに渡している引数を何度確認してもそんな結果になるはずはなく、
    コンパイラかドライバの問題ではないだろうか・・・と思います。

    if文で切ったりすると、powの累乗数の方に渡している変数が0でおかしくなっているような気がするのですが、
    0を直接書くと正常に動いたりするのでもうわけわからんです。

    powの累乗数に0を指定すると不正なのでコンパイラが関数ごとカットしていたりするのかもしれません。
    コンパイル後のバイトコードを確認すればわかるかもしれませんが日曜プログラマがそこまで出来るわけありません。


    とりあえず回避は出来るのでそれで良しとしました。正常に表示されています。
    真っ黒修正版



    次に気になるのは髪の毛ですね。消えてしまっています。
    これはカリングのせいでしょう。MMDはカリングを無効化する必要があるようです。

    Direct3D 11でカリングを設定する方法ですが、
    Direct3D 9のように、SetRenderStateで設定してはい終わり。というわけには行きません。

    次の手順が必要です。
    1. D3D11_RASTERIZER_DESCにラスタライザの設定を入れる
    2. D3D11_RASTERIZER_DESCをID3D11Device.CreateRasterizerStateに渡してID3D11RasterizerStateを生成
    3. ID3D11DeviceContext.RSSetStateにID3D11RasterizerStateをセット
    4. ID3D11RasterizerStateは終了時にReleaseを忘れずに

    超面倒くさいです。
    予めID3D11RasterizerStateを複数生成しておいて、切り替えて使用することを想定した実装なのでしょうが、
    ちょいとカリング設定すっか!というノリで調べ始めたボクはくじけそうです。

    今回はカリング無しに設定しました。
    1D3D11_RASTERIZER_DESC rasterizerDesc;
    2rasterizerDesc.FillMode = D3D11_FILL_MODE.D3D11_FILL_SOLID;
    3rasterizerDesc.CullMode = D3D11_CULL_MODE.D3D11_CULL_NONE;
    4rasterizerDesc.DepthClipEnable = FALSE;
    5rasterizerDesc.MultisampleEnable = FALSE;
    6rasterizerDesc.DepthBiasClamp = 0;
    7rasterizerDesc.SlopeScaledDepthBias = 0;



    裏面がレンダリングされるようになったため、髪の毛が表示されています。
    カリング修正版
  • CentOS5.6(32bit)でdmd2.053を使う話

    2011年07月03日 11時35分
    dmd2.053に付属するlinuxバイナリは、GLIBC 2.11を要求してきます。

    しかし、CentOS5.6(32bit)に入っているGLIBCはだいぶ古いので、
    そのままでは動作させることが出来ません。

    最初GLIBCをバージョンアップしようとしたのですが、
    RPMは無いようですし、ソースからビルドする方法もよくわかりませんでした。


    そこで、dmdの方をCentOS上でビルドしなおしました。


    makeを叩いて出来たファイルで上書きするだけです。
    # cd dmd2/src/dmd/
    # make -f linux.mak
    # mv dmd ../../linux/bin32/



    druntimeも同様です
    # cd dmd2/src/druntime/
    # make -f linux.mak
    # mv libdruntime.a ../../linux/lib32/



    普段はダウンロードしたバイナリをそのまま使っているだけなので、
    自分でビルドするという発想はなかなか出てこないものです。
  • SysTimeとimmutable

    2011年06月29日 23時16分
    日付型は自作のclassを使っていたのですが、
    せっかくstd.datetimeが入ったので置き換えました。

    その中にimmutableなclass内にSysTimeが入るケースがありまして、ここでエラーが出ました。
    1import std.datetime;
    2
    3immutable
    4class Homuhomu
    5{
    6    SysTime time;
    7
    8    this(SysTime t)
    9    {
    10        time = t;
    11    }
    12}


    test.d(10): Error: function std.datetime.SysTime.opAssign (ref const const(SysTime) rhs) is not callable using argument types (SysTime) immutable
    test.d(8): Error: constructor test.Homuhomu.this missing initializer for final field time


    コンストラクタではなくopAssignが呼ばれてしまい、エラーになるようです。


    C++のように初期化リストが有ったか?と思ったけど、これは無かった。
    1this(SysTime t) : time(t) // この書き方は無い



    仕様として合ってるかは不明ですが、一応次の様に書くとコンストラクタが呼ばれるような気がします。
    (コピーコンストラクタは無いのでstdTimeを介して渡す)
    1this(SysTime t)
    2{
    3    time(t.stdTime);
    4}


    でも、コンストラクタを呼べと怒られてしまいます。実際は呼べてないのかもしれません。
    test.d(8): Error: constructor test.Homuhomu.this missing initializer for final field time



    困り果てた僕は救いを求めてD言語スレに書き込みました。

    (#゚Д゚) < immutableがクサッテル!!



    すると心優しい住人が答えてくれました。

    (゜Д゜)< immutableなんか使う奴は池沼



    おかげで僕のガラスハートはブロークンですが、
    なんやかんやで回避方法を思いつきました。

    1import std.datetime;
    2
    3//immutable
    4class Homuhomu_
    5{
    6    SysTime time;
    7
    8    this(SysTime t)
    9    {
    10        time = t;
    11    }
    12}
    13alias immutable(Homuhomu_) Homuhomu;


    これで試した範囲では正常に動いています。
    1auto homuhomu = new Homuhomu(Clock.currTime());


    回避は出来たけどそもそもどこが悪いのかよくわからない。
  • STYLISTIC Q550/Cを買った話

    2011年06月18日 23時02分
    最近流行のタブレットを買ってみました。

    流行のといいつつiPadでもAndroidでもなく、Windowsです。
    富士通の「STYLISTIC Q550/C」を買いました。

    法人向けモデルで、店頭販売もされていなく、
    買った人は珍しいと思うので、どんな感じか書いておこうと思います。

    また、Oak trail搭載機の中では早く出た方なので
    Oak trailの性能を見るにも良いかもしれません。

    スペック詳細は富士通公式を参照ください。

    ちなみに個人でこれを買うには直接富士通の購入相談窓口に電話するしかないと思います。
    おねーさんが丁寧に対応してくれました。


    外側


    本体重量(バッテリー込) 722g
    本体重量


    バッテリー単体重量 172g
    バッテリー重量


    チャンピオン 670g
    チャンピオン
    比較対象チャンピオン。
    チャンピオンよりちょっと重いくらい。


    サイズもチャンピオンと比較
    サイズ比較
    写真の角度が難しかったので解りにくいが、チャンピオンより一回り大きい。


    厚さは丁度チャンピオンの半分くらい。



    中側


    Windows エクスペリエンスインデックス
    エクスペリエンスインデックス
    CPU < GPUなのがちょっと意外。
    まぁ元々この数値の大小の意味もよくわからんですが・・・


    CrystalDiskMark
    CrystalDiskMark
    Readは結構早い。でもWriteが遅い。
    CPUとGPUが遅いからバランスは取れてるのかもしれない。


    H.264ビデオ再生
    H.264ビデオ再生
    動画のハードウェアデコード対応してた?と思い再生テスト。
    1920 * 1080で30fpsのプログレッシブ
    685Mで23分36秒のH.264動画だから音声差し引いて3.7MBit/secくらい?

    なんとか再生出来てるけど、CPU使用率は大変なことに。
    表示も時々乱れるからデコードが追いついてないときがあるのかも。

    Youtubeやニコニコくらいならいけそうだけど、
    録画したアニメとか見るなら専用にエンコードしないとだめかも。



    使用感

    さすがにWindows7は無理があるのか基本もっさり。
    Aeroを無効化すると若干軽くなる気がするのでGPU側が足を引っ張っていそう。
    Direct3D 9世代のGPUなので当然と言えば当然なのか。

    Aeroが重いせいかもしれないが、
    プリインストールの文字タッチ入力パネルが重い。
    元々の用途として長文入力するようなことは無いと思うが・・・

    発熱が気になる。
    全体で放熱するようなタイプではないので、CPUが有ると思われる部分が結構熱くなる。
    (裏側のメビウスのロゴ辺り)
    温度計が無いので正確ではないが、アイドル時でも40度近くまで上がっていそう。