none
Windowsストアアプリ(DirectX)で『D3D_FEATURE_LEVEL_9_1』の時のZバッファの指定方法が解りません RRS feed

  • 質問

  • 超初心者で申し訳ありません。

    開発環境は

    Windows8

    Visual Studio 2012 for Express

    です。

    Win8ストアアプリのDirectXを

    direct3d sprite sample で Googleで検索して(リンクが書き込めないのですみません) 

    Windows 8 Direct3D sprite sample in C++ for Visual Studio 2012

    をクリックして表示される

    http://code.msdn.microsoft.com/windowsapps/Direct3D-sprite-sample-97ae6262

    の隕石のサンプルで勉強させていただいています。

    私のやりたいことは、

    ダイレクトXのフィーチャーレベルを『D3D_FEATURE_LEVEL_9_1』に指定して、

    (D3D11CreateDeviceの指定で『D3D_FEATURE_LEVEL_9_1』を指定して)

    Zバッファを実現したいのです。

    いろいろ手をつくしているつもりなのですが、今の状態は

    Zバッファはできているようなのですが、3分位でデバイスロストが起きてしまいます。

    (最小変更の)再現方法は、

    SimpleSprites.cpp の Render() を

    void SimpleSprites::Render()
    {
        m_d3dContext->OMSetRenderTargets(
            1,
            m_d3dRenderTargetView.GetAddressOf(),
            m_d3dDepthStencilView.Get()
            );
        m_d3dContext->ClearDepthStencilView(m_d3dDepthStencilView.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0);

        m_d3dContext->ClearRenderTargetView(
            m_d3dRenderTargetView.Get(),
            reinterpret_cast<float*>(&D2D1::ColorF(D2D1::ColorF::MidnightBlue))
            );

        m_spriteBatch->Begin();

        // Draw the non-interactive asteroids.

        for (auto asteroid = m_asteroidData.begin(); asteroid != m_asteroidData.end(); asteroid++)
        {
            m_spriteBatch->Draw(
                m_asteroid.Get(),
                asteroid->pos,
                PositionUnits::DIPs,
                float2(1.0f, 1.0f) * asteroid->scale,
                SizeUnits::Normalized,
                float4(0.8f, 0.8f, 1.0f, 1.0f),
                asteroid->rot
                );
        }

        // Draw the interactive particles.

        for (auto particle = m_particleData.begin(); particle != m_particleData.begin() + m_numParticlesToDraw; particle++)
        {
            float alpha = length(particle->vel) / 200.0f;
            m_spriteBatch->Draw(
                m_particle.Get(),
                particle->pos,
                PositionUnits::DIPs,
                float2(32.0f, 32.0f),
                SizeUnits::DIPs,
                float4(0.1f, 0.02f, 0.0f, alpha),
                0.0f,
                BlendMode::Additive
                );
        }

        // Draw the background.

        m_spriteBatch->Draw(
            m_background.Get(),
            float2(0.5f, 0.5f),
            PositionUnits::Normalized,
            float2(1.0f, 1.0f),
            SizeUnits::Normalized
            );

        m_spriteBatch->End();

        // Render the Sample Overlay.

        m_sampleOverlay->Render();
    }

    に差し換えて下さい。

    この状態でDirectXBase.cpp の 103行目の

        D3D_FEATURE_LEVEL featureLevels[] =
        {
            D3D_FEATURE_LEVEL_11_1,
            D3D_FEATURE_LEVEL_11_0,
            D3D_FEATURE_LEVEL_10_1,
            D3D_FEATURE_LEVEL_10_0,
            D3D_FEATURE_LEVEL_9_3,
            D3D_FEATURE_LEVEL_9_2,
            D3D_FEATURE_LEVEL_9_1
        };

        D3D_FEATURE_LEVEL featureLevels[] =
        {
    //        D3D_FEATURE_LEVEL_11_1,
    //        D3D_FEATURE_LEVEL_11_0,
    //        D3D_FEATURE_LEVEL_10_1,
    //        D3D_FEATURE_LEVEL_10_0,
    //        D3D_FEATURE_LEVEL_9_3,
    //        D3D_FEATURE_LEVEL_9_2,
            D3D_FEATURE_LEVEL_9_1
        };

    に、コメントアウトすると3分以内にデバイスロストしてしまいます。

    (2つの火の玉が5回爆発するまでにロストします(4回目と五回目の間で起きます))

    『D3D_FEATURE_LEVEL_10_0』以上を指定するとデバイスロストは起きません。

    『D3D_FEATURE_LEVEL_9_1』を指定した状態でZバッファはどのように指定すればよろしいのでしょうか?

    よろしくお願いいたします。

    2013年4月11日 7:17