頂点レベルのグーロー シェーディングと 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;
}