影が真っ黒になる問題がありましたが、結局原因は解らず諦めました。
Specularの計算中powを使うのですが、これの結果がやたらとマイナスの値になるため、
最終的に合算した色が真っ黒になるようです。
ただ、powに渡している引数を何度確認してもそんな結果になるはずはなく、
コンパイラかドライバの問題ではないだろうか・・・と思います。
if文で切ったりすると、powの累乗数の方に渡している変数が0でおかしくなっているような気がするのですが、
0を直接書くと正常に動いたりするのでもうわけわからんです。
powの累乗数に0を指定すると不正なのでコンパイラが関数ごとカットしていたりするのかもしれません。
コンパイル後のバイトコードを確認すればわかるかもしれませんが日曜プログラマがそこまで出来るわけありません。
とりあえず回避は出来るのでそれで良しとしました。正常に表示されています。
次に気になるのは髪の毛ですね。消えてしまっています。
これはカリングのせいでしょう。MMDはカリングを無効化する必要があるようです。
Direct3D 11でカリングを設定する方法ですが、
Direct3D 9のように、SetRenderStateで設定してはい終わり。というわけには行きません。
次の手順が必要です。
- D3D11_RASTERIZER_DESCにラスタライザの設定を入れる
- D3D11_RASTERIZER_DESCをID3D11Device.CreateRasterizerStateに渡してID3D11RasterizerStateを生成
- ID3D11DeviceContext.RSSetStateにID3D11RasterizerStateをセット
- ID3D11RasterizerStateは終了時にReleaseを忘れずに
超面倒くさいです。
予めID3D11RasterizerStateを複数生成しておいて、切り替えて使用することを想定した実装なのでしょうが、
ちょいとカリング設定すっか!というノリで調べ始めたボクはくじけそうです。
今回はカリング無しに設定しました。
1 | D3D11_RASTERIZER_DESC rasterizerDesc; |
---|---|
2 | rasterizerDesc.FillMode = D3D11_FILL_MODE.D3D11_FILL_SOLID; |
3 | rasterizerDesc.CullMode = D3D11_CULL_MODE.D3D11_CULL_NONE; |
4 | rasterizerDesc.DepthClipEnable = FALSE; |
5 | rasterizerDesc.MultisampleEnable = FALSE; |
6 | rasterizerDesc.DepthBiasClamp = 0; |
7 | rasterizerDesc.SlopeScaledDepthBias = 0; |
裏面がレンダリングされるようになったため、髪の毛が表示されています。