シェーディングがオンになっている単純な立方体ジオメトリを正しく表示することに失敗しました。
これは C# コードですが、値は SlimDX を介して直接 C++ コードに渡されます。
pParams.BackBufferWidth = 0;
pParams.BackBufferHeight = 0;
pParams.BackBufferCount = 1;
pParams.BackBufferFormat = Format::X8R8G8B8;
pParams.Multisample = MultisampleType::None;
pParams.MultisampleQuality = 0;
pParams.DeviceWindowHandle = this.Handle;
pParams.Windowed = true;
pParams.AutoDepthStencilFormat = Format.D24X8;
pParams.EnableAutoDepthStencil = true;
pParams.PresentFlags = PresentFlags.None;
pParams.FullScreenRefreshRateInHertz = 0;
pParams.PresentationInterval = PresentInterval.Immediate;
pParams.SwapEffect = SwapEffect.Discard;
... は、Direct3D9Device オブジェクトを設定するために使用される PresentParameter 構造体の値です。
レンダリング中、SetRenderState は次のように呼び出されます。
this.D3DDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, this.BackColor, 10000.0f, 0);
this.D3DDevice.SetRenderState(RenderState.Ambient, false);
this.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
this.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
this.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.LessEqual);
this.D3DDevice.BeginScene();
繰り返しますが、これは C++ コードに渡され、C++ プログラマーが恐れることのない呼び出しに値をマーシャリングします。
プリミティブは拡散色の頂点です (D3DFVF_XYZ | D3DFVF_DIFFUSE)。ワイヤーフレーム ビューは次のように なります。
近い側にある大きな三角形のペアは、立方体の近い側の面です。
塗りつぶされたビューは次のようになります: フル ビュー 1 http://gallery.me.com/robert.perkins/100045/Z-fighting/web.jpg
または、これ以降のレンダリング コール: フル ビュー 2 http://gallery.me.com/robert.perkins/100045/zfight2/web.jpg
これを修正する方法がわかりません。どこから探し始めればよいですか?
編集: カメラ射影行列は、フレームの 1 つについて次のようになります。
{[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0]
[M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0]
[M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0]
[M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]}
そして、ビュー マトリックスは次のようになります。
camera.ViewMatrix = {[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0]
[M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0]
[M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0]
[M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]}