Blenderで物理シミュレーションを実行するとクラッシュする問題がGPUドライバ更新で解決した

そういえばwindows8に標準で入ってたドライバを使いっぱなしだった。
AMDからradeonのドライバをダウンロードしてインストールするとあっさり解決した。
このときBlenderのバージョンは2.69。2.69未満だとドライバ更新前でも問題は出なかった。

現象は(たとえ起動直後でも)Pキーを押すとBlenderが勝手に終了。
コマンドラインから起動して(他に標準出力/標準エラー出力の内容を表示させる方法を知らないので。以前の版ではデフォだったような)問題を発生させると、Tempにblender.crash.txtを残していることがわかった。
が中身には
# Blender 2.69 (sub 0), Revision: 60995
とだけ書かれていてよくわからない。検索して英語の掲示板っぽいところでAMDのドライバがどうのこうのと書かれていた(たぶんこれとは違う現象だけど)ので試しにやってみたらうまくいった。

もしこれが解決していなかったらPキーが非常に危険な罠ボタンになるところだった。

VS+Pythonのツールのv2.0が出たそうな

Visual Studio 2010/2012/2013で使えるPythonツールがv2.0になっていた。
割と最近だった。1月近く経ってるけど。

Python Tools for Visual Studio」v2.0が正式公開。無償のVS統合パッケージも提供 - 窓の杜 2013/10/29 15:42
http://www.forest.impress.co.jp/docs/news/20131029_621367.html

VSでBOMなしUTF-8の*.pyを保存できたら嬉しいんだけどなぁ。

BillboardのテストやらSaveWICTextureToFile()での保存やら


途中LookAtとLookToの違いに気づかず時間を食った。始点終点を指定するのが前者、
始点と方向ベクトルを指定するのが後者ということに。

  • SaveWICTextureToFile()でBitmapファイルへの保存は無事成功。

GUIDを切り替えてjpgとかもたぶんいける。
自分でD3D11_CPU_ACCESS_READやらD3D11_USAGE_STAGINGやらのテクスチャを用意しなくても関数内部でCopyResource()してくれる模様。
ついでにこのSaveWICTextureToFile()が定義されているDirectXTexのScreenGrab.cpp/hを参考にすればToMemoryもいけそう。内部でMap()/Unmap()してるから。

  • XMMatrixRotationAxisに度数法で渡そうとして時間を食った。

1か月くらい前にDirect2Dで度数法が引数になっていてびっくりしたのと混同していた。

  • 世の中にはテクスチャラッピング(モード)の他にテクスチャアドレッシング(モード)というものがあるらしい。

でもDirect3D11(.1)でラッピングのほうをどう使うかまだわかってない。

  • DepthStencilのStencilのほうの意味を今更ながら理解した。使う場面があるかはさておき。
  • DirectXTKのGeometricPrimitive::Draw()の第4引数を1以上にすると強制的にアルファが無効になるっぽい。ソースを見るとif(alpha<1.f)的なことをしていたから。半透明使いたければ0.99999とかでとりあえずいけた。premultiplied/nonpremultiplied alphaってなんですか。
  • B8G8R8A8_UNORMで今のところ困らないからとりあえず壁にぶつかるまではこれでいこう。
  • 右手系/左手系のY-up/Z-upとか誰かエラい人がえいっで決めてくれないだろうか。DirectX関係でメジャーな左手系Y-upなら嬉しいけど、それほど蓄積があるわけでもないので別に他のでも従いますよ。
  • そろそろいい加減shader使いたい。

DirectWriteでD3D11のテクスチャに日本語を書き込めた

Windows8 SDKのサンプルを使って、テクスチャにDirectWriteで(D3D10関係を経由せず)書き込み、
それをDirect3Dのオブジェクトに張り付けて表示できた。D3D10じゃなくてD3D11のみで。

  • まずID3D11Texture2Dのテクスチャを用意。
  • ID3D11Texture2D::QueryInterface()でIDXGISurfaceを取得
  • それをID2D1DeviceContext::CreateBitmapFromDxgiSurface()に渡してID2D1Bitmap1を取得。
  • それをID2D1DeviceContext::SetTarget()に渡せばID2D1DeviceContextの書き込み先がテクスチャになる。
  • つまりDirectWriteで書き込める。
  • 途中何か所かDXGI_FORMAT_R8G8B8A8_UNORMをDXGI_FORMAT_B8G8R8A8_UNORMに置き換えたりD3D11_CREATE_DEVICE_BGRA_SUPPORTを追加したりした。

DirectXTKサンプルのDirectX::Colors名前空間で定義されている141色(XMVECTORF32)を表示してみた。
141色といっても同じRGB値で違う名前がついているもの(AquaとCyan)もある。Transparentもある。

Windows8+DirectX11(11.1には非対応のビデオカード)の環境で実行。
テクスチャは使いまわしで、フレーム毎に
DirectWriteでテクスチャに文字を描画→DxTKのSpriteBatch::Draw()でスワップチェインにテクスチャを描画
を141回行っている。DxTKを使ったTeapotの描画は1フレームあたり1回だけ。
このとき1フレーム描画にかかる時間は306msで3.2fps。そりゃ重い。
あとTransparentのテクスチャへのDirectWriteによる書き込みがうまくいっていないような気がする。

VS2012+Win8SDKのDirect3D SampleでVSからは実行できるのに、exeを直接叩くと「アプリケーションを正しく起動できませんでした」

Visual Studio 2012+Windows 8 SDK用のオンラインサンプル「Direct3D Tutorial Win32 Sample」のプロジェクトを作成
構成をWin32→x64にしてビルド
VSからデバッグ・実行はできる。
しかし生成されたexeを直接実行すると
アプリケーションを正しく起動できませんでした(0xc000007b)になる

対処は
プロパティ→構成プロパティカスタムビルドステップ→全般→コマンドライン
copy /y "$(WindowsSdkDir)redist\d3d\x86\D3DCompile*.DLL" "$(TargetDir)"

copy /y "$(WindowsSdkDir)redist\d3d\x64\D3DCompile*.DLL" "$(TargetDir)"
に変更。

つまり32bit版のd3dcompiler_46.dllがコピられていたので起動できなかったということ。
Tutorial01はd3dcompiler_46.dllを使わないので、何もしなくてもそのまま実行できました。