1

頂点レベルのグーロー シェーディングと az バッファーの使用の両方が存在する可能性があるため、PresentParameters と DirectX デバイスの正しいパラメーターを特定するのに苦労しています。正常に機能する三角形メッシュもあれば、カメラに近い三角形の前に背景三角形が表示されるものもあります。

この例は、http: //gallery.me.com/robert.perkins/100045/zBufferGoneにあります。入力データは、ファセット内の頂点の単純なリストです。各ファセットの頂点のワインディング順序は非決定論的であり (さまざまな CAD ソフトウェアのエクスポート機能に由来します)、法線データはありません。

現在、PresentParameters は次のように設定されています。これは C++ ではなく C# であることは認識していますが、十分に説明的であり、パラメーターは C++ コードに渡されます。これにより、図のイメージが生成されます。動作はリファレンス デバイスでも同じです。

             pParams = new PresentParameters()
                    {
                        BackBufferWidth = this.ClientSize.Width,
                        BackBufferHeight = this.ClientSize.Height,
                        AutoDepthStencilFormat = Format.D16,
                        EnableAutoDepthStencil = true,
                        SwapEffect = SwapEffect.Discard,
                        Windowed = true
                    };
            _engineDX9 = new EngineDX9(this, SlimDX.Direct3D9.DeviceType.Hardware, SlimDX.Direct3D9.CreateFlags.SoftwareVertexProcessing, pParams);

            _engineDX9.DefaultCamera.NearPlane = 0;
            _engineDX9.DefaultCamera.FarPlane = 10;
            _engineDX9.D3DDevice.SetRenderState(RenderState.Ambient, false);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.Always);
            _engineDX9.BackColor = Color.White;
            _engineDX9.FillMode = FillMode.Solid;
            _engineDX9.CullMode = Cull.None;

            _engineDX9.DefaultCamera.AspectRatio = (float)this.Width / this.Height;

他のすべてのセットアップ試行は、参照デバイスであっても、COM エラー コード ({"D3DERR_INVALIDCALL: 無効な呼び出し (-2005530516)"}) を返します。正しい設定パラメータは何ですか?

編集: DirectX9 とやり取りする C++ クラスは、次のようにデフォルトを設定します。

PresentParameters::PresentParameters()
{
    BackBufferWidth = 640;
    BackBufferHeight = 480;
    BackBufferFormat = Format::X8R8G8B8;
    BackBufferCount = 1;

    Multisample = MultisampleType::None;
    MultisampleQuality = 0;

    SwapEffect = SlimDX::Direct3D9::SwapEffect::Discard;
    DeviceWindowHandle = IntPtr::Zero;
    Windowed = true;
    EnableAutoDepthStencil = true;
    AutoDepthStencilFormat = Format::D24X8;
    PresentFlags = SlimDX::Direct3D9::PresentFlags::None;

    FullScreenRefreshRateInHertz = 0;
    PresentationInterval = PresentInterval::Immediate;
}
4

1 に答える 1

1

無効な呼び出しはどこで返されますか?

編集: 新しい EngineDX9 呼び出しで想定していますか? 現在のパラメータでデバイス ウィンドウ ハンドルを設定しようとしましたか?

編集 2: DirectX コントロール パネルでデバッグ スピューをオンにして、エラーの内容が表示されるかどうかを確認しましたか?

Edit3: backbufferWidth と Height を 0 に設定しようとしましたか? backbuffercount は何に設定されていますか? バックバッファで「Format.D24S8」を試してみる価値はありますか? グラフィックカードが16ビットをサポートしていない可能性があります(可能性は低いですが)。作成しようとしているモードが有効であることをキャップにチェックインしましたか? ところで、あなたが使用しているCLR言語は、あなたが設定していないパラメータを自動的に0に設定すると思いますか? 私は、個人的には、そのような場合は常に明示することを好みます....

PS私はCLR SlimDXコーダーではなくネイティブC++ DX9コーダーであるため、ここで推測しています...

Edit4: ウィンドウ ハンドルがないことは確かです...私はおそらく間違っていますが、セットアップで本当に間違っていることがわかるのはそれだけです。ウィンドウ付きの DX9 デバイスにはウィンドウが必要です。ところで、幅と高さを0に設定して、デバイスのサイズも設定しているウィンドウを使用します...

編集 5: 私は本当にここで間違ったルートに向かっています。「間違った」デバイスを作成したデバイスの作成に問題はありません。現在のパラメーターを台無しにしないでください。問題ありません。Z-バッファリングで問題が発生する主な理由は、比較機能を常に設定しているためです。これは、Z バッファーに何が含まれているかに関係なく、ピクセルを渡し、その Z を Z バッファーに書き込み、既存のものを上書きすることを意味します。Zバッファリングの問題がそこにあると思います。

于 2010-01-17T18:59:45.163 に答える